Como juntar dois arquivos CSV?


22

Suponha que você tenha um arquivo CSV com 2 campos: ID e email. Você tem outro arquivo com 2 campos: email e nome. Como você pode produzir um arquivo com todos os três campos unidos por email?


5
Um pouco mais de detalhes sobre a junção (interna, externa, esquerda). A lista de e-mails no 1º CSV é idêntica à segunda lista? Ou um contém mais?
hyperslug

Exemplos de arquivos csv seriam úteis, juntamente com o sistema operacional que você está usando?
Troggy 20/08/09

Eu acho que a primeira e a segunda lista são idênticas. Eu estou usando Linux. Por favor ajude!!! obrigado!! :)
crst53 21/08/09

1
qual o tamanho dos dados?
21609 Joshua

Respostas:


24

Revisão3 :

Você deve classificar as duas listas por email em ordem alfabética e depois participar. Dado que o campo de email, o 2º campo do arquivo1 e o 1º campo do arquivo2:

sort -t , -k 2,2 file1.csv > sort1.csv
sort -t , -k 1,1 file2.csv > sort2.csv
join -t , -1 2 -2 1 sort1.csv sort2.csv > sort3.csv

significado do parâmetro

-t,: ',' é o separador de campos
-k 2,2: ordenação de caracteres no 2º campo
-k 1,1: ordenação de caracteres no 1º campo
-1 2: arquivo 1, segundo campo
-2 1: arquivo 2, primeiro campo
>: saída para o arquivo

produz

email, ID, nome
email, ID, nome
...

classificados por email em ordem alfabética.

Observe que, se algum email estiver faltando em qualquer arquivo, ele será omitido nos resultados.


2
O CSV é mais complicado que isso. O separador de campos pode ser escapado, por exemplo.
Pguardiario

@hyperslug posso fazer junção externa completa?
Abu Shoeb

Isso não funcionará se o CSV estiver misturado entre aspas / não, se o ID contiver uma vírgula. Use esta solução apenas para processamento único, em que você verifica o resultado. Mas eu recomendo não usá-lo para um script em nível de produção.
Ondra Žižka

25

Use o csvkit :

csvjoin -c email id_email.csv email_name.csv

ou

csvjoin -c 2,1 id_email.csv email_name.csv

4
Por que essa não é a resposta principal?
28915 alexg

ferramenta incrível. Mesmo reconhecido, que um dos meus arquivos tem um delimitador diferente de ",".
D_K

6

Talvez seja um exagero, mas você pode importar para um banco de dados (por exemplo, OpenOffice Base) como dois tipos de tabelas e definir um relatório com a saída desejada.

Se a importação de CSV for um problema, um programa de planilha (por exemplo, OpenOffice Calc) poderá fazer a importação. O resultado pode ser facilmente transferido para o banco de dados.


4

Como referência futura, você pode querer começar a brincar com o AWK . É uma pequena linguagem de script muito simples que existe de alguma forma em todos os sistemas * nix e sua única missão é a vida é a manipulação de bancos de dados textuais delimitados padrão. Com algumas linhas de script descartável, você pode fazer algumas coisas muito úteis. O idioma é pequeno e elegante e possui uma melhor relação utilidade / complexidade do que qualquer outra coisa que eu conheça.


Perl é, sob muitos aspectos, um sucessor do awk.
Reinierpost 14/09/10

O awk não lida com citações e escapes (por exemplo, lidar com s em um arquivo CSV separado) até onde eu sei. Se você precisar, é mais fácil usar uma biblioteca dedicada de manipulação de CSV; eles existem para muitos idiomas.
Reinierpost 14/09/10

0

Use Go: https://github.com/chrislusf/gleam

package main

import (
    "flag"
    "os"

    "github.com/chrislusf/gleam"
    "github.com/chrislusf/gleam/source/csv"
)

var (
    aFile = flag.String("a", "a.csv", "first csv file with 2 fields, the first one being the key")
    bFile = flag.String("b", "b.csv", "second csv file with 2 fields, the first one being the key")
)

func main() {

    flag.Parse()

    f := gleam.New()
    a := f.Input(csv.New(*aFile))
    b := f.Input(csv.New(*bFile))

    a.Join(b).Fprintf(os.Stdout, "%s,%s,%s\n").Run()

}

0

Experimente o CSV Cruncher .

Ele usa arquivos CSV como tabelas SQL e, em seguida, permite consultas SQL, resultando em outro arquivo CSV ou JSON.

Para o seu caso, basta ligar para:

crunch -in tableA.csv tableB.csv -out output.csv \
   "SELECT tableA.id, tableA.email, tableB.name 
    FROM tableA LEFT JOIN tableB USING (email)"

A ferramenta precisa do Java 8 ou posterior.

Algumas das vantagens:

  • Você realmente recebe suporte para CSV, e não apenas "vamos supor que os dados estejam corretos".
  • Você pode participar de várias chaves.
  • Mais fácil de usar e entender as joinsoluções do que as baseadas.
  • Você pode combinar mais de 2 arquivos CSV.
  • Você pode ingressar nas expressões SQL - os valores não precisam ser os mesmos.

Disclaimer: Eu escrevi essa ferramenta. Costumava estar desarrumado após o fechamento do Google Code, mas eu o revivei e adicionei novos recursos à medida que o uso.


0

Você pode ler o arquivo CSV com um programa de planilha como o LibreOffice e usar VLOOKUP()macro para procurar o nome no segundo arquivo.


7
A extensão do arquivo xlsx implica o Microsoft Excel e acho que o VLOOKUP também. Esta questão está identificada com Linux. O Microsoft Excel está disponível para Linux?
Peter Mortensen

Agora, o LibreOffice também possui o VLOOKUP .
Cristian Ciupitu

-1

Você também pode usar uma ferramenta projetada especificamente para ingressar em arquivos csv, como a encontrada em https://filerefinery.com

As operações atualmente suportadas são: Juntando arquivos csv. É possível executar o equivalente em SQL das operações de junção externa, interna, esquerda e direita em dois arquivos csv. Qual coluna será usada como uma chave de junção em cada um dos arquivos é configurável.


Cite as partes essenciais da resposta nos links de referência, pois a resposta pode se tornar inválida se as páginas vinculadas forem alteradas.
DavidPostill

Não existe mais.
Ondra Žižka
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.