如何使用 Commons CSV 使用 Java 删除 csv 文件中的重复项?
How to use Commons CSV remove duplicate in csv file using Java?
我有一个 csv 文件。它包含几个重复的列。我正在尝试使用 Java 删除这些重复项。我找到了 Apache Common csv library,有些人用它来删除重复的行。我如何使用它来删除或跳过重复的列?
例如:我的 csv header 是:
ID Name Email Email
到目前为止我的代码是:
Reader reader = Files.newBufferedReader(Paths.get("user.csv"));
// read csv file
Iterable<CSVRecord> records = CSVFormat.DEFAULT.withFirstRecordAsHeader()
.withIgnoreHeaderCase()
.withTrim()
.parse(reader);
for (CSVRecord record : records) {
System.out.println("Record #: " + record.getRecordNumber());
System.out.println("ID: " + record.get("ID"));
System.out.println("Name: " + record.get("Name"));
System.out.println("Email: " + record.get("Email"));
}
// close the reader
reader.close();
您的代码接近您的需要 - 您只需要使用 CSVPrinter
将数据写入新文件。
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;
public class App {
public static void main(String[] args) throws IOException {
try (final Reader reader = Files.newBufferedReader(Paths.get("source.csv"),
StandardCharsets.UTF_8)) {
final Writer writer = Files.newBufferedWriter(Paths.get("target.csv"),
StandardCharsets.UTF_8,
StandardOpenOption.CREATE); // overwrites existing output file
try (final CSVPrinter printer = CSVFormat.DEFAULT
.withHeader("ID", "Name", "Email")
.print(writer)) {
// read each input file record:
Iterable<CSVRecord> records = CSVFormat.DEFAULT
.withFirstRecordAsHeader()
.withIgnoreHeaderCase()
.withTrim()
.parse(reader);
// write each output file record
for (CSVRecord record : records) {
printer.print(record.get("ID"));
printer.print(record.get("Name"));
printer.print(record.get("Email"));
printer.println();
}
}
}
}
}
这将转换以下源文件:
ID,Name,Email,Email
1,Albert,foo@bar.com,foo@bar.com
2,Brian,baz@bat.com,baz@bat.com
到这个目标文件:
ID,Name,Email
1,Albert,foo@bar.com
2,Brian,baz@bat.com
注意事项:
我的评论错了。您不需要使用列索引 - 您可以在特定情况下使用标题(就像我在上面所做的那样)。
每当读写文件时,建议提供字符编码。就我而言,我使用 UTF-8。 (这假设原始文件是作为 URF-8 文件创建的,当然 - 或者与该编码兼容。)
打开reader和writer时我用的是"try-with-resources"语句。这意味着我不必明确关闭文件资源 - Java 会帮我处理。
我有一个 csv 文件。它包含几个重复的列。我正在尝试使用 Java 删除这些重复项。我找到了 Apache Common csv library,有些人用它来删除重复的行。我如何使用它来删除或跳过重复的列?
例如:我的 csv header 是:
ID Name Email Email
到目前为止我的代码是:
Reader reader = Files.newBufferedReader(Paths.get("user.csv"));
// read csv file
Iterable<CSVRecord> records = CSVFormat.DEFAULT.withFirstRecordAsHeader()
.withIgnoreHeaderCase()
.withTrim()
.parse(reader);
for (CSVRecord record : records) {
System.out.println("Record #: " + record.getRecordNumber());
System.out.println("ID: " + record.get("ID"));
System.out.println("Name: " + record.get("Name"));
System.out.println("Email: " + record.get("Email"));
}
// close the reader
reader.close();
您的代码接近您的需要 - 您只需要使用 CSVPrinter
将数据写入新文件。
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;
public class App {
public static void main(String[] args) throws IOException {
try (final Reader reader = Files.newBufferedReader(Paths.get("source.csv"),
StandardCharsets.UTF_8)) {
final Writer writer = Files.newBufferedWriter(Paths.get("target.csv"),
StandardCharsets.UTF_8,
StandardOpenOption.CREATE); // overwrites existing output file
try (final CSVPrinter printer = CSVFormat.DEFAULT
.withHeader("ID", "Name", "Email")
.print(writer)) {
// read each input file record:
Iterable<CSVRecord> records = CSVFormat.DEFAULT
.withFirstRecordAsHeader()
.withIgnoreHeaderCase()
.withTrim()
.parse(reader);
// write each output file record
for (CSVRecord record : records) {
printer.print(record.get("ID"));
printer.print(record.get("Name"));
printer.print(record.get("Email"));
printer.println();
}
}
}
}
}
这将转换以下源文件:
ID,Name,Email,Email
1,Albert,foo@bar.com,foo@bar.com
2,Brian,baz@bat.com,baz@bat.com
到这个目标文件:
ID,Name,Email
1,Albert,foo@bar.com
2,Brian,baz@bat.com
注意事项:
我的评论错了。您不需要使用列索引 - 您可以在特定情况下使用标题(就像我在上面所做的那样)。
每当读写文件时,建议提供字符编码。就我而言,我使用 UTF-8。 (这假设原始文件是作为 URF-8 文件创建的,当然 - 或者与该编码兼容。)
打开reader和writer时我用的是"try-with-resources"语句。这意味着我不必明确关闭文件资源 - Java 会帮我处理。