我在CSV文件中有百万条记录,其中有3列id,firstName,lastName。我必须在java中处理这个文件并验证id应该是唯一的,firstName不应该为null。如果存在id不唯一和/或firstName为null的情况,那么我必须将这些记录写入输出文件中,并将第四列作为原因(" id不唯一" /" firstName是NULL")。表现应该是好的。请建议最有效的方法。
答案 0 :(得分:0)
您可以使用集合(ArrayList)将所有ID存储在循环中,并检查它是否尚不存在。如果它执行,请将其写入文件。
代码应该是这样的:
if(!idList.contains(id)){
idList.add(id);
}else{
writer.write(id);
}
以上代码应该循环使用从CSV文件中读取的所有记录。
答案 1 :(得分:0)
您可以将OpenCsv jar用于指定的目的。它是在Apache 2.0许可下。 你可以从下载jar http://www.java2s.com/Code/Jar/o/Downloadopencsv22jar.htm
下面的代码是相同的
Reader reader = Files.newBufferedReader(Paths.get(INPUT_SAMPLE_CSV_FILE_PATH)); CSVReader csvReader = new CSVReader(reader);
Writer writer = Files.newBufferedReader(Paths.get(OUTPUT_SAMPLE_CSV_FILE_PATH));
CSVWriter csvWriter = new CSVWriter(writer);
List<String[]> list = csvReader.readAll();
for (String[] row : list) {
//assuming First column to be Id
String id = row[0];
//assuming name to be second column
String name = row[1];
//assuming lastName to be third column
String lastName = row[2];
//Put your pattern here
if(id==null || !id.matches("pattern") || name==null || !name.matches("pattern")){
String[] outPutData = new String[]{id, name , lastName, "Invalid Entry"};
csvWriter.writeNext(outPutData);
}
}
让我知道这是否有效,或者您需要进一步的帮助或澄清。
答案 2 :(得分:0)
如果你想要一个好的性能算法,你不应该像这里解释的那样使用ArrayList.contains(element)
,使用O(n)复杂度。相反,我建议您使用HashSet
,因为HashSet.Contains(element)
操作具有O(1)复杂度。简而言之,使用ArrayList可以进行1,000,000 ^ 2次操作,而使用HashSet则可以使用1,000,000次操作。
在伪代码中(为了不给出完整答案并让你自己找到答案)我会这样做:
File outputFile
String[] columns
HashSet<String> ids
for(line in file):
columns = line.split(',')
if(ids.contains(columns.id):
outputFile.append(columns.id + " is not unique")
continue
if(columns.name == null):
outputFile.append("first name is null!")
continue
ids.add(columns.id)