Trocar valores [RESOLVIDO]

1. Trocar valores [RESOLVIDO]

Erick Castilho Tadei
spawnlecastilho

(usa Debian)

Enviado em 05/07/2012 - 20:50h

Senhores boa noite
tenho uma grande duvida, possuo dois arquivos "csv"

arq1.csv e arq2.csv

no arq1.csv tenho os seguintes campos onde ID seria a chave primaria.

DATA HORA CN MSISDN ID SONG NAME CP PRICE ARTIST ISRC UPC


no arq2.csv tenho os seguintes campos onde Clip_id seria a chave primaria.

Clip_id Clip_name CP Price Artist ISRC UPC


ou seja o mesmo valor do campo ID do arq1 tem no campo Clip_id no arq2

o que eu preciso fazer é o seguinte

verificar no arq2 Clip_id se no arq1 tiver o mesmo valor, então pegar os campos

Clip_name CP Price Artist ISRC UPC

e substituir no arq1 os campos

SONG NAME CP PRICE ARTIST ISRC UPC


lembrando que no arq1 pode conter 10 ou mais linhas com o mesmo ID e no arq2 não tem repetição de Clip_id

ou seja preciso pegar o resultado do arq2 clip_id 2222

e substitur todos os ID 2222 do arq1

se puderem me ajudar eu agradeço


  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 11/07/2012 - 23:02h

Remover o "UNKNOWN" precisa de uma pequena alteração, colocando outro "sed" ao final.

Apenas se houvesse outra chave é que poderiam ser substituídos.

Só se houver algo que possa preencher.

Quanto ao caso de se apagar os "UNKNOWN" aviso que deve-se pensar bem em qual será o critério.

São muitas as linhas quw poderiam ser apagadas apenas por ter algum conteúdo com isto.

Isto se for o caso de deixar alguma.

Eliminar todas em que haja ao menos uma ocorrência é mais fácil.

Depois do "while" seria o caso de se colocar isto aqui dentro do script:

sed "/UNKNOWN/d" -i arquivo3.csv 


Mas aviso que seriam eliminadas quase umas 6000 linhas.

Pode comparar o antes (arquivo1.csv) e o depois (arquivo3.csv ao final de como o script o deixou até este ponto da postagem) que eles devem possuir o mesmo número de linhas.

wc -l arquivo1.csv 


e

wc -l arquivo3.csv 


Dará ***o mesmo*** resultado.

Depois de
sed "/UNKNOWN/d" -i arquivo3.csv 


verificando-se o número de linhas com

wc -l arquivo3.csv 


percebe-se que faltarão umas 6000 linhas quase.

Não há problema se arquivo3.csv sofrer alguma modificação ingrata.

arquivo1.csv foi preservado e é só rodar o script de novo.

****

Outra coisa: há uma diferença entre Unix e MSDOS quando se trata de arquivos que contenham texto como esse aí, ou qualquer conteúdo semelhante, seja um script, csh, html, xml etc.

No DOS o final de linha é marcado por dois caracteres chamados aqui de "\r" e "\n".

No Unix o final de linha é marcado apenas pelo "\n".

"\n" é aquele mesmo que aparece em linguagem C.

Prá converter texto de Unix para DOS, retira-se o "\r", ou seja, substituir "\r" e "\n" por "\n".

Prá converter texto de Unix para DOS, coloca-se-se o "\r", ou seja, substituir "\n" por "\r" e "\n".

Tem um terceiro sistema em que aparece apenas o "\r" mas não convém no momento.

****

O caso é que eu eliminei uma meia-dúzia de "\r" perdidos na cópia dos arquivos.

Eles estão como texto de Unix no momento.

Só ficará estranho se um dos arquivo tentar ser aberto em ***editor de texto*** tipo o bloco de notas do win.

Programas que suportem ambos os formatos de texto não terão problema.





3. Re: Trocar valores [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 06/07/2012 - 00:12h

vc tem uma réplica disso em banco de dados ;-) ? Pois ficaria bem mais fácil e mais rápido fazer com SQL


4. Re: Trocar valores [RESOLVIDO]

Erick Castilho Tadei
spawnlecastilho

(usa Debian)

Enviado em 06/07/2012 - 11:47h

Infelizmente não tenho, o pessoal sempre me envia em csv mesmo.




5. Re: Trocar valores [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 07/07/2012 - 00:54h

Olá.

Não testei a solução porque não criei arquivos de teste.
É um princípio simples.
A expressão regular dentro do comando "sed" pode não estar totalmete correta por precisar de barras ao contrário "\" para caracteres como dólar "$" não funcionarem como metacaracteres.

Explicação:

* arquivo1.csv e arquivo2.csv seguem o modelo da postagem original;
* cópia de segurança para arquivo3.csv, a fim de não estragar arquivo1.csv;
* while read arq2 ... done < arquivo2.csv lê linha a linha de arquivo2.csv e joga esta linha temporariamente na variável arq2;
* id_arq2 é o primeiro campo de arquivo2.csv, correspondente a id
* o comando sed procura em todo o texto de arquivo3.csv a posição nas linhas idêntica à id de arquivo2.csv e substitui todo o restante da linha incluindo a id em arquivo3.csv pelo conteúdo da linha de id igual em arquivo2.csv
* o loop repete tudo isto até o fim de arquivo2.csv ser encontrado

#!/bin/bash

# copiando para seguranca
cp arquivo1.csv arquivo3.csv

# trabalhando na copia arquivo3.csv e deixando arquivo1.csv intacto

while read arq2; do

id_arq2=$(echo $arq2 | cut -d',' -f1);

sed "s/\b$id_arq2\b\,.*$/$arq2/g" -i arquivo3.csv

done < arquivo2.csv;



6. Re: Trocar valores [RESOLVIDO]

Erick Castilho Tadei
spawnlecastilho

(usa Debian)

Enviado em 07/07/2012 - 13:30h

Blz vou testar ainda hoje e posto se funcionou ou não
de qualquer maneira muito obrigado por ajudar
:)


