将 CSV 导入 MySQL 时将字符串或浮点数转换为 Int

Convert String or Float to Int when Importing a CSV into MySQL

我需要将 CSV 文件中的数据导入 MySQL/MariaDB。以下是数据示例:

01.01.2021 00:15;0,000000;W;123,000000;W;9,000000;W;0,000000;W;9,000000;W
01.01.2021 00:30;0,000000;W;126,000000;W;9,000000;W;0,000000;W;9,000000;W
01.01.2021 00:45;0,000000;W;119,000000;W;6,000000;W;0,000000;W;6,000000;W

我想使用字段编号。 1, 4, 6. 第一列的Date需要转换成SQL datetime。我管理了所有这些。但是当我将第 4 个和第 6 个值转换为 Int(或 Float,如果有人将小数添加到测量值)时,我被卡住了。

我当前运行良好的代码是:

LOAD DATA LOCAL INFILE '/tmp/eam_energy.csv' 
INTO TABLE  grafana.elec_eam_delivered 
FIELDS OPTIONALLY ENCLOSED BY '"' 
TERMINATED BY ';' 
LINES TERMINATED BY '\n' 
IGNORE 18 ROWS 
(@datetime, @dummy, @dummy, active_power, @dummy, reactive_power, @dummy, @dummy, @dummy, @dummy, @dummy) 
SET datetime = STR_TO_DATE(@datetime, '%d.%m.%Y %H:%i');

active_powerreactive_power 是架构中的整数。导入时,值会在“,”(德语十进制分隔符)处被截断。但是我在 SHOW WARNINGS:

中收到警告

Warning | 1265 | Data truncated for column 'reactive_power' at row 32

我希望导入工作没有任何警告。如何将 123,000000 转换为 123123.000000

提前致谢。

reactive_poweractive_power 的架构更改为 VARCHAR(255) 并导入您的文件。然后将“,”替换为“。”:

UPDATE
  grafana.elec_eam_delivered
SET
   reactive_power = REPLACE(reactive_power, ',', '.'),
   active_power = REPLACE(active_power, ',', '.')

然后将 active_powerreactive_power 的架构更改为 INTFLOAT(您的选择)。

您也可以像这样通过导入直接进行转换:

LOAD DATA LOCAL INFILE '/tmp/eam_energy.csv' 
INTO TABLE  grafana.elec_eam_delivered 
FIELDS OPTIONALLY ENCLOSED BY '"' 
TERMINATED BY ';' 
LINES TERMINATED BY '\n' 
IGNORE 18 ROWS 
(@datetime, @dummy, @dummy, @active_power, @dummy, @reactive_power, @dummy, @dummy, @dummy, @dummy, @dummy) 
SET DATETIME = STR_TO_DATE(@datetime, '%d.%m.%Y %H:%i'),
active_power = SUBSTRING_INDEX(@active_power,',',1),
reactive_power = SUBSTRING_INDEX(@reactive_power,',',1);