Heim  >  Fragen und Antworten  >  Hauptteil

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

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粉469090753P粉469090753399 Tage vor434

Antworte allen(1)Ich werde antworten

  • P粉165522886

    P粉1655228862023-09-17 00:57:56

    演示示例。

    必须导入的源 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,其中包含逗号、“引号”字符和“双引号”字符。

    Antwort
    0
  • StornierenAntwort