将多个不同长度的 .csv 文件合并到一个文件中

将多个不同长度的 .csv 文件合并到一个文件中

我有类似的问题将多个 .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")

相关内容