Я хотел бы присоединиться к CSV-файлам в Ubuntu.

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 должны быть объединены в общих столбцах в их заголовке. Есть ли решение для этого, или я должен написать свой собственный скрипт для этого?

2 ответа2

0

Попробуйте команду join :

ИМЯ объединить - объединить строки двух файлов в одном поле

ОПИСАНИЕ присоединиться [ВАРИАНТ] ... ФАЙЛ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

как я уже говорил выше.

0

Вот мое решение в 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:]) )

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .