根据作为记录的起始前缀从文本文件中读取多行,然后对其进行处理

时间:2016-08-12 05:11:08

标签: java

我的文本文件如下

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

1 个答案:

答案 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;实施;所以还有很大的改进空间,并且可以设计出明智的设计。

希望有所帮助。但正如所说:在你进一步参与编程之前;您最好澄清要求。你应该坐下来;并与周围的人交谈;真正了解该文件中的处理方式/内容。如果你不这样做;很有可能,无论你今天要实施什么,明天都不会再好了。