简短的

简短的

我有一个文件,其中包含类似的数据

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

相关内容