嗷,开始做毕设了。。
首先要面对是一个15G数据的解压缩,解压后又50G。因为压缩了好几层,文件夹中又有文件夹,如此庞大的文件量,肯定不能靠我手动了,所以要靠脚本来批量。数据可能还需要整理。另外,分散的数据还要导入数据库里去,也得用批量工具。总之,就是三个工作:
(1)解压缩——7z或tar
(2)数据整理——sed
(3)导入数据——bcp
由于本机之渣和本人之懒,没能感受到Linux下的爽,因此使用了GnuWin32来实现小小的梦想,算是一种别样的体验吧。这不是一篇讲解技术文博文,而是流程思路的小记录吧。
(1)解压缩
7z e *.tar.gz && 7z x *.tar
7z x *.tar.gz -so | 7z x -aoa -si -ttar
安装7z,且你的Path能引用到7z.exe和7z.dll后,就可以使用命令行7z了。7z可以压缩/解压多种文件,但是对tar.gz却不能一步解压。
(2)数据整理
我的目的是删除每个文本文件的第一行,查询后发现Dos下有findstr,可惜速度十分之慢,因为这相当于要遍历每一项。
也有人提到.Net引入的PowerShell,这个我就没去了解了。
自己之前会awk,不过有点大材小用。而cut是做列剪切的。所以选了sed。
虽然用-i,表示对原文件做修改,但实际有临时文件(至少在winxp下有),所以还要del sed*啦。
(3)导入数据
用的是SQL Server数据库,好像2005开始就有bcp工具了,官网上资料还是很全的。bcp可以帮你批量导入、导出数据,这个过程中你可以指定XML格式文件,指明表的哪些列对应文本文件的哪些列。我需要导入,用到的几个重要的:
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="6" COLLATION="Chinese_PRC_CI_AS"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="12"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="12"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="14" COLLATION="Chinese_PRC_CI_AS"/>
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="30"/>
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="30"/>
<FIELD ID="7" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="12"/>
<FIELD ID="8" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="12"/>
<FIELD ID="9" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="12"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="carId" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="2" NAME="state" xsi:type="SQLINT"/>
<COLUMN SOURCE="4" NAME="timestamp" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="5" NAME="lon" xsi:type="SQLFLT8"/>
<COLUMN SOURCE="6" NAME="lat" xsi:type="SQLFLT8"/>
<COLUMN SOURCE="7" NAME="speed" xsi:type="SQLINT"/>
<COLUMN SOURCE="9" NAME="mark" xsi:type="SQLINT"/>
</ROW>
</BCPFORMAT>
需要注意的是使用bcp,文本文件的列是可以跳过的,但是表的列不能跳过。也就是说上面,比如我的表是(carId,state,timestamp,lon,lat,speed,mark,id,others)。我可以跳过文本文件的3、8列,它们与我的表列无关。但是出现在COLUMN元素中的列必须按顺序排,id是自增主键,没有对应,id后面的列也就不能出现在COLUMN元素中了。详细的可以看这个:使用格式化文件跳过表列 使用格式化文件跳过数据字段
当然,使用 OPENROWSET(BULK...)可以 跳过表列,不过我觉得表列顺序无关痛痒,所以就用bcp到底了。
其中-e是用来记录错误信息到error.txt的。
还有,外事不决问谷歌,内事不决问百度,需要废话的就是这些。