免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4564 | 回复: 17
打印 上一主题 下一主题

[文本处理] shell 导入mysql数据库的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-26 16:09 |只看该作者 |正序浏览
本帖最后由 tahaomei 于 2014-09-26 16:11 编辑

比如我的sha.txt文件内容如下:

禾嘉股份;600093
大名城;600094
哈高科;600095
云天化;600096
开创国际;600097
广州发展;600098
林海股份;600099
同方股份;600100
明星电力;600101
莱钢股份;600102
青山纸业;600103


我在shell中敲入如下mysql命令:

  1. create database IF NOT EXISTS dbname;
  2. use dbname;
  3. create table IF NOT EXISTS tablename
  4. (
  5.    id int not null auto_increment primary key,
  6.    code int(6) not null,
  7.    name varchar(40) not null
  8. )
  9. comment='股票代码及名称表'
  10. engine=InnoDB;

  11. load data local infile "/Users/macair/stock/dat/sha.txt" into table tablename(name,code) fields terminated by ';' lines terminated
  12. by '\r\n';
复制代码
结果执行的时候,出现如下错误,

ERROR 1064 (42000) at line 13: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/Users/macair/stock/dat/sha.txt into table tablename(name,code) fields termin' at line 1


请问是什么原因呢?google了下,还是没找到答案,觉得自己的代码没错误啊。

论坛徽章:
0
18 [报告]
发表于 2014-09-28 19:40 |只看该作者
本帖最后由 tahaomei 于 2014-09-28 19:42 编辑
chengchow 发表于 2014-09-28 10:10
回复 7# tahaomei
tablename 设置字段名称就不能用fields terminated by等选项
二者只能二选一


对的,我前几天也试了,将fields那部分去掉就可以了,然后将文本文件里的分隔符;改成制表符就可以了。谢谢你今天告诉我为什么了。

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
17 [报告]
发表于 2014-09-28 10:10 |只看该作者
本帖最后由 chengchow 于 2014-09-28 10:21 编辑

回复 7# tahaomei
tablename 设置字段名称就不能用fields terminated by等选项
二者只能二选一

你只能编辑文本了
shell>sed -ri 's/;/\t/g' sha.txt
mysql>load data local infile './sha.txt' into table tablename (name,code);
或者
shell> awk 'BEGIN{FS=OFS=";"}{print NR,$2,$1}' sha.txt > sha1.txt
mysql> load data local infile './sha1.txt' into table table name fields terminated by ';' lines terminated by '\n';



   

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
16 [报告]
发表于 2014-09-27 11:49 |只看该作者
回复 15# Herowinter


   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
15 [报告]
发表于 2014-09-27 09:48 |只看该作者
回复 14# Kasiotao

楼上的真细心,大赞。)
   

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
14 [报告]
发表于 2014-09-27 09:20 |只看该作者
回复 1# tahaomei
delimiter //
create database IF NOT EXISTS dbname;
use dbname;
create table IF NOT EXISTS tablename ( id int not null auto_increment primary key, code int(6) not null,  name varchar(40) not null ) comment='股票代码及名称表' engine=InnoDB;
load data local infile "/your path/sha.txt" into table tablename fields terminated by ';' lines terminated by '\n' (name, code)
//
参数列表要在terminated by子语句后面,不知道你在哪里看的网上示例,如果语法不清除可以多参看Mysql的官方文档:
http://dev.mysql.com/doc/refman/5.5/en/load-data.html
上面的例子说的很清楚了:
  1. LOAD DATA LOCAL INFILE 'C:/path/to/mytable.txt' IGNORE
  2. INTO TABLE mytable
  3. FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
  4. (int_col, @float_col)
  5. SET float_col = replace(@float_col, ',', '.');
复制代码
另外lines terminated的地方,如果是windows请用\r\n,linux请用\n,mac的也许是\r,自己试试吧,还有什么语法上的疑问都可以在文档上找到答案的。

我运行成功的终端截图:
  1. mysql> delimiter //
  2. mysql> create database IF NOT EXISTS dbname; use dbname; create table IF NOT EXISTS tablename ( id int not null auto_increment primary key, code int(6) not null,  name varchar(40) not null ) comment='股票代码及名称表' engine=InnoDB; load data local infile "/home/homisunit/Documents/StaDB/sha.txt" into table tablename fields terminated by ';' lines terminated by '\n' (name, code)//
  3. Query OK, 1 row affected (0.00 sec)

  4. Query OK, 0 rows affected (0.00 sec)

  5. Query OK, 0 rows affected (0.24 sec)

  6. Query OK, 11 rows affected (0.36 sec)
  7. Records: 11  Deleted: 0  Skipped: 0  Warnings: 0

  8. mysql> select * from tablename//
  9. +----+--------+--------------+
  10. | id | code   | name         |
  11. +----+--------+--------------+
  12. |  1 | 600093 | 禾嘉股份     |
  13. |  2 | 600094 | 大名城       |
  14. |  3 | 600095 | 哈高科       |
  15. |  4 | 600096 | 云天化       |
  16. |  5 | 600097 | 开创国际     |
  17. |  6 | 600098 | 广州发展     |
  18. |  7 | 600099 | 林海股份     |
  19. |  8 | 600100 | 同方股份     |
  20. |  9 | 600101 | 明星电力     |
  21. | 10 | 600102 | 莱钢股份     |
  22. | 11 | 600103 | 青山纸业     |
  23. +----+--------+--------------+
  24. 11 rows in set (0.00 sec)
复制代码

论坛徽章:
0
13 [报告]
发表于 2014-09-27 08:07 |只看该作者
回复 10# Kasiotao

测试了,还是同样的错误。

ERROR 1064 (42000) at line 12: You have an error in your SQL syntax; check the manual that corresponds to your My

网上看别人的案例,是可以有这个括号的。


   

论坛徽章:
0
12 [报告]
发表于 2014-09-27 08:05 |只看该作者
回复 11# reb00t

提示没有test2.php文件。还有,能否在我的mysql代码上修改呢?


   

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
11 [报告]
发表于 2014-09-26 19:29 |只看该作者
本帖最后由 reb00t 于 2014-09-26 19:30 编辑
  1. <?php

  2. require('test2.php');
  3. $test = new  Mysql('127.0.0.1','root','xxxxx');
  4. $test->myconnect();
  5. $test->createdb("dbtest");
  6. $test->query($sql);
  7. $sql = "
  8. create table IF NOT EXISTS tablename
  9. (
  10.    id int not null auto_increment primary key,
  11.    code int(6) not null,
  12.    name varchar(40) not null
  13. )comment='股票代码及名称表'  engine=InnoDB;
  14. ";
  15. $test->query($sql);
  16. $tmparr=array();
  17. $file = file_get_contents('200.txt');
  18. $newfile = mb_convert_encoding($file, 'UTF-8','GBK');
  19. $arr = preg_split('/[\n]+/', trim($newfile));
  20. foreach ($arr as $k => $v) {
  21.    $brr = preg_split('/;/', trim($v));
  22.    $tmparr['code'] = $brr[1];
  23.    $tmparr['name'] = $brr[0];
  24.   $sql= $test->buildInsert('tablename',$tmparr);
  25.   if($test->query($sql)){
  26.       echo "$brr[1] $brr[0] insert OK\n";
  27.   }

  28. }

  29. ?>

  30. 结果:
  31. 600094 大名城 insert OK
  32. 600095 哈高科 insert OK
  33. 600096 云天化 insert OK
  34. 600097 开创国际 insert OK
  35. 600098 广州发展 insert OK
  36. 600099 林海股份 insert OK
  37. 600100 同方股份 insert OK
  38. 600101 明星电力 insert OK
  39. 600102 莱钢股份 insert OK
  40. 600103 青山纸业 insert OK
复制代码

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
10 [报告]
发表于 2014-09-26 18:38 |只看该作者
回复 9# tahaomei

tablename后面不能有括号把 我没用过这个语法你 去掉试试
   
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP