我想在 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:]) )