Como criar um sript para ler arquvivos txt csv e dividi-los em novos arquivos por linhas? [RESOLVIDO

1. Como criar um sript para ler arquvivos txt csv e dividi-los em novos arquivos por linhas? [RESOLVIDO

rodrigo buch garcia
rodrigobuch

(usa CentOS)

Enviado em 08/01/2020 - 17:01h

Recebo arquivos (txt csv) em um diretório FTP e preciso quebra-los em novos arquivos para cada linha do arquivo, esses arquivos variam a quantidade de linhas algumas vezes tem 100 ou 1000.


  


2. Re: Como criar um sript para ler arquvivos txt csv e dividi-los em novos arquivos por linhas?

Matheus
pylm

(usa Gentoo)

Enviado em 08/01/2020 - 17:47h


#!/usr/bin/env bash

i=0

while read -r line; do
head=$(head -n 1 $1)
echo -e "$head\n$line" > $i.csv
i=$(($i+1))
done < $1


Use com
./script arquivo.csv

Ele vai criar varios arquivos sequencias de 0 até o número de linhas contendo o header do csv e os dados da linha.
E o primeiro arquivo gerado vai ser sempre duas linhas com o header do csv, podes ignorar ele ou melhorar o script pra não criá-lo.


3. Como criar um sript para ler arquvivos txt csv e dividi-los em novos arquivos por linhas?

rodrigo buch garcia
rodrigobuch

(usa CentOS)

Enviado em 09/01/2020 - 13:10h

Olá pylm, agradeço a ajuda vou fazer os testes e posto o resultado aqui.

Comecei a testar e vi algumas coisas que não previ por exemplo:

os arquivos não tem um padrão de nome.(talvez fosse o caso de procurar por extensão)
quando executar os scripst a saida dos arquivos preciso coloca-los em outro diretório (porque vou processá-los em seguida)
e o original ser movido para um diretório de backup.(para não ser processado novamente)



Valeu!


4. Re: Como criar um sript para ler arquvivos txt csv e dividi-los em novos arquivos por linhas? [RESOLVIDO

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 09/01/2020 - 16:36h


rodrigobuch escreveu:

Recebo arquivos (txt csv) em um diretório FTP e preciso quebra-los em novos arquivos para cada linha do arquivo, esses arquivos variam a quantidade de linhas algumas vezes tem 100 ou 1000.

Boa tarde Rodrigo.
Segue sugestão:
#!/bin/bash
dir_org="";
dir_bkp="";

for arq in $(ls -1 ${dir_org}/*.csv);do
awk '{print $0 > "dir_destino/"FILENAME"_"NR".csv"}' $arq
mv ${arq} ${dir_bkp}
done


Obs.: O awk, lê linha por linha, dispensando o laço,
Gera um arquivo com o nome do arquivo "Pai"_Numero da Linha.csv,
No Diretório, "dir_destino", com o conteúdo da linha.

______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


5. Re: Como criar um sript para ler arquvivos txt csv e dividi-los em novos arquivos por linhas?

Perfil removido
removido

(usa Nenhuma)

Enviado em 10/01/2020 - 10:46h

Com relação à sugestão do msoliver, acho que não precisa usar o Ls e nem a subshell.

Inclusive, nos meus testes aqui, se tiver arquivos com espaço em branco no nome, ele vai partir o nome dos arq.
Usando somente a estrela do bash no for loop evita esses problemas com espaços em branco (porém não testei nome com caracteres especiais!):
for arq in ${dir_org}/*.csv;do
..


Uma sugestão minha é, também pode-se usar o pacote Split para dividir arquivos por número de linhas. Ele divide os arquivos e adiciona uma extensão de cadeia no nome dos arquivos criados. Tem muitos tutoriais de como usar o Split.


6. Como criar um sript para ler arquvivos txt csv e dividi-los em novos arquivos por linhas?

rodrigo buch garcia
rodrigobuch

(usa CentOS)

Enviado em 13/01/2020 - 09:34h

msoliver, não funcionou fiz a seguinte configuração:

#!/bin/bash
dir_org="/home/buch/Documentos/teste_quebrar_linhas/";
dir_bkp="/home/buch/Documentos/teste_quebrar_linhas/bkp";

for arq in $(ls -1 ${dir_org}/*.csv);do
awk '{print $0 > "/home/buch/Documentos/teste_quebrar_linhas/producao/"FILENAME"_"NR".csv"}' $arq
mv ${arq} ${dir_bkp}
done

E ocorre esse erro:

awk: lin. de com.:1: (FILENAME=/home/buch/Documentos/teste_quebrar_linhas//2019_12_18_2019_12_19_02_00_00_protocolados.csv FNR=1) fatal: impossível redirecionar para `/home/buch/Documentos/teste_quebrar_linhas/producao//home/buch/Documentos/teste_quebrar_linhas//2019_12_18_2019_12_19_02_00_00_protocolados.csv_1.csv' (Arquivo ou diretório inexistente)

Ele move para bkp, mas não faz o slipt!


7. Como criar um sript para ler arquvivos txt csv e dividi-los em novos arquivos por linhas (RESOLVISO)

rodrigo buch garcia
rodrigobuch

(usa CentOS)

Enviado em 13/01/2020 - 11:15h

msoliver, eu estava configurando os diretórios de maneira errada, configuração correta:

dir_org="orig";
dir_bkp="bkp";

for arq in $(ls -1 ${dir_org}/*.csv);do
awk '{print $0 > "producao/"FILENAME"_"NR".csv"}' $arq
mv ${arq} ${dir_bkp}
done

Vou criar um workflow no rundeck e executar o script e fazer o split dos arquivos e em sequencia minha aplicação irá processa-los um a um.

Agradeço a ajuda de todos tópico resolvido.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts