如何使用 Apache Commons CSV 计算 CSV 中的列数?
How to count number of columns in CSV using Apache Commons CSV?
如何使用 Apache Commons CSV 计算 CSV 文件中的列数?我的目标是为 CSVParser 生成 headers,只要我能确定列数。
示例 CSV 文件:
0,1,0
1,2,3
2,3,4
...
在这种情况下,列数为三。所以我正在寻找的是:
CSVParser parser = format.parse(file);
CSVRecord firstRecord = parser.iterator().next();
int numColumns = firstRecord.size();
注意:我似乎能够很好地解析文件,只要它们在开头有一个额外的行并且我创建了一个格式,例如:
文件:
asdf
0,1,0
1,2,3
2,3,4
...
格式:
CSVFormat = format.withFirstRecordAsHeader().withSkipHeaderRecord()
现在回答为时已晚&不确定您使用的是什么版本。
使用 Apache commonCSV 1.4 (JDK 6+),firstRecord.size() 可用。
我找到的解决方案是在文件内容之前添加一个假行,并使用一种可以忽略 header 记录的格式。
public static CSVParser getParserForUnknownCSV(FileInputStream inputStream)
{
Byte[] fakeLine = ("fake line" + System.lineSeparator()).toByteArray();
ByteArrayInputStream fakeLineStream = new ByteArrayInputStream(fakeLine);
SequenceInputStream prependedStream = new SequenceInputStream(fakeLineStream, inputStream);
InputStreamReader prependedReader = new InputStreamReader(prependedStream)
CSVFormat formatWithFakeHeader = CSVFormat.DEFAULT
.withSkipHeaderRecord()
.withHeader("fake header")
.withAllowMissingColumnNames();
CSVParser parser = new CSVParser(prependedReader, formatWithFameHeader);
return parser;
}
如何使用 Apache Commons CSV 计算 CSV 文件中的列数?我的目标是为 CSVParser 生成 headers,只要我能确定列数。
示例 CSV 文件:
0,1,0
1,2,3
2,3,4
...
在这种情况下,列数为三。所以我正在寻找的是:
CSVParser parser = format.parse(file);
CSVRecord firstRecord = parser.iterator().next();
int numColumns = firstRecord.size();
注意:我似乎能够很好地解析文件,只要它们在开头有一个额外的行并且我创建了一个格式,例如:
文件:
asdf
0,1,0
1,2,3
2,3,4
...
格式:
CSVFormat = format.withFirstRecordAsHeader().withSkipHeaderRecord()
现在回答为时已晚&不确定您使用的是什么版本。 使用 Apache commonCSV 1.4 (JDK 6+),firstRecord.size() 可用。
我找到的解决方案是在文件内容之前添加一个假行,并使用一种可以忽略 header 记录的格式。
public static CSVParser getParserForUnknownCSV(FileInputStream inputStream)
{
Byte[] fakeLine = ("fake line" + System.lineSeparator()).toByteArray();
ByteArrayInputStream fakeLineStream = new ByteArrayInputStream(fakeLine);
SequenceInputStream prependedStream = new SequenceInputStream(fakeLineStream, inputStream);
InputStreamReader prependedReader = new InputStreamReader(prependedStream)
CSVFormat formatWithFakeHeader = CSVFormat.DEFAULT
.withSkipHeaderRecord()
.withHeader("fake header")
.withAllowMissingColumnNames();
CSVParser parser = new CSVParser(prependedReader, formatWithFameHeader);
return parser;
}