Juntando arquivos CSV no Ubuntu

0

Eu gostaria de juntar arquivos csv no 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

Os arquivos CSV de entrada devem ser unidos em colunas comuns em seus cabeçalhos. Existe uma solução de estoque para isso ou devo escrever meu próprio script para fazer isso?

Andrew Wood
fonte

Respostas:

0

Experimente o joincomando:

NAME join - junte linhas de dois arquivos em um campo comum

SINOPSE ingressa em [OPÇÃO] ... ARQUIVO1 ARQUIVO2

DESCRIÇÃO Para cada par de linhas de entrada com campos de junção idênticos, escreva uma linha na saída padrão. O campo de junção padrão é o primeiro, delimitado por espaço em branco. Quando FILE1 ou FILE2 (não ambos) for -, leia a entrada padrão.

Então você deve ser capaz de:

join file_A.csv file_B.csv > file_AB.csv

Talvez você precise unir seus primeiro e segundo campos em um para que isso funcione - pois, em essência, eles podem ser vistos como um campo de qualquer maneira.

Eu apenas verifiquei duas vezes e parece funcionar, desde que seus arquivos tenham o formato, por exemplo:

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

como eu mencionei acima.

jmetz
fonte
Eu não acho que isso funcione para mim. Eu precisaria fazer scripts para mesclar e depois dividir as colunas de ID, por isso seria igualmente fácil criar um script para a associação.
Andrew Wood
@ajwood: Isso é lamentável - nesse caso, provavelmente será necessária uma certa quantidade de scripts.
jmetz
@ajwood - veja meu comentário sobre a pergunta em si - há uma pergunta muito semelhante já publicada no stackoverflow.
jmetz
0

Aqui está a minha solução em 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:]) )
Andrew Wood
fonte