Controle csv bestand voor importeren ?
Nou wil ik echter wat controle inbouwen, zodat ik zeker weet dat de gegevens
in een regel in het csv bestand compleet zijn, en dat de velden gevuld worden
met de juiste gegevens uit het bestand.
Het betreft hier een ', seperated' csv bestand, waar een aantal velden gevuld moeten zijn omdat de applicatie dit vereist. Ook zijn er wat optie velden welke
gevuld mogen zijn, en indien deze geen waarde hebben, als een lege string in het
csv bestand opgenomen moeten worden.
Voorbeeld :
Velden in applicatie :
naam, adres, postcode, plaats, land, contactpersoon, telefoonnummer
Alle velden zijn verplicht, BEHALVE de contactpersoon en telefoonnummer.
Juiste formaat in csv bestand :
Erwin van Brink,Brinkstraat 1,1234 AB,Brinkstad,Nederland,Erwin,0123-456789
Stel dat de gebruiker in zijn CSV bestand onderstaande regel heeft staan :
Erwin van brink,Brinkstraat 1,1234 AB,Brinkstad,Nederland,0123-456789
Dan komt bij het importeren het telefoonnummer in het veld contactpersoon te staan. Dit wil ik natuurlijk niet.
Als er onderstaande regel in staat, dan gaat het wel goed :
Erwin van brink,Brinkstraat 1,1234 AB,Brinkstad,Nederland,,0123-456789
Er is een leeg veld ( door de dubbele ,, ) en blijft het veld contactpersoon leeg in de Db.
Is het handig om
1. het aantal ',' te tellen in een regel ? ( er moeten er 6 staan )
2. daarna kijken of de verplichte velden gevuld zijn ?
Als beide kloppen, dan pas importeren.
Vraag is hoe je het aantal komma's kunt controleren in een string en
of er een andere / betere manier om dit te doen ?
Alvast bedankt voor de reactie(s).
En dan zou je per item kunnen kijken of het een waarde bevat en of de waarde juist is (bv postcode, telefoon etc)
Gewijzigd op 29/10/2010 17:50:50 door Joakim Broden
http://php.net/manual/en/function.fgetcsv.php
Geeft gewoon een array, je kan dus met count() tellen.
Geeft gewoon een array, je kan dus met count() tellen.
Zet je data per rij om naar een array. Via control-structures.for kun je dan per keer kijken of de array ook echt een waarde heeft van bijvoorbeeld een x aantal karakters via de functie function.strlen
Gewijzigd op 29/10/2010 19:24:06 door Marco M
Ik 'trek' een line uit het csv bestand uit elkaar met 'explode' wat prima werkt natuurlijk. Ik kan echter niet controleren of wat in het eerste item ingevuld is, ook in het eerste veld in de Db thuishoort...en dat geldt eigenlij voor alle items in de line uit het csv bestand.
Count() heb ik uitgeprobeert, en deze telt inderdaad ook de lege velden. Helaas is dat dus is ook niet de oplossing.
Makkelijkste zou zijn als ik het aantal comma's kan tellen in een line.
Hiermee kan ik in ieder geval controleren of alle velden ( al dan niet ) gevuld zijn.
Dus als iemand mij daarmee kan helpen....
Toevoeging op 30/10/2010 21:31:55:
Ik heb de oplossing gevonden naar aanleiding van de link (control-structure.for) van Marco M.
Hiermee tel ik het aantal comma's en vergelijk deze met het aantal comma's wat elke line in het csv bestand MOET hebben. Als deze niet gelijk is, dan mist er dus ergens iets.
Hieronder de code :
$searchchar=",";
$count="0"; //zero
for($i="0"; $i<strlen($csvdata); $i=$i+1){
if(substr($csvdata,$i,1)==$searchchar){
$count=$count+1;
}
}
// Het aantal commas MOET bijvoorbeeld 9 zijn
if ( $count == 9 ) {
// Controleren of de verplichte velden gevuld zijn. Dit doe ik door via EXPLODE de line
// uit elkaar te 'trekken' en de waardes in de array te checken of ze leeg zijn of niet.
// Indien niet leeg : inlezen in Db
// Indien wel leeg : NIET inlezen in db
} else {
// NIET INLEZEN !
}
Deze controle in natuurlijk niet waterdicht, omdat de gebruiker nog steeds verkeerde data in het verkeerde item kan zetten...