我有一个大文本文件,我需要逐行检查并相应地修改。我正在寻找的是以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。
答案 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)