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