Usando sed
ou awk
, é possível alinhar visualmente colunas em um arquivo CSV?
Por exemplo:
por exemplo de:
a,b,c,some stuff,"some, other, stuff",d,2023-03-10 18:37:00
y,x,z,t,cool,thing,2022-04-12 21:44:00
para:
a, b, c, some stuff,"some, other, stuff", d, 2023-03-10 18:37:00<EOL>
x, y, z, t, cool, thing, 2022-04-12 21:44:00<EOL>
Existem alguns campos com aspas duplas contendo texto e vírgulas.
Eu tentei column
, mas aparentementebsdmainutils
não é capaz de lidar com esses dados.
Um arquivo CSV deste tipo:
não é mais o mesmo arquivo de dados, pois você está modificando os campos. Quando analisado, o que era originalmente
"t"
agora será analisado por" t"
causa da largura"some stuff"
acima (a menos que você use um regex para analisar os delimitadores não padrão,[variable space]
).Você pode forçar aspas em todos os campos para obter um arquivo mais csv que mostre esses novos campos claramente. Aqui está um Ruby para fazer isso:
Estampas:
Ou, se você realmente deseja campos entre aspas e sem aspas, você pode fazer:
Estampas:
Que também lida com aspas de escape desagradáveis dentro dos campos. Dado:
A segunda versão imprime:
Esqueça a análise de texto simples então. Basta obter algo que possa analisar CSV complexo e deixar que faça a impressão bonita.
Miller é a ferramenta de escolha. Você pode especificar "pretty print" como formato de saída:
Você também pode usar apenas o módulo interno do Python
csv
:Usando GNU awk for
FPAT
e uma abordagem de 2 passos:Alternativamente, a mesma abordagem usando qualquer awk onde você só precisa escrever o código para dividir cada registro em campos usando um loop chamando
match()
eFPAT
armazenando esses campos em uma matriz em vez do acima, onde o gawk faz isso para você como parte do campo normal divisão:Em vez de ler a entrada duas vezes, você pode, alternativamente, armazenar toda a entrada na memória e, em seguida, imprimir tudo na seção END, o que tem a vantagem de funcionar na entrada proveniente de um tubo e a desvantagem de que falharia se o seu arquivo de entrada era muito grande para caber na memória. Aqui está a versão GNU awk disso:
e qualquer versão do awk: