간단히

간단히

다음과 같은 데이터가 포함된 파일이 있습니다.

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 
.....

이 파일을 다음 형식으로 변환하려고 합니다. (위도와 경도 값의 위치를 ​​바꿔서 대괄호로 그룹화하고 쉼표로 구분했습니다.)

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]

.... 등.

답변1

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

작업을 수행하지만 두 번째 줄에 구분 기호가 1.306663 103.83587 1.30693 103.83583없는 그룹이 있습니다. ;인쇄 오류가 아닌 경우 스크립트를 다음과 같이 수정해야 합니다.

sed 's/[; ]\?\([0-9.]\+\) \([0-9.]\+\)/,[\2,\1]/g' input.csv > 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]
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

답변2

이를 위해 다음과 같은 GNU sed 4.2.2간단한 스크립트를 사용할 수 있습니다 sed.

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

메타 문자로 처리 하려면 대괄호 안의 백슬래시와 +일치 패턴(및 대체 숫자)이 필요합니다.sed

스크립트는 한 줄에 두 개의 철저한 대체 항목으로 구성됩니다. 먼저 공백으로 구분되고 쉼표로 구분되고 괄호로 묶인 두 개의 숫자와 점 시퀀스를 역순으로 바꾸고 두 번째는 세미콜론을 쉼표로 바꿉니다.

,그러나 출력의 이중 사용으로 인해 CSV로 쉽게 로드되지 않을 수 있습니다.

답변3

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

간단히

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 "],[".

관련 정보