如何通过shell / terminal将50MB压缩的xml文件(带名称空间和全尺寸600MB)上传到mysql表中

时间:2015-08-20 09:47:09

标签: mysql xml shell terminal

如何通过shell /终端将带有600MB xml文件(超过300,000“<”abc:ABCRecord“>”)的50MB zip文件上传到mysql数据表中? xml文件本身具有以下结构:

<?xml version='1.0' encoding='UTF-8'?>
<abc:ABCData xmlns:abc="http://www.abc-example.com" xmlns:xyz="http:/www.xyz-example.com">
<abc:ABCHeader>
<abc:ContentDate>2015-08-15T09:03:29.379055+00:00</abc:ContentDate>
<abc:FileContent>PUBLISHED</abc:FileContent>
<abc:RecordCount>310598</abc:RecordCount>

 </abc:ABCHeader>
<abc:ABCRecords>
 <abc:ABCRecord>
 ....
</abc:ABCRecord>
</abc:ABCRecords>
</abc:ABCData>

mysql表如何看起来像是什么?shell命令是什么?目标是在表中包含所有abc标记的内容。此外,每天都会有一个新的zip文件通过下载链接提供,它应该每天更新表格。 zip文件以以下结构命名:“20150815-XYZ-concatenated-file.zip”。总共有超过300,000“&lt;”abc:Record“&gt;”。

1 个答案:

答案 0 :(得分:0)

考虑使用MySQL的LOAD XML INFILE快速批量导入过程(类似于LOAD DATA INFILE查询),执行以下步骤:

1)解压缩zip文件。

2)使用XSLT转换原始xml以匹配MySQL所需的格式,不带属性或嵌套节点。子元素必须对应于MySQL数据库表字段:

<row>
  <column1>data</column1>
  <column2>data</column2>
  <column3>data</column3>
  ...
</row>

对于上面的例子:

<record>
  <ABC>5967007L</ABC>
  <Name>REGISTERENHETEN I Bornheim</Name>
  <Line1>Havnegata 48</Line1>
  <City>Bornheim</City>
  <Country>NO</Country>
</record>

3)最后,将以下查询保存在 .sql 文件中,并在shell / terminal中使用source命令调用它:

LOAD XML LOCAL INFILE 'C:\Path\To\transformedFile.xml'
INTO TABLE person
ROWS IDENTIFIED BY '<record>';

使用日常脚本调度程序(crontab,windows任务调度程序等)处理上述步骤可能是最好的专用编程语言(PHP,Python,Java,C#,VBA)。