2015-07-08 3 views
0

У меня есть большой текстовый файл, который мне нужно проверить по строкам и соответствующим образом изменить. Я ищу строки, начинающиеся с DTP * 348 * D8 * yyyymmdd (yyyymmdd будет заполняться фактическими датами в файле). Если линия попадает между строками REF * 1L * 0002 и REF * 1L * 0011, я хочу, чтобы все даты до 20140601 были изменены до 20140601 (любые даты позже 20140601 должны быть оставлены в покое). Таким образом, DTP * 348 * D8 * 20090605 станет DTP * 348 * D8 * 20140601.C#/RegEx - изменить строки в текстовом файле

Линии между REF * 1L * 0011 и REF * 1L * 0030 Я хотел бы, чтобы даты до 20140701 были изменены до 20140701, а все остальное осталось в покое. Таким образом, DTP * 348 * D8 * 20140605 станет DTP * 348 * D8 * 20140701.

Строки линии REF * 1L * xxxx встречаются несколько раз по всему файлу, но они не смешиваются. Например, как только будет достигнут первый экземпляр REF * 1L * 0011, REF * 1L * 0002 больше не будет отображаться в файле, и как только линия REF * 1L * 0030 будет достигнута, ни REF * 1L * 0002, ни REF * 1L * 0011 снова появится в файле.

Я просто смутил себя этим. Надеюсь, это имеет смысл!

EDIT: Ниже приведен пример содержимого файла.

REF*1L*0002 
REF*DX*100A 
REF*ZZ*00 
DTP*336*D8*19990816 
NM1*IL*1*XXXX*XXXXX****34*XXXXXXXX 
PER*IP**TE*XXXXXXXXXX 
N3*XXXXX XXXXX XXX 
N4*XXXXX*XX*XXXXX 
DMG*D8*19760910*F*I 
HD*030**HLT*0002XXX01*XXX 
DTP*348*D8*20150601 (*This is the line I want to edit*) 
INS*N*19*030**A 
REF*0F*XXXXXX 
REF*1L*0011 

(Остальная часть файла содержит строки, похожие на приведенные выше, повторяющиеся). Тип файла, с которым я работаю, называется EDI 834, если это помогает.

+1

Что вы хотите сказать? –

+0

Мой вопрос: как я могу выполнить то, что я описал выше, используя C# Regex.Replace? (Я предполагаю, что это то, что я буду использовать, если не будет лучшего способа). Например, я использую аналогичный подход в менее сложном файле: 'File.WriteAllText (fn, Regex.Replace (File.ReadAllText (fn), @" DTP \ * 348 \ * D8 \ * 201 [0-9] [0-9] [0-9] [0-9] [0-9] "," DTP * 348 * D8 * 20150701 "));' –

+0

Можете ли вы предоставить образец файла в своем вопросе , поэтому мы можем видеть формат строк? – Shar1er80

ответ

1

Я не владеют достаточно в регулярных выражениях, чтобы попытаться помочь вам достичь это тот путь, но так как вы сказали, что это не является обязательным требованием, здесь это .NET Fiddle, который выполняет то, что вы пытаетесь сделать.

В основном, он проходит по одной линии за раз, если он попадает в строку, начинающуюся с DTP*348, тогда она будет анализировать дату. Если дата меньше 20140601, она заменит дату на 20140601.

Пример просто использует статический текст, но вы можете легко адаптировать концепцию к чтению в текстовом файле и записи в текстовый файл.

+0

Я попробую! Спасибо! –

+0

Я получаю сообщение об ошибке после изменения кода. Поскольку вы уже ответили на этот вопрос, должен ли я создать новый вопрос с проблемой кода? Не уверен, как обычно делаются на этом сайте :-) –

+1

Вы поняли? Дайте мне знать, если у вас все еще есть проблемы, и я постараюсь помочь. –

0

О дате вы можете использовать этот

File.WriteAllText(fn, Regex.Replace(File.ReadAllText(fn), 
    @"(201[0-3][0-9][0-9][0-9][0-9]|2014[0-6][0-9][0-9][0-9])", 
    "20140701")); 

Не ясно, что это диапазон REF * 1L * 0011 для REF * 1L * 0030. Если необходимо включать все цифры от 0011 до 0030 регулярное выражение

REF\*1L\*(001[1-9]|002[0-9]|0030) 
+0

Вопрос касается только даты в сегменте 'DTP', я думаю. –

+0

@ dubstylee Да, это единственный сегмент, который я хочу изменить (если необходимо). –

Смежные вопросы