[PHP/Alg] Header herkennen bij import van CSV

Pagina: 1
Acties:
  • 272 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Bij het importeren van een CSV bestand laat ik de gebruiker drie stappen doorlopen:

1. Bestand selecteren en uploaden
2. Data-types van kolommen bevestigen en aangeven of eerste rij een header-rij is.
3. Data daadwerkelijk importeren

Nu wil ik bij stap 2 alvast een schatting/default maken voor de kolom-types en het al dan niet aanwezig zijn van een header rij.

Nu vroeg ik me af hoe je kunt achterhalen of een rij een header-rij is. Als "mens" zie je zoiets heel snel ... omdat de string in de header vrij veel afwijkt van het patroon in de de rijen eronder. Ik ben dus nu aan het denken in de richting van het vergelijken van het "gemiddelde" van alle strings in een kolom met de string in de eerste rij. Maar wat is het "gemiddelde" van een set strings? Ik neig naar levenshtein en similar_text achtige functies ... maar weet niet helemaal hoe ik die dan zou moeten toepassen.

Heeft iemand wellicht een gedachte hierover? Dit is waarschijnlijk meer algemeen programmeer-technisch dan PHP specifiek.

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Je hoeft natuurlijk maar van 1 kolom te bepalen of deze een header heeft, om te weten dat er een volledige header rij is.
Als eerste stap zou ik dus zoeken naar een rij welke enkel numerieke waardes bevat. Is de eerste rij als enige niet numeriek, dan is er een header.
Datzelfde kun je ook doen voor veel gebruikte formaten. E-mailadressen, postcodes, etcetera.

Verwijderd

Dit wordt heel erg lastig denk ik... Stel dat de kolomtitel mens is en in de rijen mens1 t/m mens 20 staat. Waarom zo moeilijk doen? Als je het de gebruiker vraagt, weet je het direct. Volgens mij is hier niet echt een oplossing voor die altijd een correct antwoord geeft of het een header rij is of niet.

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Volgens mij is hier niet echt een oplossing voor die altijd een correct antwoord geeft of het een header rij is of niet.
Hoeft ook niet altijd correct te zijn, maar ik wil een "educated guess" kunnen doen. Zoals al aangegeven vraag ik in Stap 2 van het import-proces vervolgens aan de gebruiker of dit klopt.

Excel doet overigens iets vergelijkbaars bij het sorteren van data ... alleen heeft Excel het wat makkelijker omdat die voor de meeste kolommen WEET wat het data-type is ... ik moet gaan kijken of ik dat kan achterhalen.
Je hoeft natuurlijk maar van 1 kolom te bepalen of deze een header heeft, om te weten dat er een volledige header rij is.
Slim! Inderdaad ... in de meeste gevallen zal er een kolom voor datums en een kolom met tijden zijn (in deze specifieke implementatie) ... ik moet dus proberen te achterhalen welke kolommen de kolommen met data en tijden zijn.

Voor data wellicht gewoon in eerste instantie checken op aanwezigheid van delimiters "-", "/", etc. Of is er een handiger manier om te achterhalen of een string een datum bevat?

[ Voor 6% gewijzigd door gvanh op 27-09-2006 12:04 ]


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Hangt heel erg van je data af.
Maar als ik er even vanuit ga dat er maar 1 header rij kan zijn dan zou ik gewoon in elke kolom gaan kijken wat de header kan zijn. Is kolom 1 alleen maar tekst dan krijg ik er geen header uit. Maar is kolom 2 en 3 en 4 en 5 alleen maar getallen behalve in de 1e rij dan bestempel ik gewoon de 1e rij als header.
Dit gecombineerd met het feit dat een header rij altijd bovenaan hoort te staan. een header hoort dezelfde kolommen gevuld te hebben als de data.

En je toont de gebruiiker jouw geschatte header en vraagt of dit goed is ( als je hier nu ook een statistiekje van bijhoud hoeveel % goed geschat bij welke gebruiker dan kan je na een tijdje zien of je goed hebt gezeten of niet )

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Met een regular expression is dat regelijk eenvoudig
PHP:
1
2
3
4
$waarde = "18-01-1983";
if(ereg("^([0123][0-9])([/\.-])([01][0-9])([/\.-])(2[0-9]{3})$", $waarde)) {
   echo "Waarde '$waarde' is een datum";
}

Even uit het hoofd, kan heel goed een foutje inzitten :) Maar zou moeten werken met zowel slashes, punten en streepjes als scheidingsteken.

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Ja ... aan regexp zat ik ook te denken ... al ben ik bang dat de rexexp zelfs nog wat ruimer moet. Uit Excel komen datums vaak als 26-sep-06.

Maar ik kan me ook nog voorstellen:

09-26-2006
09-26-06
26-9-2006
26-09-06
8-sep-2006
08-sep-06
etc.

Maar gut ... ik zal 'ns kijken wat ik met regexp voor elkaar kan krijgen.
Pagina: 1