Como fazer um arquivo .csv com separadores a partir de um arquivo de texto? [RESOLVIDO]

1. Como fazer um arquivo .csv com separadores a partir de um arquivo de texto? [RESOLVIDO]

Luiz Carlos
luizcarlos18rj

(usa Suse)

Enviado em 28/04/2016 - 11:20h

Oi galera, não deu pras especificar mais a pergunta no campo assunto, mas minha dúvida é a seguinte:

tenho um arquivo de texto assim:


DETALHE DE ABRIL 2.xls casop-5213 2016-04-27 11:07:51 1 A4 Completed
VALE HOT DOG 1 trimestre Unknown 2016-04-27 10:57:51 2 A4 Completed
VALE HOT DOG SET Unknown 2016-04-27 10:56:10 6 A4 Completed
506DA010B108B07BEEBEE4402.pdf casop-513 2016-04-27 10:51:10 1 A4 Completed
DETALHE DE MAIO.xls casop-5213 2016-04-27 10:17:21 1 A4 Completed
73 Unknown 2016-04-27 09:11:39 1 A4 Completed
73 Unknown 2016-04-27 09:11:35 1 A4 Completed
85 Unknown 2016-04-27 09:08:43 1 A4 Completed
VALE MATERIAL Unknown 2016-04-27 08:25:38 1 A4 Completed
Report Job260 Local User 2016-04-27 08:14:00 1 A4 Completed
Report Job259 Local User 2016-04-27 08:13:43 1 A4 Completed
C512M538003 casop-512 2016-04-26 14:22:14 1 A4 Completed


Como podem ver o arquivo não tem títulos de colunas, mas trata-se de uma fila de impressão de uma impressora que descreve:

[nome do arquivo] - [usuário] - [data] - [hora] - [qtd] - [papel] - [status]

O problema é que ele é separado por espaços, mas não dá pra importar pra uma planilha ou tabela automaticamente, porque no campo [nome do arquivo] é composto por nomes também separados por espaços, aí na hora de importar essas "partes" do nome do arquivo ficam em colunas diferentes, pois ao importar usa o delimitador "espaço" e quando isso acontece embaralha tudo.

Tem como via manipulação de texto detectar nomes de arquivo ( que ficariam teoricamente na primeira coluna )separados por espaço e colocar tipo "underline" para que aí sim cada coluna seja separada por espaço e diminuir a qts de espaços entre a primeira e a segunda coluna para poder ficar mais fácil a importação?
como no exemplo:


Para ilustração , usuarei o símbolo "[ ]" para identificar o "espaço".

Original:

DETALHE[ ]DE[ ]ABRIL[ ]2.xls[ ][ ][ ][ ][ ]casop-5213[ ]2016-04-27[ ]11:07:51[ ]1[ ]A4[ ]Completed
para:
DETALHE_DE_ABRIL_2.xls[ ]casop-5213[ ] 2016-04-27[ ]11:07:51[ ]1[ ] A4[ ] Completed


Desde já agradeço...


  


2. MELHOR RESPOSTA

Wellington
wellington_r

(usa Debian)

Enviado em 28/04/2016 - 13:41h

Eu tive uma ideia.

Faça uma cópia do seu arquivo com o nome "entrada.

Depois elimine o espaço da coluna nome de usuário (quando o nome é Local User):
sed 's/Local User/Local_User/g' entrada > temp ; mv temp entrada 


Saída:
DETALHE DE ABRIL 2.xls casop-5213 2016-04-27 11:07:51 1 A4 Completed
VALE HOT DOG 1 trimestre Unknown 2016-04-27 10:57:51 2 A4 Completed
VALE HOT DOG SET Unknown 2016-04-27 10:56:10 6 A4 Completed
506DA010B108B07BEEBEE4402.pdf casop-513 2016-04-27 10:51:10 1 A4 Completed
DETALHE DE MAIO.xls casop-5213 2016-04-27 10:17:21 1 A4 Completed
73 Unknown 2016-04-27 09:11:39 1 A4 Completed
73 Unknown 2016-04-27 09:11:35 1 A4 Completed
85 Unknown 2016-04-27 09:08:43 1 A4 Completed
VALE MATERIAL Unknown 2016-04-27 08:25:38 1 A4 Completed
Report Job260 Local_User 2016-04-27 08:14:00 1 A4 Completed
Report Job259 Local_User 2016-04-27 08:13:43 1 A4 Completed
C512M538003 casop-512 2016-04-26 14:22:14 1 A4 Completed


Depois, inverta a string linha por linha com:
rev entrada > temp ; mv temp entrada 


