2015-10-20 28 views
0

对不起,发表了这样一个基本的问题,但我被所有不同的教程和例子(和斜杠和连字符和back-ticks哦)我困惑,所以我想我会得到某人有经验的输入。使用Unix的sed把一个csv变成一个JavaScript对象

我有一个.csv这显然是逗号分隔有几百行,看起来像这样:

abcd-3096,62#,,100,,,25,,75,3, ,它的格式应该是这样:

{name: 'abcd-3096', weight : 62, some-field1: null, class: 100, some-field2: null, some-field3: null, unit-weight : 25, some-field4 : null, capacity : 75, } 

我知道你会要么使用awk要么使用sed来替换它,而且我在几个命令中进行格式设置还不错。

我不希望任何人为我设计整个系列,但我希望有人能告诉我如何在文章前添加一列。我似乎无法在网上找到可靠的命令解释。

+0

您的.csv中的任何字段是否会包含逗号? –

+0

不,我们可以假设逗号只是描述了字段或列。 – Csteele5

+0

为什么不是Perl单线程? – Vidul

回答

2

您可以使用否定字符类[^,]此:

sed -r 's/^([^,]*),([^,]*),([^,]*)/{ name: "\1", weight: "\2", somefield1: "\3" }/' file.csv 

的例子只使用3组进行简单...但你的想法。

如果你的系统不支持sed -r(扩展的正则表达式语法),你需要使用\(group\)而不是(group)

sed 's/^\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\)/{ name: "\1", weight: "\2", somefield1: "\3" }/' file.csv 

如果你不需要使用SED,你也可以直接使用bash下

while IFS=',' read -r name weight somefield1 class somefield2 somefield3 unitweight capacity rest 
do 
    echo -e "{ name: \"$name\", weight: \"$weight\", somefield1: \"$somefield1\","; 
    echo -e " class: \"$class\", somefield2: \"somefield2\" somefield3: \"$somefield3\","; 
    echo -e " unitweight: \"$unitweight\", capacity: \"$capacity\" }"; 
done < file.csv 
IFS=$' \t\n' 

(由koola从this回答)

+0

(所有这些解决方案都假定您的数据中没有逗号,正如您在您的问题的评论中所述)。 –

+0

这是一个很好的答案。对于你的第一个例子,它看起来像你试图否定相同的事情3次。这是为了补偿我的数据中的三个逗号部分吗? – Csteele5

+0

'([^,] *)'表示*“捕获0个或多个不是逗号的字符”*。 因此,对于2个值,模式是'([^,] *),([^,] *)',匹配“一个值,然后一个逗号,然后一个值”。对于每个附加组,您都会添加',([^,] *)'。 –

相关问题