【问题标题】:Add missing columns to CSV file?将缺少的列添加到 CSV 文件?
【发布时间】:2020-11-18 12:26:03
【问题描述】:

开始问题

我有一个这样形成的 CSV 文件 (variable.csv)

E,F,G,H,I,J
a1,
,b2,b3
c1,,,c4,c5,c6

如您所见,第一列和第二列没有所有需要的逗号。这就是我想要的:

E,F,G,H,I,J
a1,,,,,
,b2,b3,,,
c1,,,c4,c5,c6

有了这个,现在每一行都有正确的列数。换句话说,我正在寻找一个 unix 命令,它巧妙地将正确数量的逗号附加到每行的末尾,以根据标题使该行具有我们期望的列数.

根据一些搜索,这是我尝试过的: awk -F, -v OFS=, 'NF=6' variable.csv。这适用于上述情况,但是...

最后一个问题

...如果列数据本身包含逗号,甚至是换行符,我们可以让这个命令工作吗?例如

E,F,G,H,I,J
"a1\n",
,b2,"b3,3"
c1,,,c4,c5,c6

E,F,G,H,I,J
"a1\n",,,,,
,b2,"b3,3",,,
c1,,,c4,c5,c6

(如果此示例的格式因换行符的表示方式而导致格式错误,请致歉。

【问题讨论】:

  • 您的命令似乎适用于您的示例。 NF=6 是一个赋值,返回 true,然后用额外的逗号打印。有没有行不行?
  • @thanasisp 是的,这似乎是特定于机器的问题。此外,我意识到我的问题的核心缺少一个关键部分,所以我更新了主要问题以添加它。
  • awk -v FPAT='([^,]*)|("[^"]+")' -v OFS=, 'NF=6' variable.csv 将起作用,忽略引用文件中的逗号。见:stackoverflow.com/questions/29642102/…

标签: bash shell unix awk command


【解决方案1】:

简答:

python3 -c 'import fileinput,sys,csv;b=list(csv.reader(fileinput.input()));w=max(len(i)for i in b);print("\n".join([",".join(i+[""]*(w-len(i)))for i in b]))' variable.csv

python 脚本可能很长,但这是为了确保处理所有情况。分解:

import fileinput,csv
b=list(csv.reader(fileinput.input()))                       # create a reader obj
w=max(len(i)for i in b)                                     # how many fields?
print("\n".join([",".join(i+[""]*(w-len(i)))for i in b]))   # output

顺便说一句,在你的起始问题中

awk -F, -v OFS=, 'NF<6{$6=""}1' variable.csv

应该可以。 (我认为它与实现或版本相关。您的代码适用于 GNU awk 但不适用于 Mac 版本。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2015-08-12
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多