使用Java处理文件中的大量记录

时间:2018-03-09 05:28:51

标签: java

我在CSV文件中有百万条记录,其中有3列id,firstName,lastName。我必须在java中处理这个文件并验证id应该是唯一的,firstName不应该为null。如果存在id不唯一和/或firstName为null的情况,那么我必须将这些记录写入输出文件中,并将第四列作为原因(" id不唯一" /" firstName是NULL")。表现应该是好的。请建议最有效的方法。

3 个答案:

答案 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)
相关问题