LOAD DATA INFILE 始终跳过第一行,而不是设置为 IGNORE
LOAD DATA INFILE consistently skips first line, while not set to IGNORE
我正在尝试将包含股票价格的 csv 文件加载到价格 table 中。
csv 文件有 3 行我想忽略,包括空白行。
当我设置 IGNORE 1 LINES
时,它在处理列 headers 时遇到错误。
当我设置 IGNORE 2 LINES
时,它始终跳过第一行数据。
从第二个数据行(在本例中为“11-03-2020”)开始,所有其他数据都加载得很好。
如何在不更改 csv 中的数据的情况下解决此问题?
csv 看起来像这样:
"Some instructions"
"date";"price"
"12-03-2020";133.08
"11-03-2020";143.68
"10-03-2020";149.14
...
CREATE TABLE代码:
CREATE TABLE `prices` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`isin` CHAR(12) NOT NULL,
`price_date` DATE NOT NULL,
`price` DECIMAL(10,2) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `isin_date` (`isin`, `price_date`),
CONSTRAINT `prices_stocks` FOREIGN KEY (`isin`) REFERENCES `stocks` (`isin`) ON UPDATE CASCADE ON DELETE NO ACTION
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DYNAMIC
AUTO_INCREMENT=157532
;
LOAD DATA SQL语句:
LOAD DATA LOCAL INFILE 'price_history_LU0792910050.csv'
REPLACE INTO TABLE stock_db.prices
CHARACTER SET utf8
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 2 LINES
(@vdate, @vprice)
SET
isin = 'LU0792910050',
price_date = STR_TO_DATE(@vdate, '%d-%m-%Y'),
price = @vprice;
示例 csv 的 hexdump:
00000000: EF BB BF 22 44 65 20 69 6E 73 74 65 6C 6C 69 6E ..."De instellin
00000010: 67 65 6E 20 76 61 6E 20 75 77 20 45 78 63 65 6C gen van uw Excel
00000020: 2D 73 6F 66 74 77 61 72 65 20 6B 75 6E 6E 65 6E -software kunnen
00000030: 20 64 65 20 77 65 65 72 67 61 76 65 20 76 61 6E de weergave van
00000040: 20 6F 6E 64 65 72 73 74 61 61 6E 64 65 20 67 65 onderstaande ge
00000050: 67 65 76 65 6E 73 20 62 65 C3 AF 6E 76 6C 6F 65 gevens be..nvloe
00000060: 64 65 6E 20 64 6F 6F 72 20 64 65 20 63 65 6C 6F den door de celo
00000070: 70 6D 61 61 6B 20 76 61 6E 20 64 65 20 67 65 67 pmaak van de geg
00000080: 65 76 65 6E 73 63 61 74 65 67 6F 72 69 65 20 28 evenscategorie (
00000090: 62 69 6A 76 2E 20 61 61 6E 74 61 6C 20 69 6E 20 bijv. aantal in
000000A0: 70 6C 61 61 74 73 20 76 61 6E 20 64 61 74 75 6D plaats van datum
000000B0: 29 2E 22 0D 0A 0D 0A 22 64 61 74 65 22 3B 22 70 )."...."date";"p
000000C0: 72 69 63 65 22 0D 0A 22 31 35 2D 30 37 2D 32 30 rice".."15-07-20
000000D0: 32 30 22 3B 35 31 2E 37 36 0D 0A 22 31 34 2D 30 20";51.76.."14-0
000000E0: 37 2D 32 30 32 30 22 3B 35 31 2E 31 37 0D 0A 22 7-2020";51.17.."
000000F0: 31 33 2D 30 37 2D 32 30 32 30 22 3B 35 31 2E 30 13-07-2020";51.0
00000100: 33 0D 0A 22 31 30 2D 30 37 2D 32 30 32 30 22 3B 3.."10-07-2020";
(Hexdump 未安装在 Synology 上,因此使用 Python hexdump。希望它有效)
"12-03-2020"
不能直接放入DATE
列。相反,将它放入一个@变量,然后使用str_to_date(...)
。 (如果您需要帮助,请告诉我们;周围有很多例子。)
我看到 C3 AF
,它是 ï
的 utf8,如 ... beïnvloegen ...
- 听起来“正确”吗? CHARACTER SET utf8
应该 正确阅读。
初始EF BB BF
是“BOM”。不知道LOAD FILE
是不是聪明到可以默默跳过。这可能会导致您的问题。一种方法是编辑文件以删除前 3 个字节。
后面是 0D 0A 0D 0A
,这与您描述的 3 header 行相符,第二行是空白。 LINES TERMINATED BY '\r\n'
应该是正确的。
我正在尝试将包含股票价格的 csv 文件加载到价格 table 中。
csv 文件有 3 行我想忽略,包括空白行。
当我设置 IGNORE 1 LINES
时,它在处理列 headers 时遇到错误。
当我设置 IGNORE 2 LINES
时,它始终跳过第一行数据。
从第二个数据行(在本例中为“11-03-2020”)开始,所有其他数据都加载得很好。
如何在不更改 csv 中的数据的情况下解决此问题?
csv 看起来像这样:
"Some instructions"
"date";"price"
"12-03-2020";133.08
"11-03-2020";143.68
"10-03-2020";149.14
...
CREATE TABLE代码:
CREATE TABLE `prices` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`isin` CHAR(12) NOT NULL,
`price_date` DATE NOT NULL,
`price` DECIMAL(10,2) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `isin_date` (`isin`, `price_date`),
CONSTRAINT `prices_stocks` FOREIGN KEY (`isin`) REFERENCES `stocks` (`isin`) ON UPDATE CASCADE ON DELETE NO ACTION
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DYNAMIC
AUTO_INCREMENT=157532
;
LOAD DATA SQL语句:
LOAD DATA LOCAL INFILE 'price_history_LU0792910050.csv'
REPLACE INTO TABLE stock_db.prices
CHARACTER SET utf8
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 2 LINES
(@vdate, @vprice)
SET
isin = 'LU0792910050',
price_date = STR_TO_DATE(@vdate, '%d-%m-%Y'),
price = @vprice;
示例 csv 的 hexdump:
00000000: EF BB BF 22 44 65 20 69 6E 73 74 65 6C 6C 69 6E ..."De instellin
00000010: 67 65 6E 20 76 61 6E 20 75 77 20 45 78 63 65 6C gen van uw Excel
00000020: 2D 73 6F 66 74 77 61 72 65 20 6B 75 6E 6E 65 6E -software kunnen
00000030: 20 64 65 20 77 65 65 72 67 61 76 65 20 76 61 6E de weergave van
00000040: 20 6F 6E 64 65 72 73 74 61 61 6E 64 65 20 67 65 onderstaande ge
00000050: 67 65 76 65 6E 73 20 62 65 C3 AF 6E 76 6C 6F 65 gevens be..nvloe
00000060: 64 65 6E 20 64 6F 6F 72 20 64 65 20 63 65 6C 6F den door de celo
00000070: 70 6D 61 61 6B 20 76 61 6E 20 64 65 20 67 65 67 pmaak van de geg
00000080: 65 76 65 6E 73 63 61 74 65 67 6F 72 69 65 20 28 evenscategorie (
00000090: 62 69 6A 76 2E 20 61 61 6E 74 61 6C 20 69 6E 20 bijv. aantal in
000000A0: 70 6C 61 61 74 73 20 76 61 6E 20 64 61 74 75 6D plaats van datum
000000B0: 29 2E 22 0D 0A 0D 0A 22 64 61 74 65 22 3B 22 70 )."...."date";"p
000000C0: 72 69 63 65 22 0D 0A 22 31 35 2D 30 37 2D 32 30 rice".."15-07-20
000000D0: 32 30 22 3B 35 31 2E 37 36 0D 0A 22 31 34 2D 30 20";51.76.."14-0
000000E0: 37 2D 32 30 32 30 22 3B 35 31 2E 31 37 0D 0A 22 7-2020";51.17.."
000000F0: 31 33 2D 30 37 2D 32 30 32 30 22 3B 35 31 2E 30 13-07-2020";51.0
00000100: 33 0D 0A 22 31 30 2D 30 37 2D 32 30 32 30 22 3B 3.."10-07-2020";
(Hexdump 未安装在 Synology 上,因此使用 Python hexdump。希望它有效)
"12-03-2020"
不能直接放入DATE
列。相反,将它放入一个@变量,然后使用str_to_date(...)
。 (如果您需要帮助,请告诉我们;周围有很多例子。)
我看到 C3 AF
,它是 ï
的 utf8,如 ... beïnvloegen ...
- 听起来“正确”吗? CHARACTER SET utf8
应该 正确阅读。
初始EF BB BF
是“BOM”。不知道LOAD FILE
是不是聪明到可以默默跳过。这可能会导致您的问题。一种方法是编辑文件以删除前 3 个字节。
后面是 0D 0A 0D 0A
,这与您描述的 3 header 行相符,第二行是空白。 LINES TERMINATED BY '\r\n'
应该是正确的。