【问题标题】:How to clean a csv file where fields contains the csv separator and delimiter如何清理字段包含 csv 分隔符和分隔符的 csv 文件
【发布时间】:2015-11-01 00:16:21
【问题描述】:

我目前正在努力清理使用 sed 或 awk 或通过脚本自动生成的包含 csv 分隔符和字段分隔符的字段的 csv 文件。

源软件没有可用于改善情况的设置。

csv 格式:

"111111";"text";"";"text with ; and " sometimes "; or ;" multiple times";"user";

幸运的是,csv 格式“很好”,导出软件不会转义或替换字段中的“禁止”字符。

这几天我试图提高我对正则表达式的了解,并找到表达式来清理文件,但我失败了。

到目前为止我所做的事情:

RegEx 查找字段(我想查找字段并在内部执行替换,但我没有找到方法)

(?:";"|^")(.*?)(?=";"|";\n)

查找分号的正则表达式,如果分号是字段的最后一个字符,则不起作用,每个字段只能找到一个。

(?:^"|";")(?:.*?)(;)(?:[^"\n].*?)(?=";"|";\n)

RegEx 查找双引号,似乎在在线正则表达式测试器中选择该行的第一个双引号

(?:^"|";")(?:.*?)[^;](")(?:[^;].*?)(?=";"|";\n)

我想在字段中的每个字符之间添加空格,然后搜索单独的分号和双引号,然后删除单个空格,但我不知道这是否可行,而且似乎是一个糟糕的解决方案。

【问题讨论】:

    标签: bash csv scripting


    【解决方案1】:

    如果 CSV 本身没有显式错误,任何标准库都应该能够处理它。这就是我们有引号字符和转义字符的原因。

    当您自己创建 CSV 时 - 您可能会忘记处理此类情况并让您的最终输出文件使用这种情况。 AWK 不是 CSV 阅读器,而只是一个文本处理实用程序。

    这是您的行应该看起来的样子。

    "111111";"text";"";"text with \; and \" sometimes \"; or ;\" multiple times";"user";
    

    因此,如果您仍然可以重新获取数据,请找到一种方法来导出 CSV,或者通过您使用的语言的数据库自身的 csv 库功能。

    在 python 中,这看起来像这样:-

    mywriter = csv.writer(csvfile, delimiter=';', quotechar='"', escapechar="\\")
    

    但是如果你不能再次创建 csv,唯一的希望是你期望在字段中出现一些模式,就像这个问题一样:- parse a csv file that contains commans in the fields with awk

    但这在文本数据中很少出现——尤其是网页上的 cmets 或帖子。在这种情况下,另一个想法是使用 '\t' 作为分隔符。

    【讨论】:

    • 感谢您的回答。可悲的是,我无法更改软件的输出,也无法访问它的数据库。而且字段是用户输入的cmets,里面没有模式。我需要将此数据加载到 mysql 数据库中,并且我使用“加载数据 infile”功能,但它无法处理这些记录。
    • 您是如何获得数据的?您绝对可以要求负责将数据交给您的人使用其他分隔符(如 '\t')或使用转义字符来确保格式正确。您必须简单地告知他们数据不可解析。
    • 完全无法控制 csv 格式,仅导出的行和列。我将更多地研究 awk 函数。从您的链接中,我了解到您可以将正则表达式用作 awk 的字段分隔符,我认为只有单个字符是可能的。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 2018-11-20
    • 1970-01-01
    • 2013-10-16
    • 2011-06-16
    • 2021-12-17
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多