LOAD DATA INFILE和LINESTRING

时间:2015-03-11 14:39:43

标签: mysql

我想导入包含以下列的大型CSV文件

SegmentId;Lengthmm;RoadClass;OptimalSpeedKph;SpeedLimitKph;WKT
1;7329;1;120;70;LINESTRING (28.97845 41.067332,28.978537 41.067332)
...

我正在使用LOAD DATA INFILE。问题是WKT是LINESTRING。 实际上,如果我添加一个带有以下查询的条目:

INSERT INTO FCD 
VALUES (3,1,1,1,1,LineStringFromText( 'LINESTRING (28.947971 41.050192,28.94754 41.049887)'));

将其插入表格。

但是我不知道在LOAD DATA INFILE命令中访问WKT参数并对其进行转换。

LOAD DATA LOCAL INFILE '/home/username/userfile.csv' 
INTO TABLE `FCD` 
FIELDS TERMINATED BY ';' 
       ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES

它给了我以下错误:

ERROR 1416 (22003): Cannot get geometry object from data you send to the GEOMETRY field

关于

2 个答案:

答案 0 :(得分:3)

您可以使用变量从WKT列加载值,并使用LOAD DATA INFILE语句的SET子句在表达式中使用变量的值并将其分配给列:

LOAD DATA LOCAL INFILE '/home/username/userfile.csv'
INTO TABLE `FCD`
FIELDS TERMINATED BY ';'
       ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(SegmentId, Lengthmm, RoadClass, OptimalSpeedKph, SpeedLimitKph, @WKT)
SET WKT = LineStringFromText(@WKT)

我假设CSV文件的第一行包含表列的名称。注释列表中的最后一个字段是@WKT,它是一个变量,然后SET子句将变量@WKT的值用于表达式,然后将其分配给列WKT

答案 1 :(得分:0)

创建一个临时表,其中WKT是一个字符串。然后运行

INSERT INTO FCD 
     SELECT SegmentId, Lengthmm, RoadClass, OptimalSpeedKph, SpeedLimitKph, LineStringFromText (WKT) 
      FROM FCD_staging;