Existe uma maneira de fazer uma junção interna no Excel entre 2 arquivos csv?

2

Isso parece um conceito simples, mas não consigo descobrir uma maneira de fazer isso sem escrever algum código. O Excel tem uma função que me permitirá unir colunas de dois arquivos csv diferentes (digamos Orders e OrderDetails) com base em uma coluna de ID compartilhada e criar um csv composto com colunas de ambos?

    
por James Cadd 05.05.2012 / 20:50

3 respostas

2

Isso é possível no MSQuery, embora você tenha que configurar uma fonte de dados no ODBC

Estanãoéumafunção,masvocêdeveacharissorelativamentesimplesdeimplementar.Aajudafornecedocumentaçãosobrecomorealizardiferentesjunçõestambém

O SQL msquery resultante cria é:

    
por 07.05.2012 / 18:02
2

Sim, existe. É um pouco hacky, mas muito melhor do que ter que escrever código.

Exemplo:

  • Set1 = Alice, Bob, Charlie, Echo, Foxtrot, Lima
  • Set2 = Bob, Charlie, Foxtrot, Lima, Mike, novembro, Zebra

Coloque os dois conjuntos em colunas separadas, com uma coluna no meio.

  A       B          C
1 Set1    JoinColumn Set2
2 Alice              Bob
3 Bob                Charlie
4 Charlie            Foxtrot
5 Echo               Lima
6 Foxtrot            Mike
7 Lima               November
8                    Zebra

Na célula B2, insira esta fórmula

==IF(COUNTIF($A$2:$A$8,C3)>0,C3,"<NULL>")

A primeira parte $ A $ 2: $ A $ 8 é o intervalo de células do Set1. Os símbolos $ mantêm um intervalo estático, para que você possa copiar e colar em novas células e o intervalo permaneça o mesmo. O C3 é a célula imediatamente à direita da célula atual na qual você está ingressando.

Copie e cole tudo até o fim, e (mostrando fórmulas para demonstração) você terá isto:

  A       B                                        C
1 Set1    JoinColumn                               Set2
2 Alice   =IF(COUNTIF($A$2:$A$8,C3)>0,C3,"<NULL>") Bob
3 Bob     =IF(COUNTIF($A$2:$A$8,C4)>0,C4,"<NULL>") Charlie
4 Charlie =IF(COUNTIF($A$2:$A$8,C5)>0,C5,"<NULL>") Foxtrot
5 Echo    =IF(COUNTIF($A$2:$A$8,C6)>0,C6,"<NULL>") Lima
6 Foxtrot =IF(COUNTIF($A$2:$A$8,C7)>0,C7,"<NULL>") Mike
7 Lima    =IF(COUNTIF($A$2:$A$8,C8)>0,C8,"<NULL>") November
8         =IF(COUNTIF($A$2:$A$8,C9)>0,C9,"<NULL>") Zebra

que será realmente assim:

1 Set1    JoinColumn Set2
2 Alice   Bob        Bob
3 Bob     Charlie    Charlie
4 Charlie Foxtrot    Foxtrot
5 Echo    Lima       Lima
6 Foxtrot <NULL>     Mike
7 Lima    <NULL>     November
8         <NULL>     Zebra

Mais algumas etapas:

  • Copie a coluna B e Cole especial em si, cole Valores
  • Excluir coluna A

Agora você tem uma junção externa direta simples

  • Ordenar por coluna B
  • exclua as linhas de valor

Você tem a junção interna

Deixo como um exercício para o leitor lidar com várias tabelas de colunas.

Ok, darei o método mais simples e mais ineficiente que me ocorre: faça a junção interna em ambas as direções, ordene cada conjunto no campo de junção e coloque os resultados lado a lado. Eles devem se alinhar. (Nota: isso só funcionaria se a coluna de junção contivesse valores exclusivos)

    
por 10.08.2012 / 17:30
1

Eu não usaria o Excel para realizar essa tarefa. Em vez disso, eu usaria um programa de linha de comando chamado join.exe . Isto é o que é projetado para fazer. Ele está separado de UnxUpdates.zip .

A sintaxe é direta:

Usage: join [OPTION]... FILE1 FILE2
For each pair of input lines with identical join fields, write a line to
standard output.  The default join field is the first, delimited
by whitespace.  When FILE1 or FILE2 (not both) is -, read standard input.

  -a FILENUM        print unpairable lines coming from file FILENUM, where
                      FILENUM is 1 or 2, corresponding to FILE1 or FILE2
  -e EMPTY          replace missing input fields with EMPTY
  -i, --ignore-case ignore differences in case when comparing fields
  -j FIELD          equivalent to '-1 FIELD -2 FIELD'
  -o FORMAT         obey FORMAT while constructing output line
  -t CHAR           use CHAR as input and output field separator
  -v FILENUM        like -a FILENUM, but suppress joined output lines
  -1 FIELD          join on this FIELD of file 1
  -2 FIELD          join on this FIELD of file 2
      --help     display this help and exit
      --version  output version information and exit

Unless -t CHAR is given, leading blanks separate fields and are ignored,
else fields are separated by CHAR.  Any FIELD is a field number counted
from 1.  FORMAT is one or more comma or blank separated specifications,
each being 'FILENUM.FIELD' or '0'.  Default FORMAT outputs the join field,
the remaining fields from FILE1, the remaining fields from FILE2, all
separated by CHAR.

Important: FILE1 and FILE2 must be sorted on the join fields.

A última linha é muito importante! Dentro deste mesmo arquivo zip, inclui sort.exe , que pode classificar os arquivos para você. Ou você também pode classificar os arquivos com o Excel.

    
por 07.05.2012 / 19:29