Permalänk
Medlem

Bash - Mysql Delimiter problem

Hepp,

Försöker importera en .csv fil till min mysql server, som jag även har PhpMyAdmin på.

Nedan bash kod fixar detta. Men delimitern sätts inte på korrekt sätt, så allting lägger sig i samma kollumn. Får inga felmeddelanden på koden dock.

for f in *.csv do mysql -e "LOAD DATA LOCAL INFILE '"$f"' into table data; DELIMITER |;" -u root --password=qqq emldata done

Såhär ser tabellen ut efter ovan bash skript:

Om jag däremot direkt via PhpMyAdmin importerar .csv filen och väljer delimiter ; så blir det korrekt:

Antar att jag gör något fel i bash koden?

Visa signatur

💻 ROG Maximus XI Hero | i9 9900K | Corsair H115i | Samsung 960 PRO 512GB M.2 | Samsung 970 PRO 1TB M.2 | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W
📺 Dell Alienware AW2723DF 1440p 280 Hz | Acer XB271HU 1440p 165Hz
🎧 Schiit stack: Magni 3+ AMP | Modi 3 DAC | Sennheiser HD600 | HD800

Permalänk
Medlem

(Med reservation för felaktigheter då det var mågna år sedan jag ens rörde MySQL.]

Nu är det dubbelfnuttar i strängen som delar uppsträngen med $f mellan dem.

Testa med

mysql -e "LOAD DATA LOCAL INFILE '\"$f\"' into table data; DELIMITER |;" -u root --password=qqq emldata

Eller

mysql -e "LOAD DATA LOCAL INFILE '$f' into table data; DELIMITER |;" -u root --password=qqq emldata

Borde inte också | vara endast ett ;? Eller \;;.

Visa signatur

Efter att ni har läst det här har ni insett att det inte gav något.

Permalänk
Hedersmedlem

(Du kan ändra

'"$f"'

till endast

'$f'

Det enda de extra citationstecknen gör här är att se till att saker inte kommer fungera ifall du har mellanslag i ett filnamn.)

Vad gäller `DELIMITER` och dess användning här:

  • standardvärdet för `DELIMITER` är just semikolon

  • du sätter `DELIMITER` till `|`-tecknet och inte semikolon

  • det sätts enklare med `--delimiter`-alternativet för kommandoradsklienten

  • framför allt så gör `DELIMITER` något helt annat än du tror, vanligen använt när man definierar lagrade procedurer: 19.1 Defining Stored Programs [MySQL Reference="Reference" Manual="Manual"].

Så glöm `DELIMITER` i detta fall.

Du söker snarare `FIELDS TERMINATED BY` — 13.2.6 LOAD DATA INFILE Syntax [MySQL Reference="Reference" Manual="Manual"] (standardvärdet är att fält avgränsas med Tab).

Import CSV File Into MySQL Table [MySQLTutorial] — ett exempel på hur man kan läsa indata från en CSV-fil till MySQL.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Aha, FIELDS TERMINATED BY var lösningen och inte DELIMITER som jag trodde. Tog även bort dubbelfnuttarna. Funkar perfekt nu.

Tack ska ni ha!

Visa signatur

💻 ROG Maximus XI Hero | i9 9900K | Corsair H115i | Samsung 960 PRO 512GB M.2 | Samsung 970 PRO 1TB M.2 | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W
📺 Dell Alienware AW2723DF 1440p 280 Hz | Acer XB271HU 1440p 165Hz
🎧 Schiit stack: Magni 3+ AMP | Modi 3 DAC | Sennheiser HD600 | HD800