java 根据起始前缀阅读文本文件中的多行作为记录并处理

abithluo  于 2023-01-11  发布在  Java
关注(0)|答案(2)|浏览(116)

我有如下文本文件

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之间的行作为记录。

u3r8eeie

u3r8eeie1#

解决问题通常是关于创建有用的抽象,你仍然处在一个你认为你必须做“低层次”事情的点上:你的代码从文件中读取一行;就在那里,你开始处理它
所以,让我们退后一步,试着站在“更高的地方”:
首先,所有“有趣”的行都是以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设计明智”还有很大的改进空间。
希望能有所帮助。但如前所述:在您进一步参与编程之前;你最好把你的要求说清楚。你应该坐下;和你周围的人交谈真正理解如何/在该文件中处理什么。如果你不这样做;很有可能今天实现的任何东西明天都不够好。

vktxenjb

vktxenjb2#

你可以用Reader读取这些行,然后用lambda过滤它们,如下所示:

BufferedReader reader = new BufferedReader(new InputStreamReader(stream, encoding));
return reader.lines().filter(line -> line.startsWith("6220 ")).collect(Collectors.toList());

然后相应地处理行列表。

相关问题