【问题标题】:Regarding Java Split Command Parsing Csv File关于 Java Split 命令解析 Csv 文件
【发布时间】:2011-01-15 13:16:14
【问题描述】:

我有一个以下格式的 csv 文件。

H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,,

我需要 split 命令忽略双引号内的逗号。所以我使用了之前帖子中的以下拆分命令。粘贴了我执行此命令的 URL

String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
System.out.println("items.length"+items.length);

Java: splitting a comma-separated string but ignoring commas in quotes

当我运行此 CSV 数据时,我将 items.length 打印为 8。“NEW”之后行尾的最后两个逗号被忽略。我希望 split 命令拾取这些逗号并将长度返回为 10。如果它在结尾,它不会拾取空逗号,但如果它在字符串的中间,它会拾取它。不确定我需要在 split 命令中修改什么来解决这个问题。同样在 csv 文件中,文本字段内容中的双引号可以重复(例如“此帐户是一个“大”的帐户”)

【问题讨论】:

    标签: java csv split


    【解决方案1】:

    正则表达式没有任何问题。问题是split最后会丢弃空匹配:

    此方法的工作方式就像通过调用 两参数拆分方法与 给定表达式和限制参数 为零。尾随空字符串是 因此不包括在 结果数组。

    一种解决方法是提供一个大于 CSV 文件中您期望的列数的参数:

     String[] tokens = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", 99);
    

    【讨论】:

    • 其实指定-1而不是99不是更好吗?根据文档,0 和非正数之间的区别在于 0 “将丢弃尾随的空字符串。”
    • @R. Bemrose:我错过了那一点,但如果你是对的,那听起来更好。
    • @bemrose 你们太棒了!感谢您的帮助,尽管我几乎破解了 reg exp :D
    【解决方案2】:

    我今天遇到了同样的问题,并为 csv 文件找到了一个简单的解决方案:在执行拆分时添加一个仅包含一个空格的额外字段:

    (line + ", ").split(",");
    

    这样无论csv文件末尾可能存在多少个连续的空字段,split()都会返回n+1个字段

    示例会话(使用 bsh)

    bsh % line = "H,\"TestItems_20100107.csv\",07/01/2010,20:00:00,\"TT1198\",\"MOBb\",\"AMD\",NEW,,
    bsh % System.out.println(line);
    H,"TestItems_20100107.csv",07/01/2010,20:00:00,"TT1198","MOBb","AMD",NEW,,
    bsh % String[] items = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
    bsh % System.out.println(items.length);
    8
    bsh % items = (line + ", ").split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
    bsh % System.out.println(items.length - 1 );
    10
    bsh %
    

    【讨论】:

    • 你能使用块引用来提高可读性吗?很难读懂你的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    相关资源
    最近更新 更多