mysql LOAD DATA INFILE没有FIELDS TERMINATED BY

时间:2015-05-22 19:49:02

标签: mysql sql

大家好我需要将文件加载到表中

我用

LOAD DATA INFILE 'D:....example.txt' INTO TABLE test_table
CHARACTER SET utf8
LINES TERMINATED BY '\r\n';

我的文件看..

   4STPS      0000000480000015426  20040425            42.480060981876  20150325  11
   4STPS      0000000480000015458  20040425           110.240060981880  20150325  11
   4STPS      0000000480000015492  20040425           242.500060981883  20150325  11
   4STPS      0000000480000015583  20040510            92.510060981888  20150325  11
   4STPS      0000000480000015584  20040510            92.490060981889  20150325  11
   4STPS      0000000480000015592  20040510            87.140060981890  20150325  11
   4STPS      0000000480000015631  20040510           117.500060981896  20150325  11

我的桌子是......

CREATE TABLE `test_table` (
  `me` varchar(4) DEFAULT NULL,
  `group_b` varchar(10) DEFAULT NULL,
  `agent` varchar(9) DEFAULT NULL,
  `element` varchar(10) DEFAULT NULL,
  `ini_vig` decimal(8,0) DEFAULT NULL,
  `amount` decimal(10,4) DEFAULT NULL,
  `recive` varchar(8) DEFAULT NULL,
  `ven_rbo` decimal(8,0) DEFAULT NULL,
  `ado` varchar(3) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

执行时遇到此错误Error Code: 1406. Data too long for column 'me' at row 1

我所做的是计算字段之间的空格是字母数字,只在字段之间添加数字字段。

我无法更改文件结构如何更改表格以便保存信息?

2 个答案:

答案 0 :(得分:1)

您的LOAD DATA INFILE目前只看到一列

您需要执行以下操作

步骤01:创建一个包含单列以加载批量数据的表

use test
DROP TABLE bulkdata;
CREATE TABLE bulkkdata
(
    id  INT NOT NULL AUTO_INCREMENT,
    txt CHAR(84),
    PRIMARY KEY (id)
);

步骤02:加载批量数据的单列

LOAD DATA INFILE 'D:....example.txt' INTO TABLE bulkdata
CHARACTER SET utf8
LINES TERMINATED BY '\r\n' (txt);

步骤02:使用SUBSTR()txt字段

中提取字段
INSERT INTO test_table (me,group_b,agent,element,...)
SELECT
    SUBSTR(txt,1,4),
    SUBSTR(txt,5,10),
    SUBSTR(txt,15,9),
    SUBSTR(txt,24,10),
    ...
FROM bulkdata;

给它一个尝试!!!

答案 1 :(得分:1)

您可以使用LOAD DATA INFILE语句中的变量首先保留行,然后为此变量分配每列计算。这样,您不需要辅助表来首先将数据加载到其中并在之后处理它。

LOAD DATA INFILE 'D:....example.txt' INTO TABLE bulkdata
CHARACTER SET utf8
LINES TERMINATED BY '\r\n' (@my_fancy_variable)
SET column1 = SUBSTR(@my_fancy_variable, 1, 4),
column2 = SUBSTR(@my_fancy_variable, 5, 10),
...
;

manual

中详细了解相关信息
  

列列表可以包含列名称或用户变量。   使用用户变量,SET子句使您可以执行   在将结果分配给它们之前转换它们的值   列。

     

SET子句中的用户变量可以通过多种方式使用。该   以下示例直接使用第一个输入列作为值   t1.column1,并将第二个输入列分配给用户变量   在用于之前进行分割操作   t1.column2的值:

LOAD DATA INFILE 'file.txt'
  INTO TABLE t1
  (column1, @var1)
  SET column2 = @var1/100;
     

SET子句可用于提供非来自输入的值   文件。以下语句将column3设置为当前日期和   时间:

     

LOAD DATA INFILE'file.txt'         INTO表t1         (column1,column2)         SET column3 = CURRENT_TIMESTAMP;

     

您还可以通过将输入值分配给用户变量来丢弃输入值   而不是将变量分配给表列:

LOAD DATA INFILE 'file.txt'
  INTO TABLE t1
  (column1, @dummy, column2, @dummy, column3);
     

使用列/变量列表和SET子句受制于   以下限制:

     
      
  • SET子句中的赋值应该只有赋值运算符左侧的列名。

  •   
  • 您可以在SET分配的右侧使用子查询。返回要分配给列的值的子查询可以是a   标量子查询只。此外,您不能使用子查询进行选择   正在加载的表。

  •   
  • 不会为列/变量列表或SET子句处理IGNORE子句忽略的行。

  •   
  • 使用固定行格式加载数据时无法使用用户变量,因为用户变量没有显示宽度。

  •