首页 > MySQL导入数据问题

MySQL导入数据问题

新手问题,望各位大大不惜赐教,先谢过了。

问题开始:

我在尝试把一个在公共领域发布的一类商品定价导入到MySQL中,并最终通过一些php绘图程序显示某样商品的价格走势。(跟股票走势图差不多)目前先想把数据导入这块做好,绘图我想再慢慢研究可以研究出来。

数据来源是一个每天都会更新一次的txt文件,这个txt文件大概有18000行,我把2013-06-02的txt的头5行的内容粘贴过来,Prodct字段是是唯一的商品名:

Product|Price|StdDev|Average|High|Low|Change|Raw N
Honey Cake|1.00|0.00|1.00|1.00|1.00|0.00|1
Cheese Cake (Grade A)|0.25|0.00|0.25|0.25|0.25|0.00|1
Cheese Cake (Grade B)|0.25|0.00|0.25|0.25|0.25|-0.13|1
MoonCake|0.25|0.00|0.25|0.25|0.25|0.00|1

可以看出数据是由7个"|"分割成8个字段组成的。

于是我先从建立一个叫做productprice的table开始,总共建立了9栏(包括一个非得创建的id字段?):

create table productprice(
id int not null auto_increment, // 问题一:貌似建立MySQL一定需要一个id字段?
product varchar(40) not null,
price int,
stddev int,
average int,
high int,
low int,
changen int, // 问题二:我对应会原来的表格写 change int, 但MySQL不让建,于是我改成changen
rawn int,
primary key(id)
)engine=innodb charset=utf8; 

因为数据的第一行Product|Price|StdDev|Average|High|Low|Change|Raw N 没有用,于是我手工把第一行去掉。 //问题三:在Linux下用什么命令可以自动去掉一个txt文件的第一行呢?

然后我用这个命令导入数据:

LOAD DATA LOCAL INFILE '/path/20130602.txt' INTO TABLE productprice
FIELDS TERMINATED BY '|';

哗啦哗啦零点几秒之内就导入好了,截个图上来:

明显地因为存在了ID字段,所以就对不上了,所有数据都往左偏移了一格,product名字不见了,price去到了product的位置,结果我就卡在这里了。

我的问题:

问题一:貌似建立MySQL一定需要一个id字段? 在建立table的时候好像不建立id的话不让操作,我只好建立了一个id,但要如何跟我下载下来的数据匹配呢?因为下载下来的数据是没有id的,但product是唯一。

问题二:我对应回原来的表格写 change int, 但MySQL不让建,于是我改成changen 这个好像无伤大雅,我先当change是一个非法的名字了。

问题三:在Linux下用什么命令可以自动去掉一个txt文件的第一行呢? 还有回到问题一,我需要在每行前面加一个1| 2| 3|这样的数据吗?如果想通过Linux脚本操作的话要如何进行呢?(因为到最后我想把整个流程自动化下来,每天定时下载报价,导入MySQL)

问题四:因为报价每天都会更新一次,我再把相近的内容再导入数据库中不就变得很诡异?后续绘走势图的话很明显还缺少一个时间的字段啊(请告诉我根据我的需求应该要怎么建立表格比较好?)

问题五:问题四的延伸,我看了一下炒股软件,做法是把例如000001的股票的每天的价格都写入一个文本文件中,例如有100支股票,就有100个TXT文件,这种储存方法看起来很不错,但我的例子有18000支“股票”,而且每隔几个月表里面的产品会增加或者减少,我没有能力把增加和减少的产品挑出来,如果这样做的话,php读取txt里面的东西比读取MySQL中的要方便吗?其实对我来说最重要的就是product和price这两个字段,如果写入txt中体积也不会增加好多,想起来也比放在MySQL科学一点。

最后的问题:你会怎么做一个这样的东西呢?


从需求来看,你目的是生成价格走势图,所以时间轴是必需的,如果在每天的txt数据文件内,商品名唯一,最好用【商品名+时间轴】 作为联合主键,而不是自增的id。

create table productprice(
product varchar(40) not null,
price int,
stddev int,
average int,
high int,
low int,
changen int, 
rawn int,
reset_date date not null,
primary key(product,reset_date)
)engine=innodb charset=utf8; 

关于第一行想去掉的问题,你google下LOAD DATA INFILE 的文法,是可以用【IGNORE】来指定起始行的。
同时用【set】来设定插入值

LOAD DATA LOCAL INFILE '/path/20130602.txt' INTO TABLE productprice
 (col1,col2,col3,col4,col5,col6,col7,col8)
 IGNORE 1 LINES //无视第一行
 FIELDS TERMINATED BY '|'
 SET col9 = CURRENT_TIMESTAMP; //用set来插入txt没有的当前时间列

PS : 用txt文件名做主键也不错。(以上代码都未编译,希望对你有帮助)


以下是个人所学,如果有错还请指正。 问题一:MYSQL建表不一定要ID但是标准要求每张表建一个ID,如果说你建表不建ID就报错,多半是SQL的问题,如果是MYSQL配置里的设置的那我就不知道了。 问题二:change是MYSQL里的关键字。不好用在建表字段。 问题三:LINUX自动删除一个文件的第一行,个人认为除非写一个扩展。 问题四:你导入的TXT文件已经给出了表的字段结构,那就按它的结构建,如果要加ID在插入前是可以选择表字段导入的。 问题五:个人认为就以导入MYSQL的方式,服务每天更执行一次导入SQL,还是不错的,如果记录量大那就得注意了

【热门文章】
【热门文章】