将第一个文件中的每一行与java中第二个文件的全部内容进行比较

时间:2014-01-31 07:13:47

标签: java file compare

我想将第一个文件的每一行与第二个文件的全部内容进行比较,并打印匹配的结果。 我正在使用这个代码,但它来到了其他部分而没有给我结果。 我的文件是这样的

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();
        }
}
}

谢谢大家的帮助! :)

3 个答案:

答案 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
  }