首页 > 解决方案 > Java比较csv文件值

问题描述

我正在尝试创建一个 csv 文件,其中每行仅显示 1 个团队名称,因此当您单击按钮两次时,它只会添加团队名称(如果它不存在)。目前,它会在您每次按下按钮时添加团队“UWE”。代码如下:

public void showStats(ActionEvent event){

        try {
            File matchFile = new File("src/sample/matchData.csv");
            File scoreFile = new File("src/sample/scoreData.csv");
            Scanner matchReader = new Scanner(matchFile);
            Scanner scoreReader = new Scanner(scoreFile);
            while (matchReader.hasNextLine()) {
                String data = matchReader.nextLine();
                List<String> matchList = Arrays.asList(data.split(","));
                while (scoreReader.hasNextLine()) {
                    String dataScore = scoreReader.nextLine();
                    List<String> dataScoreList = Arrays.asList(dataScore.split(","));
                    if (dataScoreList.get(0).equals(matchList.get(0))) {
                        //
                    } else {
                        writeExcel("scoreData", matchList.get(0)) ;
                    }
                    System.out.println(dataScoreList);
                }
                System.out.println(matchList);
            }
            matchReader.close();
            scoreReader.close();
        } catch (FileNotFoundException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

csv文件“matchData”包含:UWE,KCC,Jin,Julia,Chris,Ryan,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,5,0

csv 文件“scoreData”中有一个空行

标签: javacsvcomparison

解决方案


您可以先浏览您的源 CSV 文件,然后仅将包含唯一团队密钥的行放入地图中......

while (matchReader.hasNextLine()) {
    String data = matchReader.nextLine();
    String[] record = data.split(",", 2);
    Map<String, String> matchList = new TreeMap<>();
    matchList.putIfAbsent(record[0], record[1]); // only unique keys are entered.
}
// TODO write to Excel each entry in the map (you don't need to check for unique keys)

请注意,在地图完成后写入 Excel。这是最好的方法;或者至少比您在原始帖子中显示的更好。使用这种方法,您可以让数据结构简化您的流程(并且没有嵌套循环)。

更新

我忘了提到它matchList.putIfAbsent(K, V)适用于 Java 8 及更高版本。如果使用 Java 7 或更早版本(应尽快升级 Java),则必须执行以下操作:

String value = matchList.get(record[0]);
if (value == null) {
    matchList.put(record[0], record[1]);
}

这是因为Map#get(K)返回null的是没有找到条目或映射允许为给定键输入空值。否则,它将返回先前的值。Java 8 中引入的新方法会自动执行此检查。


推荐阅读