Tenho um Garmin Nuvi que usa mapas OpenStreet. O Garmin faz códigos postais, mas geralmente está desatualizado de 2 a 3 anos para a Escócia. O OSM não faz códigos postais britânicos, mas o Post Office faz, e pode ser baixado gratuitamente. Este arquivo tem pouco menos de 1 GB. Ele tem 16 colunas, das quais eu quero apenas as 3 primeiras.
Usei cut para remover as colunas estranhas, então agora tenho CEP, Latitude e Longitude. Infelizmente, o arquivo POI deve ser Latitude, Longitude e CEP, ou seja, a coluna 1 deve ser a coluna 3. Para aumentar o problema, o CEP deve estar entre aspas, por exemplo, EH9 1QG e SW12 1AB devem ser "EH9 1QG" e "SW12 1AB".
Usei o awk de forma um tanto estranha (viu o que eu fiz aí?) com:
awk 'BEGIN {FS="\t"; OFS=","} {print $2, $3, $1}' pc0.csv > pc.csv
e tudo o que ele fez foi adicionar 2 colunas vazias na frente.
Seria legal poder usar uma planilha nele, mas há mais de 3 milhões de linhas.
Alguma ideia?
Isto é o que eu obtenho da saída de cut - pc0.csv.
O comando awk dá o mesmo, mas com duas vírgulas na frente de cada linha para dar 2 colunas vazias.
Postcode Latitude Longitude
AB1 0AA,57.101474,-2.242851
AB1 0AB,57.102554,-2.246308
AB1 0AD,57.100556,-2.248342
AB1 0AE,57.084444,-2.255708
AB1 0AF,57.096656,-2.258102
AB1 0AG,57.097085,-2.267513
AB1 0AJ,57.099011,-2.252854
AB1 0AL,57.101765,-2.254688
Então, usando o arquivo "cut" acima, que agora tem apenas 73 MB, preciso convertê-lo para:
Latitude,Longitude,Postcode
57.101474,-2.242851,"AB1 0AA"
57.102554,-2.246308,"AB1 0AB"
57.100556,-2.248342,"AB1 0AD"
57.084444,-2.255708,"AB1 0AE"
57.096656,-2.258102,"AB1 0AF"
57.097085,-2.267513,"AB1 0AG"
57.099011,-2.252854,"AB1 0AJ"
57.101765,-2.254688,"AB1 0AL"
Agora eu tive que remover as tabulações para exibir essas linhas, então esse é outro problema, pois só pode haver vírgulas e nada mais - nem mesmo espaços, a menos que entre aspas.
PS Linux (Ubuntu Mate) 22.04 LTS
Isso, usando qualquer awk, converterá o primeiro arquivo de exemplo que você mostrar no segundo arquivo de exemplo que você mostrar:
por exemplo, dada esta entrada:
ele produz esta saída:
Se não é isso que você precisa, esclareça sua dúvida.
Isso pode funcionar para sua caixa Ubuntu:
A ideia é redefinir
FS=","
e especificar as aspas depois que a primeira linha for processada.O duckdb cli é uma ótima ferramenta para executar esse tipo de tarefa para arquivos grandes.
Se o arquivo de entrada estiver no exemplo deste TSV
você pode correr
para obter esta saída CSV