7. Re: Trocar valores [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 07/07/2012 - 18:18h

Se alguém mais puder dizer se a expressão regular usada no sed está certa, eu agradeceria.


8. Re: Trocar valores [RESOLVIDO]

Erick Castilho Tadei
spawnlecastilho

(usa Debian)

Enviado em 10/07/2012 - 13:10h

estava testando quase funcionou.

voce por um acaso teria um e-mail para que eu possa te mandar os dois CSV?

o arquivo1.csv possui esses campos

DATA HORA CN MSISDN ID SONG NAME CP PRICE ARTIST ISRC UPC
20120426 100726 18 1897520251 2574792 UNKNOWN UNKNOWN 3.99 UNKNOWN NULL NULL
20120426 94806 21 2171440784 2574792 UNKNOWN UNKNOWN 3.99 UNKNOWN NULL NULL


e no arquivo2.csv possuo esses campos e info

Clip_id Clip_name CP Price Artist ISRC UPC
2574792 24 horas Sony-Brazil 3.99 Cassiane BRSME1100463 4115858
2533004 40 GRAUS DE CALOR IMUSICA-BRAZIL 2.99 Mano kakau BRZSW1100025 3949196


no arquivo1.csv eu preciso manter DATA HORA CN MSISDN todo os resto deve ser trocado

no final o arquivo3.csv ficaria assim

DATA HORA CN MSISDN ID SONG NAME CP PRICE ARTIST ISRC UPC
20120426 100726 18 1897520251 2574792 24 horas Sony-Brazil 3.99 Cassiane BRSME1100463 4115858

no script ele esta bagunçando um pouco as info.

se você quiser eu posso lhe enviar os dois csv para que possa testar.



9. Re: Trocar valores [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 10/07/2012 - 22:01h

Clique no meu profile e envie uma MP pelo site colando um arquivo de cada vez.

Se for muita coisa, escolha um trecho.

Podem ser duas MPs.


10. Re: Trocar valores [RESOLVIDO]

Erick Castilho Tadei
spawnlecastilho

(usa Debian)

Enviado em 10/07/2012 - 22:36h

te mandei um e-mail pelo seu perfil blz.



11. Re: Trocar valores [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 10/07/2012 - 23:33h

Funcionou.

Se quiser colar o texto de dentro do CSV na caixa de texto do profile, pode fazer isto também.

Se for muito grande, mande apenas um pedaço.

Um de cada vez.




12. Re: Trocar valores [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 11/07/2012 - 04:10h

Vamos lá!

Creio que até o momento :) funcionou corretamente.

#!/bin/bash

# copiando para arquivos indexados para seguranca
# isto eh para ficar mais veloz
# retirando tambem os cabecalhos

sed "1 d;s/\r//g" arquivo1.csv | sort -n -t , --key=5 > arquivo3.csv
sed "1 d;s/\r//g" arquivo2.csv | sort -n -t , --key=1 > arquivo4.csv

# recolocando cabecalho

head -1 arquivo1.csv > head0001.tmp
cat arquivo3.csv >> head0001.tmp
mv head0001.tmp arquivo3.csv


# trabalhando na copias arquivo{3,4}.csv e deixando arquivo{1,2}.csv intactos
# lendo todas as linhas de arquivo2.csv

while read arq2; do

id_arq2=$(echo $arq2 | cut -d',' -f1);

# o comando "sed" possui caracteres especiais que nao estavam sendo neutralizados
# quando aparecia um "/" na variavel $arq2 dava erro
# quando aparecia um "&" na variavel $arq2 o "sed" pensava que era pra
# substituir o "&" por algum outro conteudo, por enquanto percebi apenas estes
# e optei por esta resolucao

arq2="${arq2//\//\\/}"
arq2="${arq2//&/\\&}"

# apenas em caso de o campo 1 nao estar em branco a substituicao eh feita
# ele pega o restante da linha a partir do ponto com valor igual ao do campo 1
# e troca o restante da linha inteira a partir dali pela linha inteira de
# arquivo4.csv tudo dentro de arquivo3.csv e em todas as linhas de arquivo3.csv em
# que isto ocorrer

[[ "${id_arq2// /}" != "" ]] && sed 's/\b'"$id_arq2"'\b\,.*$/'"$arq2"'/g' -i arquivo3.csv

done < arquivo4.csv; # aqui eh a entrada de dados de arquivo4.csv


Qualquer dúvida ou problema deixe marcado aqui no fórum.





01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts