2017-07-19 4 views
0

私は2つのファイルを比較するためにこのプログラムを書いています。彼らは500メガバイト〜2.8ギガバイトのサイズで、6時間ごとに作成されます。私は2つのソース(NMDとXMP)から2つのファイルを持っています。それらは、パイプ(|)文字で区切られたフィールドを持つテキスト行に分割されます。各行は単一のレコードで、最大65,000文字まで可能です。このデータは、テレビ番組や映画に関するもので、時間と説明的な内容を示しています。私は、特定のショーや映画には、そのショーや映画を一意に識別するデータが最低3つあると判断しました。 IE:CallSign、ProgramId、StartLong。このデータの2つのソースは、NMDとXMPと呼ばれるシステムで、さまざまな変数に頭字語が追加されています。ですから、私の目標は、NMDによって作成されたファイルとXMPで作成されたファイルを比較し、NMDが生成するすべてがXMPによって生成され、一致する各レコードのデータが同じであることを確認することです。私のプログラムはファイルの最初のレコードだけを読み込むのはなぜですか?

私がここで達成しようとしていることは次のとおりです。 1. 3つの一意のデータフィールドのレコードでNMDファイルレコードを読み取ります。 2.レコードごとにXMPファイルレコードを読み取り、NMDファイル内の現在のレコードと一致するレコードを探します。 3. NMDファイルは一度に1つのレコードを反復する必要があります。各NMDレコードは、XMDファイル全体で検索され、同じレコードのレコードごとにレコードされます。 4.成功または失敗を示す2つのファイルのいずれかにログエントリを書き込み、そのデータは何であったか。

それぞれのファイルの最初のレコードが読み取られますが、それ以降のレコードは読み取られません。結果として、どちらのファイルの終わりにも到達せず、一致が見つからない。私のsuccess.logファイルとfailure.logファイルは決してそれらのデータを表示しません。外側のdo/whileループでは、System.outは1行のテキストを表示します。 IE:ファイルの最初のレコード。内側のdo/whileループでは、System.outはファイル内の最初のレコードから何度も何度も同じデータを繰り返し出力します。このプログラムは、2つのソースファイルを通してレコードごとにレコードを反復しないという証拠ではありませんか?実際のコードへ

そう

...

import java.io.*; 

public class FileParse { 

    public static void main(String[] args) throws java.io.IOException { 

     String epgsRecordNMD = null; 
     String epgsRecordXMP = null; 
     BufferedWriter logSuccessWriter = null; 
     BufferedWriter logFailureWriter = null; 
     BufferedReader readXMP = null; 
     BufferedReader readNMD = null; 

     readNMD = new BufferedReader(new FileReader("d:testdataNMD.txt")); 

      do { 

       epgsRecordNMD = readNMD.readLine(); 
       String[] epgsSplitNMD = epgsRecordNMD.split("\\|"); 
       String epgsCallSignNMD = epgsSplitNMD[0]; 
       String epgsProgramIdNMD = epgsSplitNMD[2]; 
       String epgsStartLongNMD = epgsSplitNMD[9]; 
       System.out.println("epgsCallsignNMD: " + epgsCallSignNMD + " epgsProgramIdNMD: " + epgsProgramIdNMD + " epgsStartLongNMD: " + epgsStartLongNMD); 


        do { 

         readXMP = new BufferedReader(new FileReader("d:testdataXMP.txt")); 
         epgsRecordXMP = readXMP.readLine(); 
         String[] epgsSplitXMP = epgsRecordXMP.split("\\|"); 
         String epgsCallSignXMP = epgsSplitXMP[0]; 
         String epgsProgramIdXMP = epgsSplitXMP[2]; 
         String epgsStartLongXMP = epgsSplitXMP[9]; 
         System.out.println("epgsCallsignXMP: " + epgsCallSignXMP + " epgsProgramIdXMP: " + epgsProgramIdXMP + " epgsStartLongXMP: " + epgsStartLongXMP); 


         if (epgsCallSignXMP.equals(epgsCallSignNMD) && epgsProgramIdXMP.equals(epgsProgramIdNMD) && epgsStartLongXMP.equals(epgsStartLongNMD)) { 
          logSuccessWriter = new BufferedWriter (new FileWriter("d:success.log", true)); 
          logSuccessWriter.write("NMD match found in XMP" + "epgsCallsignNMD: " + epgsCallSignNMD + " epgsProgramIdNMD: " + epgsProgramIdNMD + " epgsStartLongNMD: " + epgsStartLongNMD); 
          logSuccessWriter.write("\n"); 
          logSuccessWriter.close(); 
          System.out.println ("Match found"); 

         } 

        } while (epgsRecordXMP != null); 

         logFailureWriter = new BufferedWriter (new FileWriter("d:failure.log", true)); 
          logFailureWriter.write("NMD match not found in XMP" + "epgsCallsignNMD: " + epgsCallSignNMD + " epgsProgramIdNMD: " + epgsProgramIdNMD + " epgsStartLongNMD: " + epgsStartLongNMD); 
          logFailureWriter.write("\n"); 
          logFailureWriter.close(); 
          System.out.println ("Match NOT found"); 

      } while (epgsRecordNMD != null); 
      readNMD.close(); 
      readXMP.close(); 

     } 
    } 
