【发布时间】:2009-10-08 22:23:22
【问题描述】:
我有一个 CSV 文件,我想根据文件中的字段进行拆分。本质上,可以有两个品牌,GVA 和 HBVL。在将文件导入数据库之前,我想将文件拆分为每个品牌的文件。
CSV 文件示例
"D509379D5055821451C3695A3752DCCD",'1900-01-01 01:00:00',"M","1740","GVA",'2009-07-01 13:25:00',0
"159A58BE41012787D531C7157F688D86",'1900-01-01 00:00:00',"V","1880","GVA",'2008-06-06 11:21:00',0
"D0BB5C058794BBE4478DDA536D1E4872",'1900-01-01 00:00:00',"M","9270","GVA",'2007-09-18 13:21:00',0
"BCC7096803E5E60E05DC12FB9951E0CF",'1900-01-01 00:00:00',"M","3500","HBVL",'2007-09-18 13:21:00',1
"7F85FCE6F13775A8A3054E3438B81599",'1900-01-01 00:00:00',"M","3970","HBVL",'2007-09-18 13:20:00',0
部分问题在于文件的大小。大约39mb。我最初的尝试是这样的:
while read line ; do
name=`echo $line | sed -n 's/\(.*\)"\(GVA\|HBVL\)",\(.*\)$/\2/ p' | tr [:upper:] [:lower:] `
info=`echo $line | sed -n 's/\(.*\)"\(GVA\|HBVL\)",\(.*\)$/\1\3/ p'`
echo "${info}" >> ${BASEDIR}/${today}/${name}.txt
done < ${file}
大约 2.5 小时后,仅处理了大约 1/2 的文件。我有另一个文件,其大小可能高达 250 mb,我无法想象这需要多长时间。
我想做的是从行中提取品牌并将行写入以品牌命名的文件。我可以删除品牌,但我现在不知道如何使用它来创建文件。我已经开始使用 sed,但如果更合适的话,我不会使用另一种语言。
【问题讨论】:
-
不要使用 bash 的 while read 行结构来读取大文件,尤其是在循环中同时使用 sed 或 tr 等外部命令时。它会大大减慢您的处理速度。使用内部解析文件的工具,例如 awk