首页 > 解决方案 > CSV 到 CSV 比较实用程序

问题描述

我正在做一个项目,我需要比较 2 个 CSV 是否相等。它只是每个 CSV 中的一行,具有多列,并以不同的列名称和值的形式报告差异。例如:

CSV 1 : 
Name   Roll No  Dept
Brij   1        IT

CSV 2 :
Name   Roll No  Dept
Brij   2        IT

I need to report the diff as 
Roll No 1 does not match Roll No 2 i.e. Col name and value in both csvs

My work till now : 
@Test
    public void f() {
        try {
            FileReader reader1 = new FileReader(
                    new File(System.getProperty("user.dir") + "\\src\\test\\resources\\csvFile\\Reader.csv"));
            FileReader reader2 = new FileReader(
                    new File(System.getProperty("user.dir") + "\\src\\test\\resources\\csvFile\\Reader - Copy.csv"));

            CSVReader csvReader1 = new CSVReader(reader1);
            CSVReader csvReader2 = new CSVReader(reader2);
            String[] nextRecordReader1;
            String[] nextRecordReader2;
            // we are going to read data line by line
            while ((nextRecordReader1 = csvReader1.readNext()) != null
                    && (nextRecordReader2 = csvReader2.readNext()) != null) {
                checkEquality(nextRecordReader1, nextRecordReader2);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void checkEquality(String[] s1, String[] s2) {
        if (s1 == s2) {}

        if (s1 == null || s2 == null) {}

        int n = s1.length;
        if (n != s2.length) {}

        for (int i = 0; i < n; i++) {
            if (!s1[i].trim().equals(s2[i].trim())) {
                System.out.println(s1[i] + " is not equal to " + s2[i]);
            }
        }

    }

这给了我以下结果:1 不等于 2

我无法提及列名。我该怎么做?

标签: javacsv

解决方案


public void checkEquality(String[] s1, String[] s2) {
        if (s1 == s2) {}

        if (s1 == null || s2 == null) {}

        String[] headers= new String[]{"Name","Roll No","Dept"};
        int n = s1.length;
        if (n != s2.length) {}

        for (int i = 0; i < n; i++) {
            if (!s1[i].trim().equals(s2[i].trim())) {
                System.out.println(headers[i]+" "+s1[i] + " is not equal to " headers[i]+"  "+ s2[i]);
            }
        }

    }

您需要一个集合来保存列标题,并使用此集合来获取基于索引的标题。


推荐阅读