此外,允许以可读/简单的方式处理长行,编写它们以及读取它们。
我查看了opencsv
,但它没有以任何顺序的方式引用行中的元素,而supercsv
不允许按名称查找列,但仅限数字。
另一个警告 - 我需要能够按名称来处理列 - 是列的数量不是常量,并且只有部分列标题是常量,如:
Name|Number|Color1|Color2......|Color67|
并非任何给定的CSV文件中都存在1到67之间的所有颜色。
答案 0 :(得分:6)
我真的不能和opencsv说话,但如果你有固定数量的字段you might be able to use the JavaBean binding to do something like this。
Super CSV但是,肯定支持使用CsvBeanReader,CsvDozerBeanReader或CsvMapReader(及其写作等价物)按名称读取和写入CSV行。
如果您希望保持简单并使用地图(列名称为键,列值作为值),则可以使用CsvMapReader。 Super CSV网站上有reading和writing的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();
}
写作非常相似。
答案 1 :(得分:3)
您可以使用开源库uniVocity-parsers。使用此库,您不仅可以根据需要选择列,还可以按任意顺序选择列。
使用以下标题: 名称|号码| COLOR1 | COLOR2 ...... | Color67 |
我们只选择列#34; Color1&#34;,&#34; Color3&#34;和&#34; Color2&#34;来自csv,代码如下:
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 :(得分:1)