xml.dom.minidom as minidomimport MySQLdbdom = minidom.parse("1.xml")root = dom.getElementsByTagName("GANGLIA_XML")conn=MySQLdb.connect(host=‘localhost‘,user=‘root‘,passwd=‘123‘,port=3306)cur=conn.cursor()conn.select_db(‘ganglia‘)for node in root: gangliaxml = node.getElementsByTagName("CLUSTER") for cluster in gangliaxml: host = cluster.getElementsByTagName("HOST") for metric in host: #print(metric.getAttribute("NAME")) for metrics in metric.getElementsByTagName("METRIC"): value=[metrics.attributes["NAME"].value, metrics.attributes["VAL"].value, metrics.attributes["TYPE"].value, metrics.attributes["UNITS"].value, metrics.attributes["TN"].value, metrics.attributes["TMAX"].value, metrics.attributes["DMAX"].value, metrics.attributes["SLOPE"].value,] cur.execute(‘insert into class values(%s,%s,%s,%s,%s,%s,%s,%s)‘,value) conn.commit()cur.close()conn.close()
xml文档是:
<GANGLIA_XML VERSION="3.6.1" SOURCE="gmond"><CLUSTER NAME="sg620g" LOCALTIME="1430118086" OWNER="unspecified" LATLONG="unspecified" URL="unspecified"><HOST NAME="172.19.0.181" IP="172.19.0.181" TAGS="" REPORTED="1430111045" TN="7040" TMAX="20" DMAX="0" LOCATION="unspecified" GMOND_STARTED="1430111145"><METRIC NAME="load_one" VAL="0.00" TYPE="float" UNITS=" " TN="7043" TMAX="70" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="load"/><EXTRA_ELEMENT NAME="DESC" VAL="One minute load average"/><EXTRA_ELEMENT NAME="TITLE" VAL="One Minute Load Average"/></EXTRA_DATA></METRIC><METRIC NAME="os_release" VAL="2.6.32-504.12.2.el6.x86_64" TYPE="string" UNITS="" TN="7043" TMAX="1200" DMAX="0" SLOPE="zero"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="system"/><EXTRA_ELEMENT NAME="DESC" VAL="Operating system release date"/><EXTRA_ELEMENT NAME="TITLE" VAL="Operating System Release"/></EXTRA_DATA></METRIC><METRIC NAME="mem_total" VAL="16314120" TYPE="float" UNITS="KB" TN="7043" TMAX="1200" DMAX="0" SLOPE="zero"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="memory"/><EXTRA_ELEMENT NAME="DESC" VAL="Total amount of memory displayed in KBs"/><EXTRA_ELEMENT NAME="TITLE" VAL="Memory Total"/></EXTRA_DATA></METRIC><METRIC NAME="proc_run" VAL="0" TYPE="uint32" UNITS=" " TN="7043" TMAX="950" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="process"/><EXTRA_ELEMENT NAME="DESC" VAL="Total number of running processes"/><EXTRA_ELEMENT NAME="TITLE" VAL="Total Running Processes"/></EXTRA_DATA></METRIC><METRIC NAME="load_five" VAL="0.00" TYPE="float" UNITS=" " TN="7043" TMAX="325" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="load"/><EXTRA_ELEMENT NAME="DESC" VAL="Five minute load average"/><EXTRA_ELEMENT NAME="TITLE" VAL="Five Minute Load Average"/></EXTRA_DATA></METRIC><METRIC NAME="gexec" VAL="OFF" TYPE="string" UNITS="" TN="7043" TMAX="300" DMAX="0" SLOPE="zero"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="core"/><EXTRA_ELEMENT NAME="DESC" VAL="gexec available"/><EXTRA_ELEMENT NAME="TITLE" VAL="Gexec Status"/></EXTRA_DATA></METRIC><METRIC NAME="disk_free" VAL="386.370" TYPE="double" UNITS="GB" TN="7043" TMAX="180" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="disk"/><EXTRA_ELEMENT NAME="DESC" VAL="Total free disk space"/><EXTRA_ELEMENT NAME="TITLE" VAL="Disk Space Available"/></EXTRA_DATA></METRIC><METRIC NAME="mem_cached" VAL="1929396" TYPE="float" UNITS="KB" TN="7043" TMAX="180" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="memory"/><EXTRA_ELEMENT NAME="DESC" VAL="Amount of cached memory"/><EXTRA_ELEMENT NAME="TITLE" VAL="Cached Memory"/></EXTRA_DATA></METRIC><METRIC NAME="pkts_in" VAL="0.00" TYPE="float" UNITS="packets/sec" TN="7043" TMAX="300" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="network"/><EXTRA_ELEMENT NAME="DESC" VAL="Packets in per second"/><EXTRA_ELEMENT NAME="TITLE" VAL="Packets Received"/></EXTRA_DATA></METRIC><METRIC NAME="bytes_in" VAL="0.20" TYPE="float" UNITS="bytes/sec" TN="7043" TMAX="300" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="network"/><EXTRA_ELEMENT NAME="DESC" VAL="Number of bytes in per second"/><EXTRA_ELEMENT NAME="TITLE" VAL="Bytes Received"/></EXTRA_DATA></METRIC><METRIC NAME="swap_total" VAL="4095996" TYPE="float" UNITS="KB" TN="7043" TMAX="1200" DMAX="0" SLOPE="zero"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="memory"/><EXTRA_ELEMENT NAME="DESC" VAL="Total amount of swap space displayed in KBs"/><EXTRA_ELEMENT NAME="TITLE" VAL="Swap Space Total"/></EXTRA_DATA></METRIC><METRIC NAME="bytes_out" VAL="0.72" TYPE="float" UNITS="bytes/sec" TN="7043" TMAX="300" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="network"/><EXTRA_ELEMENT NAME="DESC" VAL="Number of bytes out per second"/><EXTRA_ELEMENT NAME="TITLE" VAL="Bytes Sent"/></EXTRA_DATA></METRIC><METRIC NAME="mem_free" VAL="13793820" TYPE="float" UNITS="KB" TN="7043" TMAX="180" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="memory"/><EXTRA_ELEMENT NAME="DESC" VAL="Amount of available memory"/><EXTRA_ELEMENT NAME="TITLE" VAL="Free Memory"/></EXTRA_DATA></METRIC><METRIC NAME="load_fifteen" VAL="0.00" TYPE="float" UNITS=" " TN="7043" TMAX="950" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="load"/><EXTRA_ELEMENT NAME="DESC" VAL="Fifteen minute load average"/><EXTRA_ELEMENT NAME="TITLE" VAL="Fifteen Minute Load Average"/></EXTRA_DATA></METRIC><METRIC NAME="os_name" VAL="Linux" TYPE="string" UNITS="" TN="7043" TMAX="1200" DMAX="0" SLOPE="zero"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="system"/><EXTRA_ELEMENT NAME="DESC" VAL="Operating system name"/><EXTRA_ELEMENT NAME="TITLE" VAL="Operating System"/></EXTRA_DATA></METRIC><METRIC NAME="boottime" VAL="1429665572" TYPE="uint32" UNITS="s" TN="7043" TMAX="1200" DMAX="0" SLOPE="zero"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="system"/><EXTRA_ELEMENT NAME="DESC" VAL="The last time that the system was started"/><EXTRA_ELEMENT NAME="TITLE" VAL="Last Boot Time"/></EXTRA_DATA></METRIC><METRIC NAME="cpu_idle" VAL="100.0" TYPE="float" UNITS="%" TN="7043" TMAX="90" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="cpu"/><EXTRA_ELEMENT NAME="DESC" VAL="Percentage of time that the CPU or CPUs were idle and the system did not have an outstanding disk I/O request"/><EXTRA_ELEMENT NAME="TITLE" VAL="CPU Idle"/></EXTRA_DATA></METRIC><METRIC NAME="cpu_user" VAL="0.0" TYPE="float" UNITS="%" TN="7043" TMAX="90" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="cpu"/><EXTRA_ELEMENT NAME="DESC" VAL="Percentage of CPU utilization that occurred while executing at the user level"/><EXTRA_ELEMENT NAME="TITLE" VAL="CPU User"/></EXTRA_DATA></METRIC><METRIC NAME="cpu_nice" VAL="0.0" TYPE="float" UNITS="%" TN="7043" TMAX="90" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="cpu"/><EXTRA_ELEMENT NAME="DESC" VAL="Percentage of CPU utilization that occurred while executing at the user level with nice priority"/><EXTRA_ELEMENT NAME="TITLE" VAL="CPU Nice"/></EXTRA_DATA></METRIC><METRIC NAME="cpu_aidle" VAL="0.0" TYPE="float" UNITS="%" TN="7043" TMAX="3800" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="cpu"/><EXTRA_ELEMENT NAME="DESC" VAL="Percent of time since boot idle CPU"/><EXTRA_ELEMENT NAME="TITLE" VAL="CPU aidle"/></EXTRA_DATA></METRIC><METRIC NAME="mem_buffers" VAL="135208" TYPE="float" UNITS="KB" TN="7043" TMAX="180" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="memory"/><EXTRA_ELEMENT NAME="DESC" VAL="Amount of buffered memory"/><EXTRA_ELEMENT NAME="TITLE" VAL="Memory Buffers"/></EXTRA_DATA></METRIC><METRIC NAME="part_max_used" VAL="36.9" TYPE="float" UNITS="%" TN="7043" TMAX="180" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="disk"/><EXTRA_ELEMENT NAME="DESC" VAL="Maximum percent used for all partitions"/><EXTRA_ELEMENT NAME="TITLE" VAL="Maximum Disk Space Used"/></EXTRA_DATA></METRIC><METRIC NAME="cpu_system" VAL="0.0" TYPE="float" UNITS="%" TN="7043" TMAX="90" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="cpu"/><EXTRA_ELEMENT NAME="DESC" VAL="Percentage of CPU utilization that occurred while executing at the system level"/><EXTRA_ELEMENT NAME="TITLE" VAL="CPU System"/></EXTRA_DATA></METRIC><METRIC NAME="disk_total" VAL="412.914" TYPE="double" UNITS="GB" TN="7043" TMAX="1200" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="disk"/><EXTRA_ELEMENT NAME="DESC" VAL="Total available disk space"/><EXTRA_ELEMENT NAME="TITLE" VAL="Total Disk Space"/></EXTRA_DATA></METRIC><METRIC NAME="mem_shared" VAL="0" TYPE="float" UNITS="KB" TN="7043" TMAX="180" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="memory"/><EXTRA_ELEMENT NAME="DESC" VAL="Amount of shared memory"/><EXTRA_ELEMENT NAME="TITLE" VAL="Shared Memory"/></EXTRA_DATA></METRIC><METRIC NAME="machine_type" VAL="x86_64" TYPE="string" UNITS="" TN="7043" TMAX="1200" DMAX="0" SLOPE="zero"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="system"/><EXTRA_ELEMENT NAME="DESC" VAL="System architecture"/><EXTRA_ELEMENT NAME="TITLE" VAL="Machine Type"/></EXTRA_DATA></METRIC><METRIC NAME="cpu_wio" VAL="0.0" TYPE="float" UNITS="%" TN="7043" TMAX="90" DMAX="0" SLOPE="both"><EXTRA_DATA><EXTRA_ELEMENT NAME="GROUP" VAL="cpu"/><EXTRA_ELEMENT NAME="DESC" VAL="Percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request"/><EXTRA_ELEMENT NAME="TITLE" VAL="CPU wio"/></EXTRA_DATA></METRIC><METRIC NAME="cpu_num" VAL="16" TYPE="uint16" UNITS="CPUs" TN="7043" TMAX="1200" DMAX="0" SLOPE var cpro_id = "u6292429";小编还为您整理了以下内容,可能对您也有帮助:
如何将JSON,Text,XML,CSV 数据文件导入 MySQL
将外部数据导入(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”.
这是MySQL出于安全考虑的默认配置。因此,我们需要在配置文件my.cnf中(以Debian发行版的Linux, 如Ubuntu为例, 即是在/etc/my.cnf中),确保:
local-infile=1
抑或是在命令行启动MySQL时加上--local-infile这一项:
mysql --local-infile -uroot -pyourpwd yourdbname
此外,我们也可以使用MySQL的一个官方导入程序mysqlimport ,这个程序本质上就是为LOAD DATA FILE提供了一个命令行的interface,很容易理解,我们这里就不再详述。
2. 将XML文件导入MySQL
这件事的完成方式,与我们的XML的形式有着很大的关系。
举个例子说,当你的XML数据文件有着很非常规范的格式,比如:
<?xml version="1.0"?>
<row>
<field name="id">1</field>
<field name="name">Free</field>
<field name="balance">2333.3333</field>
</row>
<row>
<field name="id">2</field>
<field name="name">Niki</field>
<field name="balance">1289.2333</field>
</row>
或者
<row column1="value1" column2="value2" .../>
我们就可以很方便使用LOAD XML来导入,这里可以参见MySQL的官方手册--LOAD XML Syntax。
然而我们可能有另外一些需求,比如说,我们可能会想要将XML文件的域映射到不同名字的列(TABLE COLUMN)之中。这里要注意,MySQL v5.0.7以后,MySQL的Stored Procere中不能再运行LOAD XML INFILE 或者LOAD DATA INFILE。所以转换的程序(procere)的编写方式与在此之前有所不同。这里,我们需要使用Load_File()和ExtractValue()这两个函数。
以下是一个示例XML文件和程序:
文件:
<?xml version="1.0"?>
<some_list>
<someone id="1" fname="Rob" lname="Gravelle"/>
<someone id="2" fname="Al" lname="Bundy"/>
<someone id="3" fname="Little" lname="Richard"/>
</some_list>
程序:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `import_some_xml`(path varchar(255), node varchar(255))
BEGIN
declare xml_content text;
declare v_row_index int unsigned default 0;
declare v_row_count int unsigned;
declare v_xpath_row varchar(255);
set xml_content = load_file(path);
-- calculate the number of row elements.
set v_row_count = extractValue(xml_content, concat('count(', node, ')'));
-- loop through all the row elements
while v_row_index < v_row_count do
set v_row_index = v_row_index + 1;
set v_xpath_row = concat(node, '[', v_row_index, ']/@*');
insert into applicants values (
extractValue(xml_content, concat(v_xpath_row, '[1]')),
extractValue(xml_content, concat(v_xpath_row, '[2]')),
extractValue(xml_content, concat(v_xpath_row, '[3]'))
);
end while;
END
在MySQL中,使用它进行导入:
call import_some_xml('你的XML文件路径', '/some_list/someone');
程序相当的直白,只要了解一下MySQL的脚本编写即可。
这里提一下DELIMITER $$。我们知道MySQL的命令分隔符默认为分号,然而脚本中很显然是有分号的,但是我们并不希望立即执行,所以我们需要临时更改分隔符。
3. 将JSON文件导入MySQL
如何将JSON文件导入MySQL中,是一个很有趣的话题。JSON是一种现在相当常用的文件结构,所以掌握它的导入具有比较广泛的意义。
很多时候,我们处理的JSON数据是以如下形式出现的:
{"name":"Julia","gender":"female"}
{"name":"Alice","gender":"female"}
{"name":"Bob","gender":"male"}
{"name":"Julian","gender":"male"}
而并不是规整的[{},{},{},{}](一些NoSQL数据库的Export)。
这样的形势对于载入有一个好处:因为每一行是一个JSON Object,所以我们便可以按行处理此文件,而不需要因为JSON的严格结构将整个文件(比如一个许多G的.json文件)全部载入。
方式一 使用common-schema
common-schema是一个应用很广泛的MySQL的框架,它有着很丰富的功能和详细的文档。我们可以使用它的JSON解析的功能。(它还具有JSON转换成XML等等方便的功能)
具体说来,将common-schema导入之后,使用它的extract_json_value函数即可。源码中:
create function extract_json_value(
json_text text charset utf8,
xpath text charset utf8
) returns text charset utf8
该函数接受两个参数,一个是json_text,表示json文件的内容,另一个是xpath,表示数据的结构(这里可以类比XML文件的处理)。很多读者应该知道,XPath是用来对XML中的元素进行定位的,这里也可以作一样的理解。
以本段开始的几行JSON为例,这里common-schema的使用如下例:
select common_schema.extract_json_value(f.event_data,'/name') as name, common_schema.extract_json_value(f.event_data,'/gender') as gender, sum(f.event_count) as event_count from json_event_fact f group by name, gender;
关于event_data,我们需要先理解LOAD DATA INFILE是一个event,不同的event type对应不同的event data。这部分知识可以参看Event Data for Specific Event Types
如果感兴趣,可以参看其源码。参看一个受到广泛使用的项目的源码,对于自身成长是很有益的。
当然了,我们也可以像之前处理XML文件导入一样,自己编写程序。这里便不再给出实例程序,有兴趣的读者可以自行编写或者跟笔者交流。
方式二 使用mysqljsonimport
这是Anders Karlsson的一个完成度很高的作品。这一份程序由C写成。它依赖于一个JSON Parser,Jansson。他们都有着比较好的维护和文档,所以使用上体验很好。
mysqljsonimport的下载在SourceForge上。具体使用参照其文档即可。
为了方便不熟悉源码安装的朋友,笔者在这里提一下安装流程和注意事项。
安装命令顺序如下:
$ wget http://sourceforge.net/projects/mysqljson/files/myjsonimport_1.6/mysqljsonimport-1.6.tar.gz
$ tar xvfz mysqljsonimport-1.6.tar.gz
$ cd mysqljsonimport-1.6
$ ./configure –-with-mysql=/xxx/mysql
$ make
$ make check
$ sudo make install
--with-mysql这一步不是必要的,只要你安装的mysql的路径是系统的默认路径。很关键的,而且很容易被不熟悉的朋友忽略的是,这一个C程序要成功编译和运行,是需要MySQL的C API的,所以需要安装的依赖,除了jansson,还有libmysqlclient-dev。
jansson的安装就是简单的源码安装,libmysqlclient-dev则可以使用包管理工具(比如ubuntu中使用apt-get即可;编译和安装前,建议先sudo apt-get update以避免不必要的麻烦)。
导入命令:
$ ./mysqljsonimport –-database test –-table tablename jsonfilename
还有一个parser,作者是Kazuho,感兴趣的读者可以参看一下,他的相关博文是mysql_json - a MySQL UDF for parsing JSON ,github项目是mysql_json。
4. 使用MySQL workbench
Workbench这个工具对于许多不熟悉SQL语言或者命令行的朋友还是很方便和友好的。利用它,可以方便地导入和导出CSV和JSON文件。
具体操作图例参见MySQL官方手册即可:Table Data Export and Import Wizard,这里不再赘述。
文/freenik(简书作者)
原文链接:http://www.jianshu.com/p/d330edb61fe2如何将JSON,Text,XML,CSV 数据文件导入 MySQL
将外部数据导入(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”.
这是MySQL出于安全考虑的默认配置。因此,我们需要在配置文件my.cnf中(以Debian发行版的Linux, 如Ubuntu为例, 即是在/etc/my.cnf中),确保:
local-infile=1
抑或是在命令行启动MySQL时加上--local-infile这一项:
mysql --local-infile -uroot -pyourpwd yourdbname
此外,我们也可以使用MySQL的一个官方导入程序mysqlimport ,这个程序本质上就是为LOAD DATA FILE提供了一个命令行的interface,很容易理解,我们这里就不再详述。
2. 将XML文件导入MySQL
这件事的完成方式,与我们的XML的形式有着很大的关系。
举个例子说,当你的XML数据文件有着很非常规范的格式,比如:
<?xml version="1.0"?>
<row>
<field name="id">1</field>
<field name="name">Free</field>
<field name="balance">2333.3333</field>
</row>
<row>
<field name="id">2</field>
<field name="name">Niki</field>
<field name="balance">1289.2333</field>
</row>
或者
<row column1="value1" column2="value2" .../>
我们就可以很方便使用LOAD XML来导入,这里可以参见MySQL的官方手册--LOAD XML Syntax。
然而我们可能有另外一些需求,比如说,我们可能会想要将XML文件的域映射到不同名字的列(TABLE COLUMN)之中。这里要注意,MySQL v5.0.7以后,MySQL的Stored Procere中不能再运行LOAD XML INFILE 或者LOAD DATA INFILE。所以转换的程序(procere)的编写方式与在此之前有所不同。这里,我们需要使用Load_File()和ExtractValue()这两个函数。
以下是一个示例XML文件和程序:
文件:
<?xml version="1.0"?>
<some_list>
<someone id="1" fname="Rob" lname="Gravelle"/>
<someone id="2" fname="Al" lname="Bundy"/>
<someone id="3" fname="Little" lname="Richard"/>
</some_list>
程序:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `import_some_xml`(path varchar(255), node varchar(255))
BEGIN
declare xml_content text;
declare v_row_index int unsigned default 0;
declare v_row_count int unsigned;
declare v_xpath_row varchar(255);
set xml_content = load_file(path);
-- calculate the number of row elements.
set v_row_count = extractValue(xml_content, concat('count(', node, ')'));
-- loop through all the row elements
while v_row_index < v_row_count do
set v_row_index = v_row_index + 1;
set v_xpath_row = concat(node, '[', v_row_index, ']/@*');
insert into applicants values (
extractValue(xml_content, concat(v_xpath_row, '[1]')),
extractValue(xml_content, concat(v_xpath_row, '[2]')),
extractValue(xml_content, concat(v_xpath_row, '[3]'))
);
end while;
END
在MySQL中,使用它进行导入:
call import_some_xml('你的XML文件路径', '/some_list/someone');
程序相当的直白,只要了解一下MySQL的脚本编写即可。
这里提一下DELIMITER $$。我们知道MySQL的命令分隔符默认为分号,然而脚本中很显然是有分号的,但是我们并不希望立即执行,所以我们需要临时更改分隔符。
3. 将JSON文件导入MySQL
如何将JSON文件导入MySQL中,是一个很有趣的话题。JSON是一种现在相当常用的文件结构,所以掌握它的导入具有比较广泛的意义。
很多时候,我们处理的JSON数据是以如下形式出现的:
{"name":"Julia","gender":"female"}
{"name":"Alice","gender":"female"}
{"name":"Bob","gender":"male"}
{"name":"Julian","gender":"male"}
而并不是规整的[{},{},{},{}](一些NoSQL数据库的Export)。
这样的形势对于载入有一个好处:因为每一行是一个JSON Object,所以我们便可以按行处理此文件,而不需要因为JSON的严格结构将整个文件(比如一个许多G的.json文件)全部载入。
方式一 使用common-schema
common-schema是一个应用很广泛的MySQL的框架,它有着很丰富的功能和详细的文档。我们可以使用它的JSON解析的功能。(它还具有JSON转换成XML等等方便的功能)
具体说来,将common-schema导入之后,使用它的extract_json_value函数即可。源码中:
create function extract_json_value(
json_text text charset utf8,
xpath text charset utf8
) returns text charset utf8
该函数接受两个参数,一个是json_text,表示json文件的内容,另一个是xpath,表示数据的结构(这里可以类比XML文件的处理)。很多读者应该知道,XPath是用来对XML中的元素进行定位的,这里也可以作一样的理解。
以本段开始的几行JSON为例,这里common-schema的使用如下例:
select common_schema.extract_json_value(f.event_data,'/name') as name, common_schema.extract_json_value(f.event_data,'/gender') as gender, sum(f.event_count) as event_count from json_event_fact f group by name, gender;
关于event_data,我们需要先理解LOAD DATA INFILE是一个event,不同的event type对应不同的event data。这部分知识可以参看Event Data for Specific Event Types
如果感兴趣,可以参看其源码。参看一个受到广泛使用的项目的源码,对于自身成长是很有益的。
当然了,我们也可以像之前处理XML文件导入一样,自己编写程序。这里便不再给出实例程序,有兴趣的读者可以自行编写或者跟笔者交流。
方式二 使用mysqljsonimport
这是Anders Karlsson的一个完成度很高的作品。这一份程序由C写成。它依赖于一个JSON Parser,Jansson。他们都有着比较好的维护和文档,所以使用上体验很好。
mysqljsonimport的下载在SourceForge上。具体使用参照其文档即可。
为了方便不熟悉源码安装的朋友,笔者在这里提一下安装流程和注意事项。
安装命令顺序如下:
$ wget http://sourceforge.net/projects/mysqljson/files/myjsonimport_1.6/mysqljsonimport-1.6.tar.gz
$ tar xvfz mysqljsonimport-1.6.tar.gz
$ cd mysqljsonimport-1.6
$ ./configure –-with-mysql=/xxx/mysql
$ make
$ make check
$ sudo make install
--with-mysql这一步不是必要的,只要你安装的mysql的路径是系统的默认路径。很关键的,而且很容易被不熟悉的朋友忽略的是,这一个C程序要成功编译和运行,是需要MySQL的C API的,所以需要安装的依赖,除了jansson,还有libmysqlclient-dev。
jansson的安装就是简单的源码安装,libmysqlclient-dev则可以使用包管理工具(比如ubuntu中使用apt-get即可;编译和安装前,建议先sudo apt-get update以避免不必要的麻烦)。
导入命令:
$ ./mysqljsonimport –-database test –-table tablename jsonfilename
还有一个parser,作者是Kazuho,感兴趣的读者可以参看一下,他的相关博文是mysql_json - a MySQL UDF for parsing JSON ,github项目是mysql_json。
4. 使用MySQL workbench
Workbench这个工具对于许多不熟悉SQL语言或者命令行的朋友还是很方便和友好的。利用它,可以方便地导入和导出CSV和JSON文件。
具体操作图例参见MySQL官方手册即可:Table Data Export and Import Wizard,这里不再赘述。
文/freenik(简书作者)
原文链接:http://www.jianshu.com/p/d330edb61fe2用python怎样把xml的数据导入到mysql数据库里
用python怎样把xml的数据导入到mysql数据库里
with open("fileinfo.txt", "rt") as handle:
datas = [ln.split('\t') for ln in handle]
conn = MySQLdb.connect(host='localhost', user='mysql', passwd='', db='db')
curr = conn.cursor()
curr.executemany("insert into tb values (?, ?, ?)", datas)
conn.commit()用python怎样把xml的数据导入到mysql数据库里
用python怎样把xml的数据导入到mysql数据库里
with open("fileinfo.txt", "rt") as handle:
datas = [ln.split('\t') for ln in handle]
conn = MySQLdb.connect(host='localhost', user='mysql', passwd='', db='db')
curr = conn.cursor()
curr.executemany("insert into tb values (?, ?, ?)", datas)
conn.commit()如何将xml格式文件导入mysql中
举例说明如下
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如何将xml格式文件导入mysql中
举例说明如下
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如何在windows下导入*.xml.bz2到mysql数据库中
举例说明
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
excel xml格式的文件 导入到 MYSQL 数据库的语句
这个方法最简单但不是傻瓜式的方法,需要你对Excel和MySQL都有一点点了解。 当然,我在最后提供了一个作为例子的Excel文件,但仍然需要你会写MySQL的INSERT语句,这样才能调试可能出现的错误。 1.在需要导入的数据最后一列,写入一个Excel公式(例子中是“SQL”下面的单元格,“SQL”是不必要的,仅仅是为了看起来方便)。 =CONCATENATE("insert into employee(name,birthday,email,hobby)values('",RC[-4],"','",RC[-3],"','",RC[-2],"','",RC[-1],"');") 这样就会生成insert语句,正如你在例子Excel文件中看到的(当你单击SQL下面的单元格时,可以看到公式)。 这个实际上是使用了Excel的CONCATENATE字符串连接函数,将数据生成你需要的SQL语句。RC[-2]是从最后一列(不包括该列)往前数的第二列。 2.将"SQL"下面单元格的公式复制到该列的其它单元格,这样可以看到生成了所需要的所有SQL语句。 3.将最后一列选中,复制数据到一个文本文件,将该文本文件另存为一个.sql文件(别忘了删除第一行的“SQL”)。 4.能够运行sql文件的工具有很多,运行这个文件就可以了。如果没有工具,参考 在windows下批量执行mysql脚本( http://www.albertsong.com/read-21.html)。 使用上面的方法,你需要知道什么样的insert语句对于mysql来说是正确的。 最常见的是日期的格式,如果不转换成字符串,用上面的方法会生成一个整数,这样插入mysql后就不对了。 因此上面的公式改成 =CONCATENATE("insert into employee(name,birthday,email,hobby)values('",RC[-4],"','",TEXT(RC[-3],"yyyy-mm-dd hh:mm:ss"),"','",RC[-2],"','",RC[-1],"');") 这里用到了TEXT函数来将日期格式化成mysql能接受的日期字符串。 具体请参考例子。Excel2Mysql.rar 文件说明如下: doc.txt--本文 SqlGen.xls--Excel例子文件 create.sql--建表语句 insert.sql--生成的insert语句 function.txt--需要在Excel中使用的函数 写了这么多,实际上就一句话:使用Excel的CONCATENATE函数生成sql语句并执行。 如果懂一点儿VBA可以直接生成insert.sql文件