如何更改代码以读取所有类型的定界文件?当前仅读取csv文件,然后进行比较

时间:2019-06-25 19:17:03

标签: java

csv1

ID,名称 1,克里斯 2,乔希 3,山姆 4,彼得

csv2 身份证,姓名 1,克里斯 2,拉尔夫 3,斯坦 4,鲍勃

package com.company;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Diff {

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

        ArrayList<String> values1 = new ArrayList<String>();
        ArrayList<String> values2 = new ArrayList<String>();
        File sheet1 = new File("C:\\Users\\Krisesh.Kanchi\\Documents\\csv1.csv");
        File sheet2 = new File("C:\\Users\\Krisesh.Kanchi\\Documents\\csv2.csv");

        Scanner scanner1 = new Scanner(sheet1);
        Scanner scanner2 = new Scanner(sheet2);

        scanner1.nextLine();
        while (scanner1.hasNextLine()) {
             values1.add(scanner1.nextLine().split(",")[1]);
    }

    scanner2.nextLine();
    while (scanner2.hasNextLine()) {
        values2.add(scanner2.nextLine().split(",")[1]);
    }

    int iteration = 0;

    System.out.printf("%-6s%-6s%-6s\n","Sheet-1", "    ", "Sheet-2");
    System.out.println();

    for (String value : values1) {
        if(values1.get(iteration).compareToIgnoreCase(values2.get(iteration)) != 0) {
            System.out.printf("%-7s%-6s%-7s\n",values1.get(iteration), " --> ", values2.get(iteration));
        }
        iteration++;
    }
}

}

此代码可以准确确定两个csv文件之间的差异,但是在更改定界符时无法进行此比较。我希望能够通过具有相同性质的该程序运行任何文件,例如制表符分隔,管道分隔等。

1 个答案:

答案 0 :(得分:0)

一个独特的非答案:您不这样做。除非您有很多时间。

您会看到:解析任意CSV文件比您想象的要难得多。自行编写的CSV解析器可以准确地用于您最初对其进行测试的那些输入文件。一旦您使用来自其他来源的某些有效 CSV测试它,它很可能会失败。 (是的:去过那里,做到了)

它从一个非常简单的事情开始:您不能只是在分隔符上分割。您会看到:

"a string, with a comma","another string, another comma"

是有效的CSV内容。所以:您必须仔细寻找报价。

接下来的事情当然是能够自动处理各种特定类型的功能,例如日期/时间解析等。

因此:如果您需要一个用于真实系统的CSV解析器,请考虑使用现有的库解决方案之一,例如opencsv。除非有充分的理由,否则不要重新发明轮子。

(是的,学习如何做可能是一个很好的理由。不需要CSV解析器,就像其他人很久以前为您写的那样。)

话虽如此:您当前的代码是硬编码,所有可能/应该在命令行中参数的事情都是

  • 要解析的文件名
  • 要使用的分隔符

因此,要回答所问的问题:不要将这样的参数直接放入代码中。允许用户动态地设置,例如通过在命令行上传递它们。

但是再说一次:这些正是现实世界中的工具免费为您提供的东西。