我有类似的问题将多个 .csv 文件的内容合并到单个 .csv 文件中但对于不同长度的csv文件。
我应该添加什么这个答案中的perl脚本,为了考虑不同长度的csv文件?
如果您知道如何以其他方式执行此操作,请随时提出建议。
答案1
paste -d, 1.csv 2.csv | sed 's/^,//; s/,$//' > out.csv
应该能解决问题
paste
将按照指定文件的顺序按列合并。使用csv 格式来维护-d,
。但是粘贴会将空行视为条目并插入逗号。这是用sed
命令删除的。
这也将执行与链接问题相同的任务。
答案2
这是使用 awk 来确保所有行获得相同数量的字段的技巧。
我假设第一个 csv 文件具有最大行数:如果不是这种情况,则无法工作。
$ cat 1.csv
a,b,c
d,e,f
g,h,i
$ cat 2.csv
foo,bar
baz,qux
$ paste -d, {1,2}.csv
a,b,c,foo,bar
d,e,f,baz,qux
g,h,i,
$ paste -d, {1,2}.csv | awk -F, -vOFS=, 'NR == 1 {n = NF} NF < n {NF = n} 1'
a,b,c,foo,bar
d,e,f,baz,qux
g,h,i,,
这可能需要 GNU awk 来设置 NF 变量。
答案3
忍不住为此创建了一个小型 Python 脚本。保存到文件,例如mergecols.py
,使其可执行并输出
./mergecols.py 2.csv 1.csv 1.csv 2.csv 2.csv 1.csv
将
foo,bar,a,b,c,a,b,c,foo,bar,foo,bar,a,b,c
baz,qux,d,e,f,d,e,f,baz,qux,baz,qux,d,e,f
,,g,h,i,g,h,i,,,,,g,h,i
(与1.csv
另一个2.csv
答案)。这是脚本:
#!/usr/bin/env python
import sys
fileNames = sys.argv[1:]
files = [ open(n, "rt") for n in fileNames ]
numberOfColumns = [ None ] * len(fileNames)
while True:
newParts = [ ]
foundEntries = False
for idx in range(len(files)):
line = files[idx].readline()
if line:
parts = line.strip().split(",")
if numberOfColumns[idx] is None:
numberOfColumns[idx] = len(parts)
else:
if numberOfColumns[idx] != len(parts):
raise Exception("Number of columns in '{}' changed".format(fileNames[idx]))
newParts += parts
foundEntries = True
else:
if numberOfColumns[idx] is None:
raise Exception("{} does not appear to contain lines".format(fileNames[idx]))
newParts += [ "" ] * numberOfColumns[idx]
if not foundEntries:
break
sys.stdout.write(",".join(newParts) + "\n")