使用linux命令清理CSV文件,同时忽略引号之间的逗号

使用linux命令清理CSV文件,同时忽略引号之间的逗号,linux,csv,quotes,Linux,Csv,Quotes,我有一个相当大的CSV文件,偶尔需要导入到PostgreSQL数据库中,但它实际上总是包含太多错误,无法使用SQL COPY命令导入。通过使用以下awk命令,我成功地解决了引号位于不应该出现引号的位置的问题: awk-F\“'NF%2==1{print$0}”。/db_downloaded.csv>/db_sanitized.csv 这会删除任何带有奇数引号的行,效果非常好。我遇到的另一个常见问题是列数不正确。我目前解决此问题的方法是使用以下awk命令删除任何带有错误逗号数的行: awk-F“,

我有一个相当大的CSV文件,偶尔需要导入到PostgreSQL数据库中,但它实际上总是包含太多错误,无法使用SQL COPY命令导入。通过使用以下awk命令,我成功地解决了引号位于不应该出现引号的位置的问题:

awk-F\“'NF%2==1{print$0}”。/db_downloaded.csv>/db_sanitized.csv

这会删除任何带有奇数引号的行,效果非常好。我遇到的另一个常见问题是列数不正确。我目前解决此问题的方法是使用以下awk命令删除任何带有错误逗号数的行:

awk-F“,“'NF==40{print$0}”。/db_sanitized.csv>/db_sanitized2.csv

但是,这会使它删除任何在引号之间有逗号的行,这实际上是相当多的行。现在,导入每一行并不是那么重要,但是如果我有一种方法可以只计算一行引号之间没有出现的逗号,我真的很想这样做。我能想到的唯一方法是有一些boo每次流中有引号时都会翻转的lean变量,这将关闭逗号检查,但我不确定如果要这样做,我将从哪里开始

我最感兴趣的是使用Linux命令,比如GRIP、AWK、TR等,我可以在远程服务器上运行,而不是编写自己的C++程序,但是如果没有其他方法,我可能不得不走那个路线。 编辑:我最终使用了以下ruby脚本:

lines = File.new("/home/db/product_list.csv", "r")
sanitized = File.new("/home/db/product_list_sanitized.csv", "w")

lines.each do |l|
  if l.count("\"") % 2 == 0
    if l.count(",") > 39
      u = true
      commas = 0
      l.each_char do |c|
        if (c == "\"")
          u = (not u)
        elsif (u && (c == ","))
          commas += 1
        end
      end
      sanitized.write(l) if commas == 39
    else
      sanitized.write(l)
    end
  end
end

sanitized.close

隐藏原始行,将所有引号集替换为性能更好的标记,并进行检查;如果匹配,则打印原始行:

awk -F, '{line=$0;gsub(/"[^"]*"/,"x")}NF%2{print line}' test.in

隐藏原始行,将所有引号集替换为性能更好的标记,并进行检查;如果匹配,则打印原始行:

awk -F, '{line=$0;gsub(/"[^"]*"/,"x")}NF%2{print line}' test.in

你可以看看,但这更多的是为了操纵格式良好的CSV,而不是修复格式错误的CSV。难道你不能让据称是CSV文件的提供者来修复其数据生成中的错误吗?实际上,我最终通过使用ruby脚本逐行读取CSV,挑出带有奇数引号的行,并在正确的逗号数,然后逐字节遍历这些行,每次发现引号时切换一个布尔值。如果布尔值为“true”,这意味着逗号在引号之间。修复错误的CSV确实需要类似于Ruby的东西——我会使用Perl,Python也可以,如果你使用Ruby的话,Ruby是有意义的。收拾烂摊子真的很难;您应该发起活动以获得发送给您的干净的CSV文件。您可以查看,但这更多是为了操作格式良好的CSV,而不是修复格式错误的CSV。你不能让所谓的CSV文件的提供者来修复数据生成中的错误吗?事实上,我最终通过使用ruby脚本逐行读取我的CSV文件,挑出带有奇数引号和不正确逗号的行,然后逐字节检查这些行,每次发现引号时切换布尔值。如果布尔值为“true”,这意味着逗号在引号之间。修复错误的CSV需要类似于Ruby的东西-我会使用Perl,Python也可以,Ruby是有意义的,如果你使用的是Ruby。收拾烂摊子真的很难;你应该发起活动以获得发送给你的干净的CSV文件。我实际上使用了ruby脚本来修复它,结果没有问题,因为我需要使用ruby脚本进行其他操作。我实际上使用了ruby脚本来修复它,结果没有问题,因为我需要使用ruby脚本进行其他操作。