1

我尝试在 Java 中删除 csv 文件中的列。

例如,我有这个 csv 文件

ID   name1   name2   name3
1    hello   hell    hel
2    try     tr      t
3    browser bro     br

我想要在下一个操作之后:(删除 csvFile,2)它将是:

ID   name1   name3
1    hello   hel
2    try     t
3    browser br

我发现只有涉及行而不是列的操作。

4

2 回答 2

2

删除 CSV 文件中的列的唯一方法是删除整个文件中的标题和该列的信息,即文件的每一行。即使您使用第三方库,它也会在内部执行此操作。

于 2013-02-26T08:19:12.853 回答
1

读入每一行的每一列值,并只写出所需的列,同时跳过不需要的列值。

使用Apache Commons CSV库的示例应用程序

这是一个示例应用程序,演示了使用Apache Commons CSV读取输入文件,然后写入输出文件,跳过不需要的列值。

请注意使用 try-with-resources 语法来自动关闭我们的文件读取器和写入器对象。请参阅Oracle 教程

RFC 4180是指定义逗号分隔值 (CSV)格式的书面标准。

制作一个名为input.csv.

ID,name1,name2,name3
1,hello,hell,hel
2,try,tr,t
3,browser,ro,br

Java 应用程序。

package work.basil.example;

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

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class App
{
    public static void main ( String[] args )
    {
        System.out.println ( "Hello World!" );
        App app = new App ();
        app.demo ();
    }

    private void demo ( )
    {
        try
        {
            // Read CSV file.
            Path pathInput = Paths.get ( "/Users/basilbourque/input.csv" );
            Path pathOutput = Paths.get ( "/Users/basilbourque/output.csv" );
            try (
                    final BufferedReader reader = Files.newBufferedReader ( pathInput , StandardCharsets.UTF_8 ) ;
                    final CSVPrinter printer = CSVFormat.RFC4180.withHeader ( "ID" , "name1" , "name3" ).print ( pathOutput , StandardCharsets.UTF_8 ) ;
            )
            {
                Iterable < CSVRecord > records = CSVFormat.RFC4180.withFirstRecordAsHeader ().parse ( reader );
                // We expect these headers: ID,name1,name2,name3
                for ( CSVRecord record : records )
                {
                    // Read.
                    Integer id = Integer.valueOf ( record.get ( "ID" ) );
                    String name1 = record.get ( "name1" );
                    String name2 = record.get ( "name2" );
                    String name3 = record.get ( "name3" );
                    System.out.println ( "id: " + id + " | name1: " + name1 + " | name2: " + name2 + " | name3: " + name3 );

                    // Write.
                    printer.printRecord ( id , name1 , name3 );
                }
            }
        } catch ( InvalidPathException e )
        {
            e.printStackTrace ();
        } catch ( IOException e )
        {
            e.printStackTrace ();
        }
    }
}

控制台输出。

编号:1 | 姓名1:你好| name2:地狱 | 名称3:赫尔

编号:2 | 名称1:尝试| 名称2:tr | 名称3:t

编号:3 | name1: 浏览器 | name2: 罗 | 名称3:br

生成的文件名为output.csv.

ID,name1,name3
1,hello,hel
2,try,t
3,browser,br
于 2019-09-15T20:14:05.303 回答