如何使用java检查.csv中的重复记录

时间:2016-01-21 09:05:40

标签: java parsing csv

我有一个CSV文件:

10;name1;id1
20;name2;id2
10;name3;id3

Row的行我将数据推送到一个名为forward的方法:

  

forward(nr,name,id);

如果“nr”是重复的,我如何检查整个csv?如上例所示:10。

我的代码现在:

while ((line = reader.readLine()) != null) {
    scanner = new Scanner(line);
    scanner.useDelimiter(";");
    while (scanner.hasNext()) {
        String data = scanner.next();
        if (index == 0)
            nr = Integer.parseInt(data);
        else if (index == 1)
            name = data;
        else if (index == 2)
            id = data;
        else
            System.out.println("invalid data::" + data);
        index++;
    }
    index = 0;
    forward(nr, name, id);  
}

如果找到副本,我只想在屏幕上打印。

3 个答案:

答案 0 :(得分:2)

使用Map<Long, String>。每次转发输出之前,您都可以检查地图是否包含密钥(数字)。

Map<Long, String> entryMap = new HashMap<Long, String>();
[...]
if (!entryMap.containsKey(nr)) {
     entryMap.put(nr, name);
     forward(nr, name, id);
} else 
     System.out.println("Entry with number " + nr + " already added to .csv file");

如果只有数字是相关的,并且您不需要设置任何例外(例如entry with name and number is already in the file),您可能想要选择其他数据结构,例如List

正如我在上面的评论中所读到的,如果您的意图是替换,您可以进行以下操作:

创建一个保存参数的类:

public class CsvEntry {
       private int number;
       private String name, id;

       public CsvEntry(number, name, id) {
           this.number = number;
           this.name = name;
           this.id = id;
       }
       // getters & setters
}

然后将Map更改为:

Map<Long, CsvEntry> entryMap = new TreeMap<Long, CsvEntry>();
// TreeMap so the entries are sorted.
[...]
entryMap.put(nr, new CsvEntry(nr, name, id));
// after populating the map, e.g., after the outer loop
forward(entryMap);

然后在前进中,您只需循环输出地图。

答案 1 :(得分:2)

您可以使用 java.util.Set 来检查重复。

示例代码:

java.util.Set<Integer> nrSet = new java.util.HashSet<Integer>();
while ((line = reader.readLine()) != null) {
    scanner = new Scanner(line);
    scanner.useDelimiter(";");
    while (scanner.hasNext()) {
        String data = scanner.next();
        if (index == 0)
            nr = Integer.parseInt(data);
        else if (index == 1)
            name = data;
        else if (index == 2)
            id = data;
        else
            System.out.println("invalid data::" + data);
        index++;
    }
    index = 0;
    if (nrSet.contains(nr)) { // check duplication
        System.out.println("Duplicate nr:" + nr);
    } else {
        forward(nr, name, id);  
        nrSet.add(nr);// add as forwarded 
    }
}

java.util.Set nrSet = new java.util.HashSet(); 已经转发 nr 设置。

if(nrSet.contains(nr))检查重复  
nrSet.add(nr); 刚刚转发 nr

答案 2 :(得分:1)

如果您想要一个只需要对当前代码进行少量修改的快速解决方案,那么您可以在此代码之前声明ArrayList<Integer> nrs,并在测试if (index == 0)内检查if (nrs.contains(nr))然后您可以显示您的消息和break;else nrs.add(nr);

您的代码将是这样的:

ArrayList<Integer> nrs = new ArrayList<>();
while ((line = reader.readLine()) != null) {
    scanner = new Scanner(line);
    scanner.useDelimiter(";");
    while (scanner.hasNext()) {
        String data = scanner.next();
        if (index == 0){
            nr = Integer.parseInt(data);
            if(nrs.contains(nr)) {
                System.err.println("Duplicate record : "+nr);
                break;
            } else nrs.add(nr);
        }
        else if (index == 1)
            name = data;
        else if (index == 2)
            id = data;
        else
            System.out.println("invalid data::" + data);
        index++;
    }
    index = 0;
    forward(nr, name, id);  
}