我有如下文本文件
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之间的行作为记录。
2条答案
按热度按时间u3r8eeie1#
解决问题通常是关于创建有用的抽象,你仍然处在一个你认为你必须做“低层次”事情的点上:你的代码从文件中读取一行;就在那里,你开始处理它
所以,让我们退后一步,试着站在“更高的地方”:
首先,所有“有趣”的行都是以6220开头的吗?或者是这些行有特定格式的点;告诉你一个新的记录开始了?你看,这是非常重要的;因为如果后者为真,则不会查找以6220开头的行;但是对于具有“记录从这里开始”或“记录从这里结束”格式的行。
下一个问题是:其他行应该怎么办?!它们应该被忽略吗?还是要做其他的处理
那么,记忆力在这里是一种限制吗?简单地读取整个文件是否是个好主意;并在做任何处理之前将其保存在内存中?或者这是一个非常大的文件;如此之大,以至于在您的环境中最好不要将整个内容读入内存?
你看,你的问题缺少所有这些信息;严肃地说:如果你试图用一个问题(或答案)来解决所有这些问题,事情就会变得不成比例。
但是让我给予你一些代码来开始。
重点是:你必须以某种方式收集属于一起的行。我在这里使用了一个简单的列表;然后您只需传递该列表以便处理该记录的数据(当然,你不应该忘记清除“缓冲区”;因为您可能会开始收集下一个)。请注意:当然这不是最终的解决方案,它应该只是给予你一个想法如何从这里继续下去。这样的事情实际上可能是相当复杂的得到正确的。而且,你看;实际上那还是一个很“低级”的实现,所以“OO设计明智”还有很大的改进空间。
希望能有所帮助。但如前所述:在您进一步参与编程之前;你最好把你的要求说清楚。你应该坐下;和你周围的人交谈真正理解如何/在该文件中处理什么。如果你不这样做;很有可能今天实现的任何东西明天都不够好。
vktxenjb2#
你可以用Reader读取这些行,然后用lambda过滤它们,如下所示:
然后相应地处理行列表。