我想将第一个文件的每一行与第二个文件的全部内容进行比较,并打印匹配的结果。 我正在使用这个代码,但它来到了其他部分而没有给我结果。 我的文件是这样的
file1 - store.txt file2 - data.txt
1,CNB,1234 1001,1234
2,NCD,1567 1002,1345
3,ABC,1111 1003,1111
etc etc etc etc
我希望结果是
CNB, 1234
ABC, 1111
这是我写的代码:
String y = ",", z = ";";
File file1 = new File("store.txt");
File file2 = new File("data.txt");
BufferedReader bfr = new BufferedReader(new FileReader(file1));
BufferedReader bfr1 = new BufferedReader(new FileReader(file2));
String name1;
String name2;
String[] f1, f2;
try{
while (bfr1.readLine() != null && bfr.readLine() != null)
{
name1 = bfr.readLine();
name2 = bfr1.readLine();
f1 = name1.split(y);
f2 = name2.split(z);
if (f1[1].equals(f2[1]))
{
//System.out.println(f1[0] + f1[1]);
for(int i=0; i < 1000;i++) {
name1 = bfr.readLine();
name2 = bfr1.readLine();
System.out.println(f1[0] + " \t here");
}
//System.out.println(f1[0] + " \t here");
// System.out.println(s1);
}
else
{
System.out.println("Not equal");
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
谢谢大家的帮助! :)
答案 0 :(得分:1)
您的代码可以进行大量优化,因为其他海报已经说过,您的嵌套迭代不会跟踪先前的迭代。您需要的“获取线”的数量会随着行数的增加而增加指数,这实际上并不是很好。
还有一个逻辑错误,因为这个比较错误f1[1].equals(f2[1])
;根据您的预期结果,我假设您要比较f1[2].equals(f2[1])
这里的好消息是你可以使用两个哈希映射来存储两次迭代的结果,然后只需迭代一次就可以得到你的结果。
这是代码,我没有对它进行测试,但它应该可以工作:
private void compareFiles() {
BufferedReader bfr1 = null;
BufferedReader bfr = null;
String split = ",";
HashMap<String, String> fileCache1 = new HashMap<String, String>();
HashMap<String, String> fileCache2 = new HashMap<String, String>();
try {
File file1 = new File("store.txt");
File file2 = new File("data.txt");
bfr = new BufferedReader(new FileReader(file1));
bfr1 = new BufferedReader(new FileReader(file2));
String name1;
String name2;
String[] f1;
String[] f2;
try {
// read the first file and store it in an Hashmap (first column ignored)
while (bfr.readLine() != null) {
name1 = bfr.readLine();
f1 = name1.split(split);
fileCache1.put(f1[2], f1[1]);
}
// read the second file and store it in an Hashmap (second column useless?)
while (bfr1.readLine() != null) {
name2 = bfr1.readLine();
f2 = name2.split(split);
fileCache2.put(f2[1], f2[0]); // f2[0] is useless i think
}
// iterate once over the first hashmap and compare with the second.
for (String key1 : fileCache1.values()){
if(fileCache2.containsKey(key1)){ // here is your desired match
System.out.println(fileCache1.get(key1)+", "+key1); // print or do whatever you want
}
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (FileNotFoundException ex) {
Logger.getLogger(SO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
bfr1.close();
} catch (IOException ex) {
Logger.getLogger(SO.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
答案 1 :(得分:0)
你的主要问题是你从每个文件中读取了很多次。你在while循环中读取,然后你扔掉它再读一遍。此外,每次从第一个文件中读取时,您也会从第二个文件中读取。
您想要从第二个文件中读取一次并记住该结果。
你想在循环中每次读取第一个文件一次。
例如:
name1 = bfr.readLine();
name2 = bfr2.readLine();
while (name1 != null) {
// Do stuff with name1 and name2
name1 = bfr.readLine();
}
答案 2 :(得分:0)
你的if条件应该是这样的
//f1[2] = 1234 and f2[1] = 1234
if (f1[2].equals(f2[1]))
{
// Write your logic here
}