我的文本文件如下
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之间的行作为记录。
答案 0 :(得分:1)
解决问题通常是创建有用的抽象。你仍然处于这样一种程度,你认为你必须处理事情"低级别":你的代码从文件中读取一行;就在那里,你开始处理它。
所以,让我们退后一步,尝试继续前进"
首先,做所有"有趣的"线条从6220开始?或者说这些行具有特定的格式;告诉你新记录开始了?你看,这非常重要;因为如果后者是真的,你不要寻找以6220开头的线;但是对于格式为&#34的行;记录从这里开始" RESP。 "记录在此结束"。
接下来的问题是:其他行会发生什么?!他们应该被忽视;或者你还要做其他处理吗?
然后:记忆是一个约束吗?含义:简单地阅读完整的文件是个好主意;并在进行任何处理之前将其保留在内存中?或者这是一个非常大的文件;如此之大,在您的环境中,您最好不要将整个内容读入内存?
你知道,你的问题缺乏所有这些信息;并且认真地说:如果你试图在一个问题(或者是答案)中解决所有这些问题,事情会变得不成比例。
但是,让我给你一些代码来开始。
// 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();
}
}
重点是:你必须以某种方式收集属于一起的行。我在这里使用一个简单的列表;然后你只是传递那个列表来处理那条记录的数据(当然;你不应该忘记清除那个&#34;缓冲区&#34;;因为你可能会开始收集下一个记录)。请注意:当然这不是最终的解决方案;它应该只是让你知道如何从这里继续。这样的事情实际上可能非常复杂。而且,你看,;实际上,这仍然是一个非常低级别的&#34;实施;所以还有很大的改进空间,并且可以设计出明智的设计。
希望有所帮助。但正如所说:在你进一步参与编程之前;您最好澄清要求。你应该坐下来;并与周围的人交谈;真正了解该文件中的处理方式/内容。如果你不这样做;很有可能,无论你今天要实施什么,明天都不会再好了。