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?


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.


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:]) )
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.