此外,还允许以可读/简单的方式处理长行,无论是写入还是读取。
我已经研究过
opencsv
但它并不以任何顺序方式引用行中的元素,并且 supercsv
不允许按名称查看列,而只能按数字查看。
另一个警告 - 我需要能够按名称寻址列 - 是列数不是恒定的,并且只有部分列标题是恒定的,例如:
Name|Number|Color1|Color2......|Color67|
并非 1 到 67 之间的所有颜色都出现在任何给定的 CSV 文件中。
我无法真正与 opencsv 交谈,但如果您有固定数量的字段您也许可以使用 JavaBean 绑定来执行类似的操作。
Super CSV 但是,绝对支持使用 CsvBeanReader、CsvDozerBeanReader 或 CsvMapReader(及其等效项)按名称读取和写入 CSV 行。
如果您希望保持简单并使用映射(以列名作为键,列值作为值),那么您可以使用CsvMapReader。 Super CSV 网站上有使用 CsvMapReader 进行阅读和写作的示例。
阅读示例:
ICsvMapReader mapReader = new CsvMapReader(
new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE);
try {
final String[] headers = mapReader.getHeader(true);
Map<String, String> row;
while( (row = mapReader.read(headers)) != null) {
for (String header : headers) {
System.out.println(header + " is " + row.get(header));
}
}
} finally {
mapReader.close();
}
写作非常相似。
您可以使用开源库uniVocity-parsers。有了这个库,您不仅可以根据需要选择列,还可以以任何顺序选择列。
具有以下标题: 名称|编号|颜色1|颜色2......|颜色67|
我们使用以下代码从 csv 中仅选择“Color1”、“Color3”和“Color2”列:
public static void main(String[] args) throws FileNotFoundException {
// 1st, config the CSV reader
CsvParserSettings settings = new CsvParserSettings();
settings.getFormat().setLineSeparator("\n");
settings.selectFields("Color1", "Color3", "Color2");
// 2nd, creates a CSV parser with the configs
CsvParser parser = new CsvParser(settings);
// 3rd, parses all rows of data in selected columns from the CSV file into a matrix
List<String[]> resolvedData = parser.parseAll(new FileReader("/examples/example.csv"));
// 3rd, process the matrix with business logic
for (String[] row : resolvedData) {
StringBuilder strBuilder = new StringBuilder();
for (String col : row) {
strBuilder.append(col).append("\t");
}
System.out.println(strBuilder);
}
}
您将获得这 3 列的输出数据:
红蓝灰
蓝黄白
基本上我们有多种选择,我将分享其中2个:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.9.0</version>
</dependency>
CSVFormat csvFormat = CSVFormat.DEFAULT
.withDelimiter(separator) // Set custom delimiter
.withQuote(quoteChar) // Set custom quote character
.withFirstRecordAsHeader() // Treat the first row as the header (after optional skipping)
.withIgnoreEmptyLines() // ignore empty lines
;
Reader reader = new FileReader(filepath);
CSVParser csvParser = new CSVParser(reader, csvFormat);
List<CSVRecord> records = csvParser.getRecords();
CSVRecord csvRecord1 = records.get(0);
String empolyeeName = csvRecord1.get("EmployeeName"); // reading column by name
<dependency>
<groupId>de.siegmar</groupId>
<artifactId>fastcsv</artifactId>
<version>2.2.1</version>
</dependency>
BufferedReader bufferedReader = Files.newBufferedReader(Paths.get(filepath));
NamedCsvReader namedCsvReader = NamedCsvReader.builder()
.fieldSeparator(separator)
.quoteCharacter(quoteChar)
.build(bufferedReader);
List<NamedCsvRow> namedCsvRowList = namedCsvReader.stream().collect(Collectors.toList());
NamedCsvRow namedCsvRow1 = namedCsvRowList.get(0);
String empolyeeName = namedCsvRow1.getField("EmployeeName"); // reading column by name