【发布时间】:2014-08-09 15:09:59
【问题描述】:
我正在尝试将下面的 csv 转换为 json 格式。
Africa,Kenya,NAI,281
Africa,Kenya,NAI,281
Asia,India,NSI,100
Asia,India,BSE,160
Asia,Pakistan,ISE,100
Asia,Pakistan,ANO,100
European Union,United Kingdom,LSE,100
这是所需的 json 格式,我无法创建它。我将在此下方发布我正在进行的工作。任何帮助或指导将不胜感激...
{"name":"Africa",
"children":[
{"name":"Kenya",
"children":[
{"name":"NAI","size":"109"},
{"name":"NAA","size":"160"}]}]},
{"name":"Asia",
"children":[
{"name":"India",
"children":[
{"name":"NSI","size":"100"},
{"name":"BSE","size":"60"}]},
{"name":"Pakistan",
"children":[
{"name":"ISE","size":"120"},
{"name":"ANO","size":"433"}]}]},
{"name":"European Union",
"children":[
{"name":"United Kingdom",
"children":[
{"name":"LSE","size":"550"},
{"name":"PLU","size":"123"}]}]}
正在进行中。
$1 是上面粘贴了 csv 值的文件。
#!/bin/bash
pcountry=$(head -1 $1 | cut -d, -f2)
cat $1 | while read line ; do
region=$(echo $line|cut -d, -f1)
country=$(echo $line|cut -d, -f2)
code=$(echo $line|cut -d, -f3-)
size=$(echo $line|cut -d, -f4)
if test "$pcountry" == "$country" ;
then
echo -e {\"name\":\"$region\", '\n' \"children\": [ '\n'{\"name\":\"$country\",'\n'\"children\": [ '\n' \{\"name\":\"NAI\",\"size\":\"$size\"\}
else
if test "$pregion" == "$region"
then :
else
echo -e ,'\n'{\"name\":\""$region\", '\n' \"children\": [ '\n'{\"name\":\"$country\",'\n'\"children\": [ '\n' \{\"name\":\"NAI\",\"size\":\"$size\"\},
pcountry=$country
pregion=$region
fi ; done
问题是我似乎无法找到一种方法来找出国家价值何时结束。
【问题讨论】:
-
为什么要 bash?能够读写 csv 和 json 的 Python 将是这项任务的更好选择。
-
我建议为这类事情使用
awk脚本,而不是bash+cut。或者,如果没有必要坚持使用经典的 shell 工具,请使用 Perl 或 Python 之类的工具。 -
您可以假设国家值在您看到一个新国家(风险)或到达 EOF(安全)时结束。如果国家总是被分类在正确的地区,预分类可以消除风险。提供的数据格式存在歧义。
-
Python、nodeJS、Perl 将更好地支持 csv 和 json 之间的数据转换,因为库的可用性。
-
感谢大家的cmets。我使用 BASH 的原因是因为我不懂任何其他语言。我刚刚拿起 BASH 做我的工作.. 我想我知道接下来要“拿起”什么。 Python :) 特别感谢 @David Atchley 的脚本......你是冠军!