在 Ubuntu 中合并 CSV 文件

在 Ubuntu 中合并 CSV 文件

我想在 Ubuntu 中加入 csv 文件。

file_A.csv:
ID_a, ID_b, a,  b,  c
key_a, A,   a1, b1, c1
key_a, B,   a2, b2, c2
key_b, A,   a3, b3, c3

file_B.csv:
ID_a, ID_b, d,  e,  f
key_a, A,   d1, e1, f1
key_a, B,   d2, e2, f2
key_b, A,   d3, e3, f3

join_AB.csv
ID_a, ID_b, a, b,  c,  d,  e,  f
key_a, A,  a1, b1, c1, d1, e1, f1
key_a, B,  a2, b2, c2, d2, e2, f2
key_b, A,  a3, b3, c3, d3, e3, f3

输入的 CSV 文件应在其标题的公共列上进行连接。是否有现成的解决方案,还是我应该编写自己的脚本来完成此操作?

答案1

尝试以下join命令:

NAME 连接 - 根据公共字段连接两个文件的行

概要 加入 [选项]... 文件1 文件2

描述 对于每对具有相同连接字段的输入行,将一行写入标准输出。默认连接字段是第一个,以空格分隔。当 FILE1 或 FILE2(不是两者)为 - 时,读取标准输入。

所以你应该能够做到:

join file_A.csv file_B.csv > file_AB.csv

您可能必须将第一个字段和第二个字段合并为一个才能使其工作 - 因为本质上它们可以看作一个字段。

我刚刚仔细检查了一下,只要您的文件具有以下格式,它似乎就可以工作:

file_A.csv
ID_aID_b, a,  b,  c
key_aA,   a1, b1, c1
key_aB,   a2, b2, c2
key_bA,   a3, b3, c3

正如我上面提到的。

答案2

这是我在 Python 中的解决方案

import sys
import csv

def main(args):
    # store each header we read
    headers = []

    # Intersect headers to get our keys
    for arg in args:
        with open(arg) as f:
            curr = csv.reader(f).next()
            headers.append(curr)
            try:
                keys = list( set(keys) & set(curr) )
            except NameError:
                keys = curr

    # New header
    header = list(keys)
    for h in headers:
        header += [ k for k in h if k not in keys ]

    # Join data
    data = {}
    for arg in args:
        with open(arg) as f:
            reader = csv.DictReader(f)
            for line in reader:
                data_key = tuple([ line[k] for k in keys ])
                if not data_key in data: data[data_key] = {}
                for k in header:
                    try:
                        data[data_key][k] = line[k]
                    except KeyError:
                        pass

    # Drop keys that are missing data (keys not present in all files)
    for key in data.keys():
        for col in header:
            if key in data and not col in data[key]:
                del( data[key] )

    # Dump data
    print ','.join(header)
    for key in sorted(data):
        row = [ data[key][col] for col in header ]
        print ','.join(row)


if __name__ == '__main__':
    sys.exit( main( sys.argv[1:]) )

相关内容