Troque lat lon e agrupe por colchetes

1

Eu tenho um arquivo que está tendo dados como

input.csv
1;1.30453 103.83589;1.306663 103.83587;1.30 103.5;1.30693 103.83883;1.30709 103.835793;1.30725 103.835757;1.30741 103.83572;1.30753 103.8798
2;1.353 103.83589;1.306663 103.83587;1.30693 103.83583;1.30709 103.835793;1.30725 103.835757;1.30741 103.83572;1.30753 103.835
3;1.30653 103.83589;1.306663 103.83587;1.306797 103.83585;1.3693 
.....

Eu estou tentando converter este arquivo para estar no formato (eu troco a posição lat e long values e os agrupo por um colchete e os separo por uma vírgula)

output.csv

1,[103.83589,1.30453],[103.83587,1.306663],[103.5,1.30],[103.83883,1.30693],[103.835793,1.30709],[103.835757,1.30725],[103.83572,1.30741][103.8798,1.30753]

.... e assim por diante.

    
por RKR 03.03.2017 / 05:22

3 respostas

2

sed 's/;\([0-9.]*\) \([0-9.]*\)/,[,]/g' input.csv > output.csv

pode fazer o trabalho, mas na segunda linha há 1.306663 103.83587 1.30693 103.83583 group que não tem ; separador. Se não é um script de erro de impressão deve ser modificado como

sed 's/[; ]\?\([0-9.]\+\) \([0-9.]\+\)/,[,]/g' input.csv > output.csv

que produzem

1,[103.83589,1.30453],[103.83587,1.306663],[103.5,1.30],[103.83883,1.30693],[103.835793,1.30709],[103.835757,1.30725],[103.83572,1.30741],[103.8798,1.30753]
2,[103.83589,1.353],[103.83587,1.306663],[103.83583,1.30693],[103.835793,1.30709],[103.835757,1.30725],[103.83572,1.30741],[103.835,1.30753]
3,[103.83589,1.30653],[103.83587,1.306663],[103.83585,1.306797];1.3693
    
por 03.03.2017 / 07:31
2

Com GNU sed 4.2.2 , você usaria um script simples de sed , como o seguinte:

sed 's/\([0-9.]\+\) \([0-9.]\+\)/[,]/g;s/;/,/g' < input.csv > output.csv

Ele precisa de barras invertidas para parênteses e + no padrão de correspondência (assim como os números na substituição) para fazer com que sed os considere como meta-caracteres.

O script consiste em duas substituições exaustivas para cada linha: primeiro substituindo duas sequências numéricas e de pontos separadas por espaço pelas seqüências em ordem oposta, separadas por vírgula e entre colchetes; em segundo lugar, substituindo o ponto-e-vírgula por vírgula.

No entanto, com o uso duplo de , na saída, ele pode não ser facilmente carregado como um CSV.

    
por 03.03.2017 / 07:40
2
perl -F'\s+|;' -pale '$" = ",";
   $_ = "$F[0],[" . join("],[", map { "@F[2*$_,2*$_-1]" } 1 .. @F/2) . "]";
' yourfile

Breve

The field separator are set at multiple whitespaces or semicolon. Then
excepting for the 1st field, the rest come in pairs. So keeping aside
($F[0]) we look at 2 fields at a time, flip them, & join all these pairs
with "],[".
    
por 03.03.2017 / 10:36