Schreiben Sie den Titel um: Hochladen auf MySQL mithilfe einer CSV-Datei mit einer einzelnen Spalte, die mehrere Textzeilen, doppelte Anführungszeichen und Kommas enthält
P粉469090753
P粉469090753 2023-09-16 10:05:22
0
1
473

Ich habe ein Problem beim Hochladen von Daten in die MySQL-Datenbank.

Die Daten sehen so aus:

Bewertungs-ID, Benutzer, Text

Eine typische Zeile sieht so aus:

12345,SomeCoolName,"this is my "awsome" comment.
some more text, and dome more.
and some "more""

Das sollte eine Zeile in meiner Tabelle sein.

Ich habe Probleme beim Hochladen dieses Inhalts, da das Textfeld mehrere Zeilen enthält und Kommas und Klammern verwendet werden. Irgendwelche Vorschläge, wie mit diesem Problem umgegangen werden kann?

Danke!

Ich habe versucht, einige Handbücher zum Hochladen von CSV-Dateien in eine Datenbank zu verwenden, aber ohne Erfolg.

P粉469090753
P粉469090753

Antworte allen(1)
P粉165522886

演示示例。

必须导入的源 CSV 内容:

review_id,user,text
123,John,This is
multiline 1, which
contains a comma.
456,Jim,This is
miltiline 2, which contains
commas, 'quote' chars and "double quote" chars.

此数据必须导入到的表:

CREATE TABLE test (review_id INT, user VARCHAR(255), review_text TEXT);

将数据加载到表中的查询:

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/test.csv'
INTO TABLE test
FIELDS TERMINATED BY '\0' ENCLOSED BY '' ESCAPED BY ''
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(@line)
SET review_id = (@review_id := CASE WHEN @line REGEXP '^\\d'
                                    THEN SUBSTRING_INDEX(@line, ',', 1)
                                    ELSE @review_id
                                    END
                                    ),
    user =  (@user := CASE WHEN @line REGEXP '^\\d'
                           THEN SUBSTRING_INDEX(SUBSTRING_INDEX(@line, ',', 2), ',', -1)
                           ELSE @user
                           END
                           ),
    review_text = (@review_text := CASE WHEN @line REGEXP '^\\d'
                                        THEN SUBSTRING(@line FROM 2 + LENGTH(SUBSTRING_INDEX(@line, ',', 2)))
                                        ELSE CONCAT_WS(' ', @review_text, @line)
                                        END
                                        );

加载后表格数据状态:

review_id 用户 review_text
123 约翰 这是
123 约翰 这是多行 1,
123 约翰 这是多行 1,其中包含逗号。
456 吉姆 这是
456 吉姆 这是 miltiline 2,其中包含
456 吉姆 这是 miltiline 2,其中包含逗号、“引号”字符和“双引号”字符。

清算:

DELETE t1
FROM test t1
JOIN test t2 USING (user)
WHERE t1.review_text < t2.review_text;

最终表数据状态:

review_id 用户 review_text
123 约翰 这是多行 1,其中包含逗号。
456 吉姆 这是 miltiline 2,其中包含逗号、“引号”字符和“双引号”字符。
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage