Tenho um arquivo no txt
formato que desejo converter para csv
. Entre cada campo existem blocos de espaços. A quantidade de espaços não é a mesma entre todos os campos.
Existe um comando com sed ou awk para substituir os blocos com 3 espaços ou mais por um arquivo ,
. Se houver apenas 2 espaços, ele precisa ser ignorado para evitar que espaços duplos nos dados sejam substituídos por,
Entrada:
A_DRIVERLICENSENUMBER_ A_PRIORADDRESS2_ A_MONTHLYRENT_ A_EMPLOYEEID_ A_WORKPHONESPECIALINSTR_ A_REFDETAIL_ A_VERBALPLEDGE
input example,input2 example
saída:
A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE
input example,input2 example
Não consigo encontrar como fazer isso na internet. Tenho certeza que alguém aqui pode me ajudar
Podes tentar:
ou
Usando Raku (anteriormente conhecido como Perl_6)
O código Raku acima é semelhante à resposta Perl com uma ligeira mudança na sintaxe, devido ao fato de Raku enumerar instâncias repetidas de um caractere (ou classe de caractere) usando a
** min..max
notação. Isso permite{}
que chaves sejam reservadas para código executável dentro do regex (útil para coisas como executar uma variável de contador, etc.).Entrada de amostra:
Saída de amostra:
Para qualquer coisa que não seja um formato 'CSV simples', você provavelmente desejará
> ./tmp
redirecionar a saída para umtmp
arquivo e, em seguida, usar o módulo do RakuText::CSV
para analisar o arquivo.Abaixo, criando um
TSV
arquivo a partir de umCSV
arquivo (observe que a saída colunar com espaços em branco internos está devidamente entre aspas):Para o exemplo de código final (imediatamente acima), elimine o
sep => "\t"
parâmetro e o código usará uma,
vírgula por padrão, fornecendo umCSV
arquivo.https://raku.land/github:Tux/Text::CSV
https://docs.raku.org/idioma/regexes
https://raku.org
A partir do seu arquivo de amostra , você pode usar o Miller 6 e executar
obter
Algumas notas:
--ifs-regex " +"
você define 3 ou mais espaços como separador de campo;ragged
, se uma linha de dados tiver menos campos que a linha de cabeçalho, preencha as chaves restantes com uma string vazia. Se uma linha de dados tiver mais campos do que a linha de cabeçalho, use rótulos de campos inteiros como no caso do cabeçalho implícitoSe você quiser remover o último campo vazio
Se na linha 2
,
houver um separador de campo primeiro você deve padronizar tudo - para ter os mesmos separadores - e passar a saída para MillerA saída é um csv correto com a quantidade certa de separadores de campo
Usando qualquer awk POSIX:
ou com qualquer código rígido do awk 3 espaços em branco e a
+
para o FS:e se você quiser uma saída CSV válida (mesmo número de campos em cada linha), assumindo que a primeira linha contém todos os campos:
ou:
dependendo se
,
os s existentes na entrada devem ser tratados como um separador de campos ou não.Supondo que você realmente queira apenas corrigir o cabeçalho, você pode substituir todas as execuções de caracteres semelhantes a espaços na primeira linha por vírgulas:
Para remover também a vírgula final que pode não ser necessária:
Esses
sed
comandos modificam apenas a linha do cabeçalho dos dados de entrada, que é considerada a primeira linha de entrada. Os dados restantes permanecem inalterados.Uma tradução quase literal desse último
sed
comandoawk
seria assim:... mas poderia ser abreviado da seguinte forma, onde deixamos
awk
reformatar a primeira linha em um registro delimitado por vírgula, dividindo-o em execuções de caracteres de espaço em branco:Em ambos os casos, evitamos modificar qualquer outra linha de entrada que não a primeira.