CSV Import quotation marks
Ik heb een CSV bestand dat ik wil importeren in een MySQL database. De rijen zien er als volgt uit:
9147,"27GA","small_airport","Wilson International Airport",33.6584014892578,-85.0099029541016,1050,"NA","US","US-GA","Carrollton","no","27GA",,"27GA",,,
Ik krijg hem echter niet goed geïmporteerd. Ik heb meerdere manieren geprobeerd. Ik kom het dichste bij wanneer ik voor het volgende kies:
Kolommen gescheiden door: ,
Kolommen omsloten met : (niks)
Kolommen omgezet met wisselteken: \
Regels beëindigd door: auto
Het probleem is nu echter dat ik om alle waardes quotation marks (") krijg, behalve om de cijfers.
Wat doe ik fout?
Alvast bedankt,
Luc
Als je de quotes niet wilt hebben, zul je ze moeten verwijderen. Dat zou als volgt kunnen:
Als je fgetcsv gebruikt, krijg je alle waardes terug in een array. In dat geval zou zoiets moeten werken:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$fd = fopen("file.csv","r");
$values = fgetcsv($fd);
$values = preg_replace('/^"|"$/', '', $values);
?>
$fd = fopen("file.csv","r");
$values = fgetcsv($fd);
$values = preg_replace('/^"|"$/', '', $values);
?>
Of zelfs
Gewijzigd op 10/01/2014 16:45:25 door Willem vp
Was het vergeten te vermelden, maar het importeren doe ik binnen phpmyadmin. Is het makkelijker/beter om dit met behulp van een php script te doen?
Die lijst is opgemaakt volgens standaard csv regels en moet je via de methode van willem direct kunnen inlezen, zonder zelf te gaan lopen exploden etc. Zelfs de preg_replace is niet nodig, er blijft niets vreemds over. Let alleen wel op met de rare tekens. In die lijst staan behoorlijk wat vliegvelden met namen waarin niet Latijnse accenten zitten en als je dat niet goed inleest krijg je een enorme berg aan vraagtekens in je database.
import direct in mysql:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
LOAD DATA INFILE "blabla.csv"
INTO TABLE blabla
CHARACTER SET utf8
COLUMNS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
INTO TABLE blabla
CHARACTER SET utf8
COLUMNS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
edit:
check tevens voor je begint de coordinaten. Er zitten bergen foute coordinaten tussen, met waardes ver boven de 180 c.q. 90 graden.
Gewijzigd op 10/01/2014 17:13:31 door Erwin H
Toevoeging op 10/01/2014 17:05:24:
Lol
PS. Het moet wel OPTIONALLY ENCLOSED BY zijn
Gewijzigd op 10/01/2014 17:13:17 door Ger van Steenderen
Wellicht moet je de ENCLOSED BY nog veranderen in OPTIONALLY ENCLOSED BY
Misschien toch niet. Ik merk dat ik mijn query gebruikte voor het inlezen van een bestand dat ik eerst zelf heb gemaakt met alle velden omsloten met ". Dan gaat het uiteraard altijd goed....
Gewijzigd op 10/01/2014 17:17:23 door Erwin H
@ Erwin: Klopt helemaal. Ik heb je code overgenomen en aangepast naar de juiste tabel en het bestand. Ik krijg echter een "#1045 Acces denied using password YES" binnen phpmyadmin. Lijkt mij vreemd aangezien ik de sql code uitvoer met de account in phpmyadmin waarmee de database aan is gemaakt. Hoe dan ook, ik zal eens googelen naar die foutmelding.
Let wel dat je het volledige pad opgeeft.
LOAD DATA INFILE vereist een apart recht, dat kennelijk jij niet hebt onder die gebruikersnaam.
@Ivo: Dat vind ik dus vreemd, aangezien ik met dit account de database aan heb gemaakt.
create is weer een ander recht.
Dat je dat recht hebt, wil niet zeggen dat je alle andere rechten ook moet hebben.
Daarbij schijnt op shared hosts die hele optie wel eens geblokkeerd te zijn. Mogelijk omdat je daarmee ook vanuit andere accounts zou kunnen lezen, maar dat weet ik niet zeker.
LOAD DATA LOCAL INFILE
Dan omzeil je iig de privileges
#1148 - The used command is not allowed with this MySQL version
Dan zal het inderdaad geblokkeerd zijn door je hosting provider, helaas.
dan maar terug naar phpmyadmin...
Nog erger ........
CSV omzetten naar excel bestand, en met deze (http://tools.perceptus.ca/text-wiz.php?ops=7) handige tool omgezet in SQL. Het is wat omslachtig, maar het werkt. In ieder geval bedankt voor jullie hulp!
Na wat omzwervingen loop je dan ineens aan tegen een rechten probleem met LOAD DATA INFILE.
Maar in je openingsvraag luktje het inlezen al, maar je had alleen de optie 'Kolommen omsloten met : (niks)' moeten aanpassen naar 'Kolommen omsloten met : " '
Wat min of meer ook in de query's genoemd wordt. (enclosed by '"' )
Daarnaast heb je dat antwoord ook vanmiddag al op Pfz.nl gehad
?
Dat heb ik allemaal al geprobeerd, maar keer op keer ging het fout. Heb het echt talloze keren geprobeerd. Tabel al aanmaken en waarden inlezen, eerste rij van tabel als kolomnamen etc. Met enclosed by " kreeg ik het probleem dat wanneer rijen lege kolommen hadden in het bestand, dus ",,,," werden deze 4 komma's als waarde in een kolom gezet, met als gevolg dat de laatste kolommen allemaal NULL waren. Omdat dit me op geen enkele manier lukte ben ik naar andere mogelijkheden op zoek gegaan, en het advies om LOAD DATA INFILE te proberen uitgevoerd maar dat lukte dus ook niet. Hoe dan ook, wat wil je hiermee zeggen?