StringUtils.countMatches()不适用于tab char

SME*_*Dev 3 java csv apache-stringutils

我正在验证包含以下内容的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();
    }       
}
Run Code Online (Sandbox Code Playgroud)

作为一个更改的要求,现在我必须处理制表位作为列分隔符,而文本可以包含空格:

TEST F 12345 0x4321 - 1234 DUMMYTEXT 0x4321 - 1234 TESTTEXT

我更改了以下行:

private static final String COLUMN_SEPARATOR = "\\t";
Run Code Online (Sandbox Code Playgroud)

问题: StringUtils.countMatches(line, "\\t") 找不到任何出现(返回0).我不想这样做:

int matches = line.split("\\t").length;
Run Code Online (Sandbox Code Playgroud)

因为我超级敏感,这将是一个重大的性能打击(csv文件不小).你知道更好的方法吗?

Ale*_*rov 6

你已经逃脱了Java字符串文字中的反斜杠.因此,结果字符串由两个字符组成:反斜杠和't'.

要表示Java字符串文字中的制表符,请使用\t(注意单个反斜杠).

修复是:

private static final String COLUMN_SEPARATOR = "\t";
Run Code Online (Sandbox Code Playgroud)

然后StringUtils.countMatches()将按预期工作.