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' 应该是正确的。