【问题标题】:Find a pattern and replace an element of it找到一个模式并替换它的一个元素
【发布时间】:2016-02-16 08:13:56
【问题描述】:

我有以下问题:

我正在尝试拆分 CSV 文件的行,但问题是有时我会阅读以下行:

string input = "a,b,c,d,\"V=12.503,I=0.194\",e,f"

我使用下面的代码

string[] SplittedLine= input.split(',');

结果是我得到了一个额外的列,因为数据 \"V=12.503,I=0.194\" 里面有一个逗号,但是当我用 excel 打开 CSV 文件时,我注意到 Excel 没有添加额外的列,因为它没有拆分它数据分为两个不同的数据。考虑到这种情况,如何正确拆分此 CSV 文件?

【问题讨论】:

    标签: c# csv


    【解决方案1】:

    您在 CSV 的“单元格”中遇到逗号,按照惯例(但不是任何标准)通过用双引号将单元格数据括起来来进行转义。您还需要注意,引号转义的字符串可以包含引号文字。

    假设你有一个名字列,而某人的名字是

    小乔纳森“杰克”史密斯

    这将被编码为

    “乔纳森”“杰克”“小史密斯”

    您当然可以改进您的代码来处理这些情况。不过,这个问题之前已经解决了。如果您不想重新发明轮子,有许多可靠的开源库可以解决解析 CSV 文件的难题。我用的是

    http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

    【讨论】:

    • 感谢您的快速回答。这里的事情是我已经在使用我自己的库并且我发现了这个问题。我正在寻找一种方法来检测他的案件。我正在考虑寻找以下模式 \"string\" 并将逗号替换为其他字符,但我对模式了解不多。
    • 那行不通。你最终会得到"a,b,c,d,V=12.503,I=0.194,e,f",它的列比你预期的要多。您需要正确处理这样一个事实,即单元格周围的双引号意味着双引号之间的逗号不是单元格分隔符而是实际数据。
    • 我支持“不要重新发明轮子”阵营。结构化文本解析并不新鲜。有人优化了解决方案并处理了所有边缘情况。如果你必须自己做,也许在许多开放的源头上看看他们是如何处理问题的?
    • 如果您要我为您编写处理引号的代码,我不会重新发明轮子。如果您想自己尝试并遇到困难,请针对该新代码提出一个新问题,您会找到很多帮助。
    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 2015-03-26
    • 2017-04-23
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    相关资源
    最近更新 更多