top / index / prev / next / target / source

2017-09-13 diary: [Java] CSV の差集合

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

[Java] CSV の差集合

Apache Commons CSV を利用した CSV ファイル間の差集合の取得方法をメモします。

Create new project

さしあたり Maven プロジェクトを作成します。

cd workspace/
mvn archetype:generate -DgroupId=igapyon.csvminus -DartifactId=CsvMinus -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Edit pom.xml

依存ライブラリに Apache Commons CSV を追加します。

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-csv</artifactId>
      <version>1.4</version>
    </dependency>

Java code

コードを書きます。以下の例は Java 1.7 以降を前提とします。

import java.io.*;
import java.util.*;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.csv.QuoteMode;

public class App {
    private static final File fileBotai = new File("botai.csv");
    private static final File fileMinus = new File("minus.csv");
    private static final File fileResult = new File("result.csv");

    public static void main(String[] args) throws IOException {
        final Map<String, CSVRecord> mapResult = new HashMap<>();

        try (CSVParser parseCsv = CSVFormat.DEFAULT
                .parse(new BufferedReader(new InputStreamReader(new FileInputStream(fileBotai), "UTF-8")))) {
            for (CSVRecord record : parseCsv.getRecords()) {
                mapResult.put(record.get(1), record);
            }
        }

        try (CSVParser parseCsv = CSVFormat.DEFAULT
                .parse(new BufferedReader(new InputStreamReader(new FileInputStream(fileMinus), "UTF-8")))) {
            for (CSVRecord record : parseCsv.getRecords()) {
                if (mapResult.get(record.get(0)) != null) {
                    // do minus
                    mapResult.remove(record.get(0));
                }
            }
        }

        final List<String> listResult = new ArrayList<>();
        listResult.addAll(mapResult.keySet());
        Collections.sort(listResult);

        try (CSVPrinter outputCsv = CSVFormat.EXCEL.withQuoteMode(QuoteMode.ALL)
                .print(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileResult), "UTF-8")))) {
            for (String key : listResult) {
                outputCsv.print(key);
                outputCsv.println();
            }
        }
    }
}

Last modified: $Date: 2017-09-13 $

登場キーワード


この日記について