+0

私はただ今問題があったことに気付きました。私の2番目のdo/whileループの中に私はこのコマンドを持っています:readXMP = new BufferedReader(新しいFileReader( "d:testdataXMP.txt"));これにより、testdataXMP.txtファイルが何度も繰り返し開くため、レコードは反復されません。この行をreadNMD行のすぐ下に移動しました。 – JavaNoob

+0

これは無料のデバッグサービスではありません。 – Raedwald

+0

[デバッガとは何ですか?また、どのようにして問題を診断するのに役立ちますか?](https://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can-it-help-私が診断した問題) – Raedwald

答えて

0
do { 

    readXMP = new BufferedReader(new FileReader("d:testdataXMP.txt")); 

あなたは必ずこのループにしたいですか?あなたは同じファイルを何度も何度も開いています。

+0

私が書いたものを参照してください...いいえ、私はいません – JavaNoob

+0

今はtestdataXMP.txtのレコードを繰り返し処理していますが、最後のレコードが読み込まれるとNPEを取得します。外側のdo/whileループがtestdataNMD.txtファイルの次のレコードに反復処理しないのはなぜですか? success.logには、私が期待したマッチが表示されます。外部do/whileループが "ループ"していないので、failure.logはまだ空です。 – JavaNoob

+0

私の両方のtestdataファイルには、一致しないレコードがあります。私はそれらの失敗を見たい。 – JavaNoob

0

なぜこのようなことをしないのですか?

BufferedReader br = new BufferedReader(new FileReader("whateverfile.dat")); 
BufferedReader br2 = new BufferedReader(new FileReader("whateverfile2.dat")); 
String data; 
String data2; 

while(data = br.readLine() != null) 
{ 
    // do whatever you want, for example found 3 unique records 

    while(data2 = br2.readLine() != null) 
    { 
     // do whatever you want 
    } 
} 

OldProgrammerと同じように、ファイルを複数回開いています。リーダ/ストリーマが開いていることを確認し、必要なものを繰り返して閉じます。

+0

私はJavaに本当に新しいです...これは私の3回目のプログラムです(こんにちはの世界を含む)。私は27年後に何も書いていないので、自由に私を修正してください...私はより良い。 – JavaNoob

+0

私はwhileループを試しましたが、while文の条件を取得するためにループの外にreadLineが必要でしたが、それは各レコードを繰り返すことができませんでした。だから、私はdoLineに行きました。なぜなら、readLineがループ内にあるからです。 – JavaNoob

+0

その2番目のfileReaderステートメントが私を見つめていましたが、スレッドを投稿するまで間違った場所にいることはわかりませんでした。私はそれを見つめて、プログラムのステップを精神的に100回行ったことがあります。 – JavaNoob

関連する問題