gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:11 49 4
gpt4 key购买 nike

我有一个相当大的 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

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

我最感兴趣的是使用 grep、awk、tr 等我可以在远程服务器上运行的 linux 命令,而不是编写我自己的 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

关于linux - 使用 linux 命令清理 CSV 文件,同时忽略引号之间的逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18319420/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com