我在php手册里找了个例子
to import xml into mysql
$file = "article_2_3032005467.xml"
$feed = array()
$key = ""
$info = ""
function startElement($xml_parser, $attrs ) {
global $feed
}
function endElement($xml_parser, $name) {
global $feed, $info
$key = $name
$feed[$key] = $info
$info = ""}
function charData($xml_parser, $data ) {
global $info
$info .= $data}
$xml_parser = xml_parser_create()
xml_set_element_handler($xml_parser, "startElement", "endElement")
xml_set_character_data_handler($xml_parser, "charData" )
$fp = fopen($file, "r")
while ($data = fread($fp, 8192))
!xml_parse($xml_parser, $data, feof($fp))
xml_parser_free($xml_parser)
$sql= "INSERT INTO `article` ( `"
$j=0
$i=count($feed)
foreach( $feed as $assoc_index =>$value )
{
$j++
$sql.= strtolower($assoc_index)
if($i>$j) $sql.= "` , `"
if($i <=$j) {$sql.= "` ) VALUES ('"}
}
$h=0
foreach( $feed as $assoc_index =>$value )
{
$h++
$sql.= utf8_decode(trim(addslashes($value)))
if($i-1>$h) $sql.= "', '"
if($i <=$h) $sql.= "','')"
}
$sql=trim($sql)
echo $sql
举例说明如下xml文件名为: text.xml
xml数据文件的结构如下:
<node1>
<node2 name="abc">123</node2>
</node1>
sql命令如下:
SET @xml = LOAD_FILE('text.xml')-- 要指定完整的文件位置
SELECT ExtractValue(@xml, '/node1/node2/@name') as name,ExtractValue(@xml, '/node1/node2') as data
返回数据结果就是:
name | data
abc | 123
将外部数据导入(import)数据库是在数据库应用中一个很常见的需求。其实这就是在数据的管理和 *** 作中的ETL(Extract,
transform,
load)的L
(Load)部分,也就是说,将特定结构(structure)或者格式(format)的数据导入某个目的地(比如数据库,这里我们讨论MySQL)。
ETL
Process
本文要讨论的内容,是如何方便地将多种格式(JSON,
Text,
XML,
CSV)的数据导入MySQL之中。
本文大纲:
将Text文件(包括CSV文件)导入MySQL
将XML文件导入MySQL
将JSON文件导入MySQL
使用MySQL
workbench的Table
Data
Export
and
Import
Wizard进行JSON或CSV文件的导入导出
1.
将Text文件(包括CSV文件)导入MySQL
这里我们的讨论是基于一个假定,Text
file和CSV
file是有着比较规范的格式的(properly
formatted),比如说每行的每个数据域(field)之间是由一个共同的分隔符(比如tab:
\t)分隔的。
那么首先,你需要根据你的数据的格式(有哪些域),来设计好数据库的对应的表
(的Schema)。
举个例子,要处理的Text文件或者CSV文件是以\t作为分隔符的,每行有id,
name,
balance这么三个数据域,那么首先我们需要在数据库中创建这个表:
CREATE
TABLE
sometable(id
INT,
name
VARCHAR(255),
balance
DECIMAL(8,4))
创建成功以后就可以导入了。 *** 作方式很简单:
LOAD
DATA
LOCAL
INFILE
'你的文件路径(如~/file.csv)'
INTO
TABLE
sometable
FIELDS
TERMINATED
BY
'\t'
[ENCLOSED
BY
'"'(可选)]
LINES
TERMINATED
BY
'\n'
(id,
name,
balance)
这里要注意的是,我们需要开启local-infile这个MySQL的配置参数,才能够成功导入。究其原因,从MySQL的Manual中可以看到这么一段话:
LOCAL
works
only
if
your
server
and
your
client
both
have
been
configured
to
permit
it.
For
example,
if
mysqld
was
started
with
--local-infile=0,
LOCAL
does
not
work.
See
Section
6.1.6,
“Security
Issues
with
LOAD
DATA
LOCAL”.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)