Saída:
detelpmoC 4A 1 15:70:11 72-40-6102 3125-posac slx.2 LIRBA ED EHLATED
detelpmoC 4A 2 15:75:01 72-40-6102 nwonknU ertsemirt 1 GOD TOH ELAV
detelpmoC 4A 6 01:65:01 72-40-6102 nwonknU TES GOD TOH ELAV
detelpmoC 4A 1 01:15:01 72-40-6102 315-posac fdp.2044EEBEEB70B801B010AD605
detelpmoC 4A 1 12:71:01 72-40-6102 3125-posac slx.OIAM ED EHLATED
detelpmoC 4A 1 93:11:90 72-40-6102 nwonknU 37
detelpmoC 4A 1 53:11:90 72-40-6102 nwonknU 37
detelpmoC 4A 1 34:80:90 72-40-6102 nwonknU 58
detelpmoC 4A 1 83:52:80 72-40-6102 nwonknU LAIRETAM ELAV
detelpmoC 4A 1 00:41:80 72-40-6102 resU_lacoL 062boJ tropeR
detelpmoC 4A 1 34:31:80 72-40-6102 resU_lacoL 952boJ tropeR
detelpmoC 4A 1 41:22:41 62-40-6102 215-posac 300835M215C


Agora vá até o LibreOffice, mande um "colar especial" e defina o espaço como delimitador.
As primeiras 6 colunas vão ficar separadas corretamente, as demais vão ficar bagunçadas, pois serão criadas várias colunas dependendo de maior quantidade de espaço de nome de algum arquivo. O que você deve fazer é selecionar todas as colunas que virem depois de 6 e pedir para que o LibreOffice as funda em uma única coluna.

Depois é só pedir para o LibreOffice salvar .csv.

Nesse momento você vai ter o arquivo que você quer mas ao contrário, então você tem que invertar a string linha por linha novamente com "rev".

rev arquivo.csv > saida 


[EDITADO] Se você precisar desse arquivo uma única vez, a solução do LibreOffice serve. Se tiver que executar a mesma rotina várias vezes teria que criar um regex para fazer o trabalho do LibreOffice (unir todas as colunas de "nome do arquivo" em uma única coluna), mas eu não sei como fazer isso, pois vai ser uma regex meio escabrosa.

[EDITADO 2] Descobri como fazer o trabalho que seria feito no LibreOffice pelo terminal.

Depois de ter eliminado o problema do 'Local User' e ter invertido o arquivo, execute:

sed -e 's/ /;/' -e 's/ /;/' -e 's/ /;/' -e 's/ /;/' -e 's/ /;/' -e 's/ /;/' entrada > temp ; mv temp entrada


Saída:
detelpmoC;4A;1;15:70:11;72-40-6102;3125-posac;slx.2 LIRBA ED EHLATED
detelpmoC;4A;2;15:75:01;72-40-6102;nwonknU;ertsemirt 1 GOD TOH ELAV
detelpmoC;4A;6;01:65:01;72-40-6102;nwonknU;TES GOD TOH ELAV
detelpmoC;4A;1;01:15:01;72-40-6102;315-posac;fdp.2044EEBEEB70B801B010AD605
detelpmoC;4A;1;12:71:01;72-40-6102;3125-posac;slx.OIAM ED EHLATED
detelpmoC;4A;1;93:11:90;72-40-6102;nwonknU;37
detelpmoC;4A;1;53:11:90;72-40-6102;nwonknU;37
detelpmoC;4A;1;34:80:90;72-40-6102;nwonknU;58
detelpmoC;4A;1;83:52:80;72-40-6102;nwonknU;LAIRETAM ELAV
detelpmoC;4A;1;00:41:80;72-40-6102;resU_lacoL;062boJ tropeR
detelpmoC;4A;1;34:31:80;72-40-6102;resU_lacoL;952boJ tropeR
detelpmoC;4A;1;41:22:41;62-40-6102;215-posac;300835M215C


Depois:
rev entrada > final.csv


Saída:
DETALHE DE ABRIL 2.xls;casop-5213;2016-04-27;11:07:51;1;A4;Completed
VALE HOT DOG 1 trimestre;Unknown;2016-04-27;10:57:51;2;A4;Completed
VALE HOT DOG SET;Unknown;2016-04-27;10:56:10;6;A4;Completed
506DA010B108B07BEEBEE4402.pdf;casop-513;2016-04-27;10:51:10;1;A4;Completed
DETALHE DE MAIO.xls;casop-5213;2016-04-27;10:17:21;1;A4;Completed
73;Unknown;2016-04-27;09:11:39;1;A4;Completed
73;Unknown;2016-04-27;09:11:35;1;A4;Completed
85;Unknown;2016-04-27;09:08:43;1;A4;Completed
VALE MATERIAL;Unknown;2016-04-27;08:25:38;1;A4;Completed
Report Job260;Local_User;2016-04-27;08:14:00;1;A4;Completed
Report Job259;Local_User;2016-04-27;08:13:43;1;A4;Completed
C512M538003;casop-512;2016-04-26;14:22:14;1;A4;Completed


Sei que deve ter algum jeito mais profissional de fazer esse último sed, mas esse aí faz o trabalho.

--------------------------------------------------------------------------------------------------------------------------------------
admin@server:~$ whatis life
life: nothing appropriate


3. Re: Como fazer um arquivo .csv com separadores a partir de um arquivo de texto? [RESOLVIDO]

