Goedemiddag,

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
Waarom zou je iets fout doen? Je geeft bij het parsen aan dat de kolommen omsloten zijn met niets, dus dat houdt in dat de quotes onderdeel worden van de uitgelezen waarde. De getallen zijn geen strings, dus staan er geen quotes omheen.

Als je de quotes niet wilt hebben, zul je ze moeten verwijderen. Dat zou als volgt kunnen:
<?php
$str = '"woord"';
$str = preg_replace('/^"|"$/', '', $str);
?>
Als je fgetcsv gebruikt, krijg je alle waardes terug in een array. In dat geval zou zoiets moeten werken:
<?php
$fd = fopen("file.csv","r");
$values = fgetcsv($fd);
$values = preg_replace('/^"|"$/', '', $values);
?>
Of zelfs
<?php
$values = preg_replace('/^"|"$/', '', fgetcsv($fd));
>
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?
Lijst van ourAirports toevallig?

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:

LOAD DATA INFILE "blabla.csv"
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.
Is LOAD DATA INFILE geen optie?

Toevoeging op 10/01/2014 17:05:24:

Lol

PS. Het moet wel OPTIONALLY ENCLOSED BY zijn
Wellicht moet je de ENCLOSED BY nog veranderen in OPTIONALLY ENCLOSED BY
Nee, hoeft niet, gaat direct goed. Velden waar geen " omheen staan worden automatisch ingelezen alszijnde getal.
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....
@ 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.
@ Ger: Heb ik, gecontroleerd en klopt.

@Ivo: Dat vind ik dus vreemd, aangezien ik met dit account de database aan heb gemaakt.

Reageren