Converter uma coluna no local no CSV

3

Preciso de ajuda sobre a conversão de datas no local em um CSV. Basicamente, eu era capaz de converter a coluna e salvar em um novo arquivo, mas não consegui salvá-lo no CSV original.

Eu tenho um CSV com formato de data DD/MM/YYYY HH:MM e desejo converter para YYYY-MM-DD HH:MM , é a primeira coluna do meu CSV.

Meu arquivo CSV tem algo parecido com isso:

29/01/2018 14:07,payable,37159871,,30521316
29/01/2018 14:07,payable,37159872,,30521316
29/01/2018 14:07,payable,37159870,,30521316
29/01/2018 14:07,payable,37159869,,30521316
29/01/2018 14:07,payable,37159868,,30521316

E eu quero ter algo assim:

2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316

O que eu era capaz de fazer:

gawk -F, '{split($1, a, "/| "); print a[3]"-"a[2]"-"a[1]" "a[4]}' /path/to/file.csv > test_file

Então, agora eu quero saber como posso salvar isso de volta no meu arquivo CSV.

    
por Max Forasteiro 29.01.2018 / 20:50

4 respostas

4

A edição neste caso é tão simples que eu não me incomodaria com o Awk.

Com o GNU Sed, é tão simples como:

sed -rie 's_^(..)/(..)/(....)_--_' file.csv

Com o BSD Sed, use:

sed -Ei '' -e 's_^(..)/(..)/(....)_--_' file.csv

Com as ferramentas POSIX, é um pouco mais feio, mas não terrível:

printf '%s\n' '%s/^\(..\)\/\(..\)\/\(....\)/--/' x | ex file.csv

Editar: na verdade, uma análise mais detalhada das especificações POSIX para ex revela que ( quase) qualquer delimitador pode ser usado, assim como em Sed. Então:

printf '%s\n' '%s_^\(..\)/\(..\)/\(....\)_--_' x | ex file.csv

Ligeiramente melhor.

    
por 29.01.2018 / 21:50
0

Dado que o awk não possui uma opção de "edição no local" integrada (geralmente implementada como cópia dos bastidores), e desde então lendo esta resposta , a minha solução preferida neste cenário é da seguinte forma:

cp input_file temp_file && command … temp_file > input_file && rm temp_file

Para sua situação:

cp /path/to/file.csv temp_file &&
gawk -F, '{split($1, a, "/| "); print a[3]"-"a[2]"-"a[1]" "a[4]}' < temp_file > /path/to/file.csv &&
rm temp_file

Observe a sintaxe && , que une os comandos e executa comandos subseqüentes somente se os anteriores foram bem-sucedidos.

    
por 29.01.2018 / 21:30
0

Como você está usando o GNU awk:

gawk -i inplace -F, ...

e se você quiser manter um backup do original

gawk -i inplace -v INPLACE_SUFFIX=".bak" -F, ...

link

    
por 29.01.2018 / 21:37
0

Eu consegui o mesmo usando o comando awk abaixo

input.csv

2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316

comando

awk '{gsub("/","-",$0);print $0}' input.csv| awk -F "-" '{print $3,$2,$1}'  | awk -F " " '{print $1"-"$(NF -1)"-"$NF,$2}'

saída

2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316
    
por 30.01.2018 / 19:31

Tags