top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
Apache Commons CSV を利用した CSV ファイル間の差集合の取得方法をメモします。
さしあたり Maven プロジェクトを作成します。
cd workspace/
mvn archetype:generate -DgroupId=igapyon.csvminus -DartifactId=CsvMinus -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
依存ライブラリに Apache Commons CSV を追加します。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.4</version>
</dependency>
コードを書きます。以下の例は 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 $