数据的批量解压7z、处理sed、导入bcp

       嗷,开始做毕设了。。

       首先要面对是一个15G数据的解压缩,解压后又50G。因为压缩了好几层,文件夹中又有文件夹,如此庞大的文件量,肯定不能靠我手动了,所以要靠脚本来批量。数据可能还需要整理。另外,分散的数据还要导入数据库里去,也得用批量工具。总之,就是三个工作:

(1)解压缩——7z或tar

(2)数据整理——sed

(3)导入数据——bcp

       由于本机之渣和本人之懒,没能感受到Linux下的爽,因此使用了GnuWin32来实现小小的梦想,算是一种别样的体验吧。这不是一篇讲解技术文博文,而是流程思路的小记录吧。

(1)解压缩

7z x 1.zip>nul
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,可惜速度十分之慢,因为这相当于要遍历每一项。

findstr "." data.txt >data.tmp

      也有人提到.Net引入的PowerShell,这个我就没去了解了。

      自己之前会awk,不过有点大材小用。而cut是做列剪切的。所以选了sed。

sed -i "1d" *.txt

      虽然用-i,表示对原文件做修改,但实际有临时文件(至少在winxp下有),所以还要del sed*啦。

(3)导入数据

       用的是SQL Server数据库,好像2005开始就有bcp工具了,官网上资料还是很全的。bcp可以帮你批量导入、导出数据,这个过程中你可以指定XML格式文件,指明表的哪些列对应文本文件的哪些列。我需要导入,用到的几个重要的:

产生表的XML格式文件
bcp db.dbo.Table_GPS format nul -T -c -x -f GPSformat.xml
根据需要修改XML格式文件
<?xml version="1.0"?>
<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到底了。

批量导入到数据库
bcp db.dbo.Table_GPS in jieya/20121101/20121101000014.txt -f GPSformat.xml -T -eerror.txt

     其中-e是用来记录错误信息到error.txt的。

     还有,外事不决问谷歌,内事不决问百度,需要废话的就是这些。

猜你喜欢

转载自zjh776.iteye.com/blog/2008669