C#/ RegEx - 修改文本文件中的行

时间:2015-07-08 15:31:22

标签: c# regex

我有一个大文本文件,我需要逐行检查并相应地修改。我正在寻找的是以DTP * 348 * D8 * yyyymmdd开头的行(yyyymmdd将填充文件中的实际日期)。如果线在REF * 1L * 0002和REF * 1L * 0011之间,我希望20140601之前的所有日期都更改为20140601(任何晚于20140601的日期都应该保留)。所以DTP * 348 * D8 * 20090605将成为DTP * 348 * D8 * 20140601。

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将再次出现在文件中。

我只是把自己弄糊涂了。希望它有一定意义!

编辑:这是文件内容的示例。

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

2 个答案:

答案 0 :(得分:1)

我对正则表达式的熟练程度不足以帮助你以这种方式实现它,但由于你说这不是一个要求,所以这里有.NET Fiddle来完成你想要做的事情。

基本上,它一次循环一行,如果它遇到以 public class marry { public static void main(String [] args) { int weight = 150; int age = 24; int height = 71; boolean isASmoker = false; boolean isMale = true; boolean isGoodLooking = true; boolean isAbleToRelocate = true; if ( ( ( weight < 160 && ( age <= 27 && age >= 22 ) ) && ( ( height < 72 ) && ( ( isASmoker == false ) && ( isMale) ) ) && ( ( isGoodLooking ) && ( isAbleToRelocate ) ) ) ) { System.out.println("Marry Me!"); } else { System.out.println("Get Lost!"); } } } 开头的行,那么它将解析出日期。如果日期小于20140601,它将用20140601替换日期。

该示例仅使用静态文本,但您可以轻松地将概念调整为在文本文件中读取并写回文本文件。

答案 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)