-1

我有一个 csv 文件。它包含几个重复的列。我正在尝试使用 Java 删除这些重复项。我找到了 Apache Common csv 库,有些人用它来删除重复的行。如何使用它来删除或跳过重复的列?

例如:我的 csv 标头是:

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();


4

1 回答 1

0

您的代码接近您的需要 - 您只需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

需要注意的几点:

  1. 我的评论错了。您不需要使用列索引 - 您可以在特定情况下使用标题(如上所述)。

  2. 每当读写文件时,建议提供字符编码。就我而言,我使用 UTF-8。(当然,这假定原始文件是作为 URF-8 文件创建的 - 或者与该编码兼容。)

  3. 打开阅读器和作者时,我使用“try-with-resources”语句。这意味着我不必显式关闭文件资源——Java 会为我处理这些。

于 2021-04-27T20:42:12.610 回答