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文件之间的差异,但是在更改定界符时无法进行此比较。我希望能够通过具有相同性质的该程序运行任何文件,例如制表符分隔,管道分隔等。
答案 0 :(得分:0)
一个独特的非答案:您不这样做。除非您有很多时间。
您会看到:解析任意CSV文件比您想象的要难得多。自行编写的CSV解析器可以准确地用于您最初对其进行测试的那些输入文件。一旦您使用来自其他来源的某些有效 CSV测试它,它很可能会失败。 (是的:去过那里,做到了)
它从一个非常简单的事情开始:您不能只是在分隔符上分割。您会看到:
"a string, with a comma","another string, another comma"
是有效的CSV内容。所以:您必须仔细寻找报价。
接下来的事情当然是能够自动处理各种特定类型的功能,例如日期/时间解析等。
因此:如果您需要一个用于真实系统的CSV解析器,请考虑使用现有的库解决方案之一,例如opencsv。除非有充分的理由,否则不要重新发明轮子。
(是的,学习如何做可能是一个很好的理由。不需要CSV解析器,就像其他人很久以前为您写的那样。)
话虽如此:您当前的代码是硬编码,所有可能/应该在命令行中参数的事情都是>
因此,要回答所问的问题:不不要将这样的参数直接放入代码中。允许用户动态地设置,例如通过在命令行上传递它们。
但是再说一次:这些正是现实世界中的工具免费为您提供的东西。