如何将JSON,Text,XML,CSV 数据文件导入 MySQL

如何将JSON,Text,XML,CSV 数据文件导入 MySQL,第1张

将外部数据导入(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 '你的文件路径(如~/filecsv)' 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 616, “Security Issues with LOAD DATA LOCAL”

这是MySQL出于安全考虑的默认配置。因此,我们需要在配置文件mycnf中(以Debian发行版的Linux, 如Ubuntu为例, 即是在/etc/mycnf中),确保:

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="10">

<row>

<field name="id">1</field>

<field name="name">Free</field>

<field name="balance">23333333</field>

</row>

<row>

<field name="id">2</field>

<field name="name">Niki</field>

<field name="balance">12892333</field>

</row>

或者

<row column1="value1" column2="value2" />

我们就可以很方便使用LOAD XML来导入,这里可以参见MySQL的官方手册--LOAD XML Syntax。

然而我们可能有另外一些需求,比如说,我们可能会想要将XML文件的域映射到不同名字的列(TABLE COLUMN)之中。这里要注意,MySQL v507以后,MySQL的Stored Procedure中不能再运行LOAD XML INFILE 或者LOAD DATA INFILE。所以转换的程序(procedure)的编写方式与在此之前有所不同。这里,我们需要使用Load_File()和ExtractValue()这两个函数。

以下是一个示例XML文件和程序:

文件:

<xml version="10">

<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_schemaextract_json_value(fevent_data,'/name') as name, common_schemaextract_json_value(fevent_data,'/gender') as gender, sum(fevent_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 >try {   

    phonegetLong(0);  

    persongetLong("name"); // 会抛异常,因为名字无法转换为long        

    phoneoptLong(0); // 代码内置的默认值  

    phoneoptLong(0, 1000); // 用户提供的默认值  

    personoptLong("name");  

    personoptLong("name", 1000); // 不像上面那样抛异常,而是返回1000  

} catch (JSONException ex) {  

    // 异常处理代码  

}

最近有一个需求,前端向后台提交json,后台解析并且将提交的值插入数据库中,

难点

1、php解析json(这个不算难点了,网上实例一抓一大把)

2、解析json后,php怎样拿到该拿的值

<php

require

('connectphp');

/

本例用到的数据:

post_array={"order_id":"0022015112305010013","buyer_id":"2","seller_id":"1","all_price":"10000","json_list":[{"product_id":"3","product_number":"3"},{"product_id":"8","product_number":"2"},{"product_id":"10","product_number":"4"}]}

/

$post_array=$_POST['post_array'];

//--解析Json,获取对应的变量值

$obj=json_decode($post_array,TRUE);

$order_id

=

$obj['order_id'];

$buyer_id

=

$obj['buyer_id'];

$seller_id

=

$obj['seller_id'];

$all_price

=

$obj['all_price'];

$i=0;//循环变量

//--得到Json_list数组长度

$num=count($obj["json_list"]);

//--遍历数组,将对应信息添加入数据库

for

($i;$i<$num;$i++)

{

$list_product_id[]=$obj["json_list"][$i]["product_id"];

$list_product_number[]=$obj["json_list"][$i]["product_number"];

$insert_order_product_sql="INSERT

INTO

tbl_order_product

(order_id,product_id,product_number)

VALUES

(,,)";

$result

=

$sqlconn

->

prepare($insert_order_product_sql);

$result

->

bind_param("sss",

$order_id,$list_product_id[$i],$list_product_number[$i]);

$result->execute();

}

//--添加订单信息

$insert_order_sql="INSERT

INTO

tbl_order

(order_id,buyer_id,seller_id,all_price)

VALUES

(,,,)";

$result=$sqlconn->prepare($insert_order_sql);

$result->bind_param("ssss",$order_id,$buyer_id,$seller_id,$all_price);

$result->execute();

$result

->

close();

$sqlconn

->

close();

>

投稿者信息

昵称:

Hola

Email:

jamcistos@outlookcom

json的数据jsonloads进来以后会变成一个json的对象,你需要自己把python对象中的字段值取出来,拼成sql语句

你可以把这个过程封装成一个函数

import json

def save_json(json_str):

obj = jsonloads(json_str)

sql = 'insert into tbl values ("%s")' % obj['id'] #这里注意编码,要转成数据库的编码格式

#blabla

以上就是关于如何将JSON,Text,XML,CSV 数据文件导入 MySQL全部的内容,包括:如何将JSON,Text,XML,CSV 数据文件导入 MySQL、怎么将微信服务器获得的json数组添加到数据库表中、PHP接收json 并将接收数据插入数据库的实现代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10071248.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存