我正在验证一个包含以下内容的 csv 文件:
TEST;F;12345;0X4321 - 1234 DUMMYTEXT;0X4321 - 1234 TESTTEXT
到目前为止,这些值由“;”分隔 这个方法就像一个魅力:
private static final String COLUMN_SEPARATOR = ";";
public void validateFile(BufferedReader reader) {
String line = reader.readLine();
while (line != null && result == ValidationResult.VALID) {
//this is broken with tab-stop as COLUMN_SEPARATOR
int matches = StringUtils.countMatches(line, COLUMN_SEPARATOR);
if (matches != getCSVColumnCount() - 1
&& StringUtils.isNotBlank(line)) {
if (matches == 0) {
//MISSING_CSV_COLUMN_SEPERATOR;
} else {
//UNEXPECTED_CSV_COLUMN_COUNT;
}
}
line = reader.readLine();
}
}
作为一个更改的要求,现在我必须将制表位作为列分隔符处理,而文本可以包含空格:
TEST F 12345 0x4321 - 1234 DUMMYTEXT 0x4321 - 1234 TESTTEXT
我更改了以下行:
private static final String COLUMN_SEPARATOR = "\\t";
问题: StringUtils.countMatches(line, "\\t")
找不到任何事件(返回 0)。我不想这样做:
int matches = line.split("\\t").length;
因为我很迷信,这会对性能造成重大影响(csv 文件不小)。你知道更好的方法吗?