それぞれが同一の構造を持つ 2 つの大きなデータ ファイルの違いを分析する必要があります。各ファイルのサイズは数ギガバイトで、おそらく 3,000 万行またはテキスト データがあります。データ ファイルは非常に大きいので、行を順番に繰り返し処理する方が簡単な場合でも、それぞれを独自の配列にロードすることを躊躇します。各行の構造は次のとおりです。
topicIdx, recordIdx, other fields...
topicIdx と recordIdx はシーケンシャルで、ゼロから始まり、反復ごとに +1 ずつ増加するため、ファイル内で簡単に見つけることができます。(検索する必要はありません。順番に前にインクリメントするだけです)。
私は次のようなことをする必要があります:
for each line in fileA
store line in String itemsA
get topicIdx and recordIdx
find line in fileB with same topicIdx and recordIdx
if exists
store this line in string itemsB
for each item in itemsA
compare value with same index in itemsB
if these two items are not virtually equal
//do something
else
//do something else
FileReader と BufferedReader を使用して次のコードを書きましたが、これらの API は必要な機能を提供していないようです。以下のコードを修正して、私が望むことを達成する方法を誰かに教えてもらえますか?
void checkData(){
FileReader FileReaderA;
FileReader FileReaderB;
int topicIdx = 0;
int recordIdx = 0;
try {
int numLines = 0;
FileReaderA = new FileReader("B:\\mypath\\fileA.txt");
FileReaderB = new FileReader("B:\\mypath\\fileB.txt");
BufferedReader readerA = new BufferedReader(FileReaderA);
BufferedReader readerB = new BufferedReader(FileReaderB);
String lineA = null;
while ((lineA = readerA.readLine()) != null) {
if (lineA != null && !lineA.isEmpty()) {
List<String> itemsA = Arrays.asList(lineA.split("\\s*,\\s*"));
topicIdx = Integer.parseInt(itemsA.get(0));
recordIdx = Integer.parseInt(itemsA.get(1));
String lineB = null;
//lineB = readerB.readLine();//i know this syntax is wrong
setB = rows from FileReaderB where itemsB.get(0).equals(itemsA.get(0));
for each lineB in setB{
List<String> itemsB = Arrays.asList(lineB.split("\\s*,\\s*"));
for(int m = 0;m<itemsB.size();m++){}
for(int j=0;j<itemsA.size();j++){
double myDblA = Double.parseDouble(itemsA.get(j));
double myDblB = Double.parseDouble(itemsB.get(j));
if(Math.abs(myDblA-myDblB)>0.0001){
//do something
}
}
}
}
readerA.close();
} catch (IOException e) {e.printStackTrace();}
}