【问题标题】:StringUtils.countMatches() isn't working for tab charStringUtils.countMatches() 不适用于制表符字符
【发布时间】:2015-01-16 23:56:32
【问题描述】:

我正在验证一个 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 文件不小)。你知道更好的方法吗?

【问题讨论】:

  • 为什么要使用两个反斜杠?标签只是\t
  • 哎哟。谢谢你。现在可以了。

标签: java csv apache-stringutils


【解决方案1】:

您已经转义了 Java 字符串 literal 中的反斜杠。所以生成的字符串由两个字符组成:一个反斜杠和一个“t”。

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

解决方法是:

private static final String COLUMN_SEPARATOR = "\t";

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2014-08-09
    • 1970-01-01
    • 2018-06-21
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多