将 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_power
和 reactive_power
是架构中的整数。导入时,值会在“,”(德语十进制分隔符)处被截断。但是我在 SHOW WARNINGS
:
中收到警告
Warning | 1265 | Data truncated for column 'reactive_power' at row 32
我希望导入工作没有任何警告。如何将 123,000000
转换为 123
或 123.000000
?
提前致谢。
将 reactive_power
和 active_power
的架构更改为 VARCHAR(255)
并导入您的文件。然后将“,”替换为“。”:
UPDATE
grafana.elec_eam_delivered
SET
reactive_power = REPLACE(reactive_power, ',', '.'),
active_power = REPLACE(active_power, ',', '.')
然后将 active_power
和 reactive_power
的架构更改为 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_power = SUBSTRING_INDEX(@active_power,',',1),
reactive_power = SUBSTRING_INDEX(@reactive_power,',',1);
我需要将 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_power
和 reactive_power
是架构中的整数。导入时,值会在“,”(德语十进制分隔符)处被截断。但是我在 SHOW WARNINGS
:
Warning | 1265 | Data truncated for column 'reactive_power' at row 32
我希望导入工作没有任何警告。如何将 123,000000
转换为 123
或 123.000000
?
提前致谢。
将 reactive_power
和 active_power
的架构更改为 VARCHAR(255)
并导入您的文件。然后将“,”替换为“。”:
UPDATE
grafana.elec_eam_delivered
SET
reactive_power = REPLACE(reactive_power, ',', '.'),
active_power = REPLACE(active_power, ',', '.')
然后将 active_power
和 reactive_power
的架构更改为 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_power = SUBSTRING_INDEX(@active_power,',',1),
reactive_power = SUBSTRING_INDEX(@reactive_power,',',1);