<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,王五