Commons CSV 示例:CSVFormat.Builder 用法

CSV
本文将介绍 Commons CSV 中 CSVFormat.Builder 类的用法

Maven 依赖

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

示例代码

示例一

解析 CSV 文件,使用 CSVFormat.Builder 类的 setHeader() 方法设置头字段,使用 setDelimiter(";") 设置 CSV 格式分隔符为分号(“;”)。

(1)BuilderDemo1.csv 文件内容如下:

张三;男;28
李四;女;28
王五;男;28
赵六;男;28
李二;男;28

(2)java 代码如下:

import com.hxstrive.csv.CsvDemo1;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;

import java.io.FileReader;
import java.io.Reader;
import java.net.URL;

/**
 * 验证 CSVFormat.Builder 的功能
 * @author hxstrive.com 2021/12/26
 */
public class BuilderDemo1 {

    public static void main(String[] args) throws Exception {
        // 1.加载 csv 文件
        URL url = CsvDemo1.class.getResource("/BuilderDemo1.csv");
        Reader in = new FileReader(url.getFile());

        // 2.解析 csv 文件
        Iterable<CSVRecord> records = CSVFormat.DEFAULT.builder()
                .setHeader("H1", "H2", "H3")
                // 设置使用分号(“;”)分割
                .setDelimiter(";")
                .build().parse(in);

        // 3.打印数据
        for(CSVRecord record : records) {
            System.out.printf("%n\t%s\t\t%s\t\t%s",
                    record.getRecordNumber(),
                    record.get("H1"),
                    record.get("H2"),
                    record.get("H3")
            );
        }
    }

}

示例二

解析 CSV 文件,使用 CSVFormat.Builder 类的 setIgnoreEmptyLines(true) 忽略 CSV 文件的空白行,使用 setTrim(true) 去掉首尾空白,使用 setNullString("#") 方法将 CSV 文件中的 # 符号替换成 null。

(1)BuilderDemo1.csv 文件内容如下:

姓名;性别;年龄

张三;男;28

李四;女;28
王五;#;21

赵六;男;28
李二;男;28

(2)java 代码如下:

import com.hxstrive.csv.CsvDemo1;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;
import java.io.FileReader;
import java.io.Reader;
import java.net.URL;

/**
 * 验证 CSVFormat.Builder 的功能
 * @author hxstrive.com 2021/12/26
 */
public class BuilderDemo2 {

    public static void main(String[] args) throws Exception {
        // 1.加载 csv 文件
        URL url = CsvDemo1.class.getResource("/BuilderDemo2.csv");
        Reader in = new FileReader(url.getFile());

        // 2.解析 csv 文件
        Iterable<CSVRecord> records = CSVFormat.DEFAULT.builder()
                .setHeader("H1", "H2", "H3")
                // 设置使用分号(“;”)分割
                .setDelimiter(";")
                // 忽略空行
                .setIgnoreEmptyLines(true)
                // 设置跳过头部
                .setSkipHeaderRecord(true)
                // 去掉首尾空格
                .setTrim(true)
                // 将 CSV 文件中的 # 符号替换成 null
                .setNullString("#")
                .build().parse(in);

        // 3.打印数据
        for(CSVRecord record : records) {
            System.out.printf("%n\t%s\t\t%s\t\t%s\t\t%s",
                    record.getRecordNumber(),
                    record.get("H1"),
                    record.get("H2"),
                    record.get("H3")
            );
        }
    }

}

示例三

通过 CSVFormat 类的 print() 方法将通过 CSVPrinter 类 printRecord() 方法打印的 CSV 数据直接输出到控制台。

注意:这里 print() 方法接收 java.lang.Appendable 类型的参数,Appendable 参数是一个接口,该接口中提供了三个 append 方法,定义如下:

  • Appendable  append(char c) 将指定的字符附加到此 Appendable。

  • Appendable  append(CharSequence csq) 将指定的字符序列附加到此 Appendable。

  • Appendable  append(CharSequence csq, int start, int end) 将指定字符序列的子序列附加到此 Appendable。

所有实现了 Appendable 接口的类,均可以作为 print() 参数使用。下面示例中,使用 StringBuffer 来暂存 CSV 数据。

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

/**
 * 验证 CSVFormat.Builder 的功能
 * @author hxstrive.com 2021/12/26
 */
public class BuilderDemo3 {

    public static void main(String[] args) throws Exception {
        StringBuffer buffer = new StringBuffer();

        CSVPrinter printer = CSVFormat.DEFAULT.builder()
                .setHeader("ID", "NAME")
                // 写出去,如果值为 null,则使用 # 替换
                .setNullString("#")
                // 写出的 CSV 换行符为 |
                .setRecordSeparator("|")
                .build()
                .print(buffer);

        printer.printRecord("100", "张三");
        printer.printRecord("200", null);
        printer.printRecord("300", "王五");

        // 输出 CSV 内容
        System.out.println(buffer.toString());
    }

}

运行上面程序,控制台输出如下:

ID,NAME
100,张三
200,李四
300,王五
人永远是要学习的。死的时候,才是毕业的时候。 —— 萧楚女
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号