Ronaldo Ferreira de Lima
textmode

(usa Slackware)

Enviado em 28/04/2016 - 12:57h

Eu diria que o seu relatório não é reprocessável por máquina. Só é possível fazer inferências e montar quebra-galhos (gambiarras).

O seu relatório possui múltiplas colunas com espaços no conteúdo e os caracteres de espaços também são os separadores. Eu conheço apenas duas técnicas que podem trabalhar com dados desde tipo:

1. Você define por expressão regular e/ou dicionário os dados possíveis para cada coluna e faz a verificação para cada uma e só então determina onde é o início e o fim de cada coluna. É praticamente criar um parser.

2. Se o relatório é formatado com largura fixa para cada coluna, precisa-se analisar o conteúdo e procurar o offset de cada coluna manualmente, ou seja, cria-se uma lista para cada linha onde ocorrem as sequências de caracteres de espaço seguidos por um caractere "não-espaço", analisa-se as frequências e elege-se os offsets.

Para ambos os casos, existe risco de vez, ou outra não funcionarem corretamente.

É certeza que não possível conseguir um relatório melhor para reprocessamento?



4. Re: Como fazer um arquivo .csv com separadores a partir de um arquivo de texto? [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 28/04/2016 - 15:28h

luizcarlos18rj escreveu:

Oi galera, não deu pras especificar mais a pergunta no campo assunto, mas minha dúvida é a seguinte:

tenho um arquivo de texto assim:


DETALHE DE ABRIL 2.xls casop-5213 2016-04-27 11:07:51 1 A4 Completed
VALE HOT DOG 1 trimestre Unknown 2016-04-27 10:57:51 2 A4 Completed
VALE HOT DOG SET Unknown 2016-04-27 10:56:10 6 A4 Completed
506DA010B108B07BEEBEE4402.pdf casop-513 2016-04-27 10:51:10 1 A4 Completed
DETALHE DE MAIO.xls casop-5213 2016-04-27 10:17:21 1 A4 Completed
73 Unknown 2016-04-27 09:11:39 1 A4 Completed
73 Unknown 2016-04-27 09:11:35 1 A4 Completed
85 Unknown 2016-04-27 09:08:43 1 A4 Completed
VALE MATERIAL Unknown 2016-04-27 08:25:38 1 A4 Completed
Report Job260 Local User 2016-04-27 08:14:00 1 A4 Completed
Report Job259 Local User 2016-04-27 08:13:43 1 A4 Completed
C512M538003 casop-512 2016-04-26 14:22:14 1 A4 Completed


Como podem ver o arquivo não tem títulos de colunas, mas trata-se de uma fila de impressão de uma impressora que descreve:

[nome do arquivo] - [usuário] - [data] - [hora] - [qtd] - [papel] - [status]

O problema é que ele é separado por espaços, mas não dá pra importar pra uma planilha ou tabela automaticamente, porque no campo [nome do arquivo] é composto por nomes também separados por espaços, aí na hora de importar essas "partes" do nome do arquivo ficam em colunas diferentes, pois ao importar usa o delimitador "espaço" e quando isso acontece embaralha tudo.

Tem como via manipulação de texto detectar nomes de arquivo ( que ficariam teoricamente na primeira coluna )separados por espaço e colocar tipo "underline" para que aí sim cada coluna seja separada por espaço e diminuir a qts de espaços entre a primeira e a segunda coluna para poder ficar mais fácil a importação?
como no exemplo:


Para ilustração , usuarei o símbolo "[ ]" para identificar o "espaço".

Original:

DETALHE[ ]DE[ ]ABRIL[ ]2.xls[ ][ ][ ][ ][ ]casop-5213[ ]2016-04-27[ ]11:07:51[ ]1[ ]A4[ ]Completed
para:
DETALHE_DE_ABRIL_2.xls[ ]casop-5213[ ] 2016-04-27[ ]11:07:51[ ]1[ ] A4[ ] Completed


Desde já agradeço...


Boa tarde luizcarlos18rj.
Você tem uma listagem com todos usuários?

No aguardo,
marcelo oliver


5. Re: Como fazer um arquivo .csv com separadores a partir de um arquivo de texto? [RESOLVIDO]

Wellington
wellington_r

(usa Debian)

Enviado em 06/05/2016 - 15:10h

Eu me dedico a ajudar e o cara nem responde!
--------------------------------------------------------------------------------------------------------------------------------------
admin@server:~$ whatis life
life: nothing appropriate



6. Re: Como fazer um arquivo .csv com separadores a partir de um arquivo de texto? [RESOLVIDO]

Luiz Carlos
luizcarlos18rj

(usa Suse)

Enviado em 10/05/2016 - 11:59h

wellington_r

Desculpe a demora mano, fiz isso no trab e passei um "feriadão" longe do pc , mas sua ideia foi genial e brilhante.

o comando rev resolveu o problema exatamente da forma que descreveu...

Tu é um gênio mano...






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts