【问题标题】:How to compare two CSV's with Json's fields如何将两个 CSV 与 Json 的字段进行比较
【发布时间】:2021-02-01 13:54:20
【问题描述】:

我有一项工作来比较两个 CSV 的字段是:字符串 json 对象 json 对象日期字符串 字符串 如何打开文件并比较它们?到目前为止,我首先尝试了所有这些方法中的一个 CSV,那么接下来呢?:

public class MainApp {

public static void main(String[] args) throws IOException{

    Collection<Object> lines = new ArrayList<>();

    String filePath = ".\\sheet.csv";

    Reader reader = Files.newBufferedReader(Paths.get(filePath));
    CSVParser csvParser = new CSVParser(reader,CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());
    {
        for (CSVRecord csvRecord : csvParser) {
            String name = csvRecord.get("name");
            String email = csvRecord.get("jobSpecification");
            String phone = csvRecord.get("assignedProject");
            String country = csvRecord.get("lastUpdated");
            String id = csvRecord.get("id");
            String comments = csvRecord.get("comments");

            Data row = new Data(name, email, phone, country, id, comments);
            
            lines.add(row);

        }
    }
    for (Object d : lines) {
        System.out.println(d.toString());
    }

}

和对象:

public class Data {
String name;
String email ;
String phone ;
String country;
String id;
String comments;

public Data(String name, String email, String phone, String country, String id, String comments) {
    this.name = name;
    this.email = email;
    this.phone = phone;
    this.country = country;
    this.id = id;
    this.comments = comments;
}

@Override
public String toString() {
    return "name: "+name+" "+" email: "+email+" phone: "+phone+" country: "+country+" id: "+id+" comments: "+comments;
}

}

所以现在我认为只剩下比较 CSV(我制作的)看起来像these

【问题讨论】:

  • 不太清楚您要在这里完成什么。但是,最好有:Collection&lt;Data&gt; lines = new ArrayList&lt;&gt;();lines.add(new Data(name, email, phone, country, id, comments));
  • @DevilsHnd 我正在尝试比较 cetween 2 csv,每个 csv 有两个实际上是 json 的字段,其余字段是数据、字符串、整数,所以我从每一行创建了一个对象..但接下来呢?

标签: java json csv arraylist


【解决方案1】:

要比较两个 CSV,我建议在包含 csv 字段的类上使用 equals 方法,并逐行迭代这些文件, 但是你必须在 Data 类中实现自己的 equals 和 hashcode 方法。

你需要考虑一件事——比较两个jsons并不是那么容易,有很多库,但是几乎所有的库都使用严格的比较方法,这意味着比较两个 具有不同字段顺序,或嵌套字段顺序,或嵌套数组项顺序的 json 将导致这些 json 对象之间的假阴性比较。

允许宽大比较的库是jsonassert库:

        <dependency>
            <groupId>org.skyscreamer</groupId>
            <artifactId>jsonassert</artifactId>
            <version>1.5.0</version>
            <scope>compile</scope>
        </dependency>

您可以在下面找到基本实现,它检查两个 JSON 是否深度相等(无论字段顺序,数组项顺序) - 以 cmets 字段为例。

//Data class
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Data data = (Data) o;
    return Objects.equals(name, data.name) &&
            Objects.equals(email, data.email) &&
            Objects.equals(phone, data.phone) &&
            Objects.equals(country, data.country) &&
            Objects.equals(id, data.id) &&
            deepJSONsEquals(comments, data.comments);
}

private boolean deepJSONsEquals(String firstJson, String secondJson) {
    try {
        return JSONCompare.compareJSON(firstJson, secondJson, JSONCompareMode.LENIENT).passed();
    } catch (JSONException e) {
        e.printStackTrace();
        return false;
    }
}

@Override
public int hashCode() {
    return Objects.hash(name, email, phone, country, id, comments);
}

MainApp 类:

List<Data> linesFromFirstCsv = new ArrayList<>();
List<Data> linesFromSecondCsv = new ArrayList<>();

// add here line by line values from csv to relevant lists. (create Data objects)

    if(linesFromFirstCsv.size() == linesFromSecondCsv.size()) {
        for (int i = 0; i < Math.min(linesFromFirstCsv.size(), linesFromSecondCsv.size()); i++) {
            System.out.println(linesFromFirstCsv.get(i).equals(linesFromSecondCsv.get(i)));
        }
    } else {
        System.out.println("not equals");
    }

这将返回 true 结果以比较作为 cmets 值传递的示例 json(数组中的不同字段顺序和数组项顺序):

{
    "comments":
    [
        {
        "timestamp": 123123123,
        "id": "1212",
        "body": "lorem ipsum"
        },
        {
        "body": "lorem ipsum2",
        "id": "1213",
        "timestamp": 123123125
        },
        {
        "id": "1214",
        "body": "lorem ipsum3",
        "timestamp": 123123129
        }
    ]
}
{
    "comments":
    [
        {
        "id": "1213",
        "body": "lorem ipsum2",
        "timestamp": 123123125
        },
        {
        "id": "1212",
        "body": "lorem ipsum",
        "timestamp": 123123123
        },
        {
        "id": "1214",
        "body": "lorem ipsum3",
        "timestamp": 123123129
        }
    ]
}

【讨论】:

  • 谢谢你仍然在几行中我更改了字段,它说它是真的。奇怪
猜你喜欢
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 2014-10-27
  • 2019-05-21
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2019-07-16
相关资源
最近更新 更多