我有来自世界银行千年发展目标的大量数据集(CSV 格式)。数据显示如下:
Country Code Country Name Indicator
ABW Aruba % Forest coverage
ADO Andorra % Forest coverage
AFG Afghanistan % Forest coverage
...
ABW Aruba % Literacy rate
ADO Andorra % Literacy rate
AFG Afghanistan % Literacy rate
...
ABW Aruba % Another indicator
ADO Andorra % Another indicator
AFG Afghanistan % Another indicator
该文件当前大小为 8.2MB。我将为这些数据编写一个 Web 界面,并且我想按国家/地区对数据进行切片,以便我可以发出 ajax 请求,以便为每个国家/地区加载单独的 CSV。
我不知道如何以编程方式或使用任何工具来执行此操作。我不一定需要 Python,但这是我最了解的。我不一定需要完整的脚本,但我很高兴提供有关如何解决此问题的一般指示。
我正在使用的原始数据源位于此处:
http://duopixel.com/stack/data.csv
单线:
awk -F "," 'NF>1 && NR>1 {print $0 >> ("data_" $1 ".csv"); close("data_" $1 ".csv")}' data.csv
这将创建名为的新文件data_ABW
等,包含适当的信息。这NR>1
部分跳过标题行。然后,对于每一行,它appends整行($0
) 到名为Data_$1
, where $1
替换为该行第一列中的文本。最后,close
语句确保没有太多打开的文件。如果你没有那么多国家,你可以摆脱这个并显着提高命令的速度。
为了回答下面@Lenwood的评论,要在每个输出文件中包含标头,您可以这样做:
awk -F "," 'NR==1 {header=$0}; NF>1 && NR>1 {if(! files[$1]) {print header >> ("data_" $1 ".csv"); files[$1]=1}; print $0 >> ("data_" $1 ".csv"); close("data_" $1 ".csv")}' data.csv
(你可能必须避开感叹号...)第一个新部分NR==1 {header=$0};
仅将输入文件的第一行存储为变量header
。然后,另一个新部分if(! files[$1]) ... files[$1]=1};
使用关联数组files
跟踪所有内容是否已将标头放入给定文件中,如果没有,则将其放入其中。
请注意,这会附加文件,因此如果这些文件已经存在,它们将被添加到其中。因此,如果您在主文件中获取新数据,您可能需要在再次运行此命令之前删除这些其他文件。
(以防不明显,如果您希望文件的命名类似于data_Aruba
你可以改变$1
to $2
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)