我有如下文本文件
6200MIGS Draft Capture 001527160719256
622001004987654321098769 2030000000002385250000000000000000000000000719024031629498071912403119100719301201208620112629498 00QFCBA003353109297315583010 036000000190 100 000000 SHOEBRIDGE/DANIEL T MR VI50 0818950138744 600110190
6221QANTAS AIR AUSTRALIA 036 T
6223 0000000000000000000
6229SHOEBRIDGE/DANIEL T MR 0818950138744 QF YNOGVJ 15022602300045 -00000238525000000000000000000000000005
62301702281700BNE MEL QF H XHLFEU 631 000000000000000000000000000000000000
62311702282335MEL DXB QF H XHLFEU 9 000000000000000000000000000000000000
62321703011450DXB LYS QF H OHLFEU 8081 000000000000000000000000000000000000
62331703082115CDG DXB QF O XOLREU1 8076 0818950138745 000000000000000000000000000000000000
62341703091025DXB BNE QF O OLREU1 8434 0818950138745 000000000000000000000000000000000000
622001005123456789012346 2030000000000575650000000000000000000000000719024031629499071912403117080719301201208620112629499 00QFCBA003353109297315583000 036000000190 100 000000 DETTMAN/GLEN MR CA50 0818950138719 600110190
6221QANTAS AIR AUSTRALIA 036 T
6222 0719 000
6229DETTMAN/GLEN MR 0818950138719 QF YYUGBM 15022602300045 -00000057565000000000000000000000000002
62301703151800MEL SYD QF L OLPTSCN01 458 000000000000000000000000000000000000
62311703251830SYD MEL QF M MPTSCN01 463 000000000000000000000000000000000000
我想读取从 6220 开始到下一个 6220 的所有行,在我的情况下,这些行是 2-9,我将其称为记录。然后我想根据起始前缀处理记录中的每一行,例如,如果它以 6223 开头,我将提取我需要的数据。我的问题是如何将这些行作为记录读取然后单独处理。
将标记和重置会有所帮助。提前致谢。到目前为止,我拥有的代码是
File infile = new File("C:\\Data\\Everyday work\\tmp\\CBRF.GEN4_FILE.20160719.txt");
File outfile = new File("C:\\Data\\Everyday work\\tmp\\CBRF.GEN4_FILE.20160719.txt-DCFOUT.txt");
FileReader reader;
Scanner scanner;
public void output() {
try {
FileWriter writer = new FileWriter(outfile);
reader = new FileReader(infile);
BufferedReader br = new BufferedReader(reader);
String str;
BufferedWriter bw = new BufferedWriter(writer);
bw.flush();
while ((str = br.readLine() )!= null) {
scanner = new Scanner(str);
String line = scanner.nextLine();
if (line.startsWith("6220", 0)) {
recordtype = line.substring(0, 4);
msgrtypId = line.substring(4, 8);
}
}
}
在这里,我可以逐行读取我想要实现的是读取行前缀 6220 和下一行前缀 6220 之间的行作为记录。
解决问题通常是关于创建有用的抽象。您仍然认为您必须进行“低级别”操作:您的代码从文件中读取一行;就在那里,你开始处理它。
所以,让我们退后一步,尝试进入“更高的地步”:
首先,所有“有趣”的行都是以 6220 开头的吗?或者是这些行具有特定格式的点;这告诉你新的记录开始了?你看,这很重要;因为如果后者为真,你就不用寻找以 6220 开头的行;但是对于具有“记录从此处开始”格式的行。“记录到此结束”。
下一个问题是:其他线路应该怎么办?!他们是否应该被忽略;或者你必须做其他处理吗?
那么:内存是这里的约束吗?意思是:简单地阅读完整的文件是个好主意吗?并在进行任何处理之前将其保存在内存中?或者这是一个非常大的文件;如此之大,以至于在您的环境中,您最好不要将整个内容读入内存?
你看,你的问题缺少所有这些信息;并且严肃地说:如果您试图解决所有这些问题(或答案),事情就会变得不成比例。
但是让我给你一些代码来开始。
// before your loop starts
boolean currentlyParsingRecord = false;
boolean List<String> rawRecordLines = new ArrayList<>();
// within your loop
String line = scanner.nextLine();
if (currentlyParsingRecord) {
if (line.startsWith("6220)) {
currentlyParsingRecord = false;
}
rawRecordLines.add(line);
} else {
if (line.startsWith("6220)) {
currentlyParsingRecord = true;
rawRecordLines.add(line);
// and now, maybe you are calling a method like
processRecordLines(rawRecordLines);
// and then you clear your "buffer"
rawRecordLines.clear();
}
}
关键是:你必须以某种方式收集属于一起的线条。我在这里使用了一个简单的列表;然后您只需传递该列表以处理该记录的数据(当然;您不应该忘记清除该“缓冲区”;因为您可能会开始收集下一个)。请注意:当然这不是最终的解决方案;它应该只是让你知道如何从这里开始。这些事情实际上可能非常复杂。而且,你看;实际上这仍然是一个非常“低级”的实现;所以“OO设计明智”还有很大的改进空间。
希望有帮助。但正如所说:在你进一步从事编程之前;你最好澄清你的要求。你应该坐下;和你周围的人交谈;真正了解如何/在该文件中处理什么。如果你不这样做;很有可能你今天实施的任何东西明天都不够好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句