此外,允许以可读/简单的方式处理长行,在编写和读取它们时。
我已经调查过了opencsv
,但它没有以任何顺序方式引用行中的元素,并且supercsv
不允许按名称查看列,而只能按数字查看。
另一个警告 - 我需要能够按名称寻址列 - 列数不是恒定的,并且只有部分列标题是恒定的,例如:
Name|Number|Color1|Color2......|Color67|
其中并非所有 1 到 67 之间的颜色都存在于任何给定的 CSV 文件中。
我无法真正与 opencsv 交谈,但如果您有固定数量的字段,您也许可以使用 JavaBean 绑定来执行类似的操作。
然而,超级 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。有了这个库,您不仅可以随意选择列,还可以按任意顺序选择列。
带有以下标题:名称|编号|Color1|Color2......|Color67|
我们使用以下代码从 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 列的输出数据:
红色 蓝色 灰色
蓝色 黄色 白色