我写了这个程序来比较2个文件。它们的尺寸为500mb到2.8gb,每6小时创建一次。我有来自2个来源(NMD和XMP)的2个文件。它们被分解为具有由管道(|)字符分隔的字段的文本行。每行是一条记录,最长可达65,000个字符。数据与电视节目和电影有关,显示时间和描述性内容。我已经确定任何特定节目或电影至少有3个数据可以唯一地标识该节目或电影。 IE:CallSign,ProgramId和StartLong。这个数据的两个来源是称为NMD和XMP的系统,因此该缩写词添加到各种变量中。所以我的目标是比较NMD创建的文件和XMP创建的文件,并确认NMD生成的所有内容也是由XMP生成的,并且每个匹配记录中的数据是相同的。
我想在这里完成的是: 1.按记录读取3个唯一数据字段的NMD文件记录。 2.按记录读取XMP文件记录,并查找NMD文件中当前记录的匹配项。 3. NMD文件应该一次迭代一条记录。然后应在整个XMD文件中搜索每个NMD记录,记录该记录的相同记录。 4.在2个文件中的一个中写入一个日志条目,指示成功或失败以及该数据是什么。
正在发生的事情是每个文件中的第一条记录被读取,但之后没有记录被读取。结果,两个文件都没有到达,也没有找到任何匹配。我的success.log和failure.log文件从不显示其中的任何数据。在外部do / while循环中,System.out显示单行文本。 IE:文件中的第一条记录。在内部do / while循环中,System.out一遍又一遍地打印相同的数据,这些数据也来自文件中的第一个记录。是不是证明程序没有通过两个源文件按记录迭代?
所以在实际代码上......
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 :(得分:0)
do {
readXMP = new BufferedReader(new FileReader("d:testdataXMP.txt"));
你确定你想要循环吗?你一遍又一遍地打开同一个文件。
答案 1 :(得分: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所说的那样,你多次打开文件。您只需要确保阅读器/流媒体是开放的,并根据需要进行迭代,然后关闭它。