[PHP] CSV parsen

Pagina: 1
Acties:

Onderwerpen


  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01
Ik ben bezig met het maken van een CSV-parser. Om n.a.w-gegevens vanuit Office makkelijk in de database op het intranet van een bedrijf te kunnen zetten.

Nu heb ik een aantal kleine testscriptjes geschreven om te kijken hoe het parsen van de CSV-data zou gaan. Alleen gaat PHP erg vaak totaal over zijn nek. Het script begint met laden en IE doet een refresh en het begint weer opnieuw. Zo gaat dit een kleine minuut door waarna ik een mooie 404 error voorgeschoteld krijg.

Het voorbeeldbestand is 38533 tekens lang en er zijn 313 rijen met gegevens.

Een voorbeeldje:
code:
1
2
userid,gebruikersnaam,voornaam,voorletters,achternaam
1,ppuk,Pietje,P.,Puk


Manieren die ik heb geprobeerd:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
$fp = fopen ("Medewerkers.csv", "r");
$fs = fread ($fp, filesize ("Medewerkers.csv"));
fclose ($fp);
$array = explode ("\n", $fs);

echo "<pre>";
print_r ($array);
echo "</pre>";
?>

Resulteerde in de reload-loop

PHP:
1
2
3
4
5
6
7
8
<?php
$fp = fopen ("Medewerkers.csv", "r");
echo "<pre>";
while ($data = fgetcsv ($fp, 1000, ","))
{
    print_r ($data);
}
fclose ($fp);

Zelfde probleem

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$fp = fopen ("Medewerkers.csv", "r");
$fs = fread ($fp, filesize ("Medewerkers.csv"));

$array = explode ("\n", $fs);
echo "<table>";
for ($i = 0; $i < count ($array); $i++)
{
    $output[$i] = explode (",", $array[$i]);

    echo "<tr>";
    for ($j = 0; $j < count ($output[$i]); $j++)
    {
        echo "<td>" . $output[$i][$j] . "</td>";
    }
    echo "</tr>\n";
}
echo "</table>";

Zelfde probleem.


Ik vraag me dus af wat de oorzaak is van dit probleem en hoe ik het oplos.

[ Voor 16% gewijzigd door Tux op 21-08-2003 15:33 ]

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Verwijderd

Als je nu eens begint met de functie file()

  • xychix
  • Registratie: September 2000
  • Laatst online: 16-09 07:50

xychix

FreeBSD Rules !

Verwijderd schreef op 21 August 2003 @ 15:59:
Als je nu eens begint met de functie file()
zou je dat wel doen met zo'n groot bestand ? en met een script dat in de toekomst waaarschijnlijk nog veel grotere bestanden gaat eten?

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


Verwijderd

Vergeleken met de manier als hij nu doet, maakt het geen bal uit, en scheelt het 5 regels code. En 38533 bytes vind ik niet zo groot.

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Ik weet niet of je die data eigenlijk direct een database in wil schoppen, maar MySQL kent ook deze constructie:
PHP:
1
2
3
4
$file=$path."/csvimport.csv";
$qry="LOAD DATA LOCAL INFILE '".$file."' INTO TABLE csvimport 
         FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY'\r\n'";
$rs=mysql_query($qry) or die ("LOAD DATA:".mysql_error());

Waarmee je de csv (mits veldvolgorders goed zijn en het verder geen bewerking behoeft), zo een table in kan schoppen.

Ik heb het zelf gebruikt in een situatie waarbij wel nog e.e.a. aangepast moest worden, door alles eerst in een temptable te laden.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

Begin eens met de functie fgetcsv :P

Want er komt meer kijken dan een beetje splitten. Je moet letten op quotes\quotes-afhankelijke escaping, etc.

fgetcsv doet dat allemaal voor je

[ Voor 86% gewijzigd door Bosmonster op 21-08-2003 17:44 ]


  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01
De methode van beetle71 ga ik naar kijken. Het is de bedoeling dat het geuploade bestand vergeleken wordt met de database en dat wijzigingen worden doorgevoerd en nieuwe records worden aangemaakt.

Een mogelijkheid is dan een temp-table waar de data in gaat en dan is het niet meer extreem moeilijk te verwerken.

Bosmonster: In het tweede voorbeeld gebruikte ik fgetcsv maar daar ging PHP ook van over z'n nek.

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

als fgetcsv er van over z'n nek gaat klopt er iets niet aan het csv bestand lijkt me... maar goed..

Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01
Ik ben bezig geweest met de MySQL LOAD DATA INFILE functie. Alleen krijg ik de volgende melding: The used command is not allowed with this MySQL version. Ik ben eens gaan zoeken in de MySQL documentatie en zag dat de functie er al sinds versie 3.20.7 in zit.

Ik heb op mijn pc MySQL-4.0.13-nt geïnstalleerd en daar zou dus in principe de functie in moeten zitten. Alleen lees ik ook dat er voor INFILE een compile optie is namelijk: --enable-local-infile.

Ik weet niet precies hoe ik het werkend ga krijgen.

@Bosmonster:
Ik heb nog niet zoveel gedaan met CSV data. Dus ik weet niet of er evt iets mis is.
Misschien dat het komt omdat er als er lege velden zijn in het CSV bestand ,, komt te staan :?

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 08:18

pietje63

RTFM

Tux schreef op 23 August 2003 @ 11:16:

Ik heb nog niet zoveel gedaan met CSV data. Dus ik weet niet of er evt iets mis is.
Misschien dat het komt omdat er als er lege velden zijn in het CSV bestand ,, komt te staan :?
Dat hoeft geen probleem te zijn. Kun je het bestand met excel zonder problemen openen in Excel?
Ik heb zelf pas een functie geschreven voor het wegschrijven van data in csv en het er uit halen en had daarbij ook een probleem ontdekt met (Excel?) csv's ik gebruikte eerst addslashes zodat ik geen last had van appelstrofs en dergelijke hier ging het echter verkeerd want aan het eind van sommige regeles werden er heeel veel (duizenden) slashes toegevoegd.
Ik heb nog geen tijd gehad om dit te debuggen, maar dat wees ook gewoon op iets vaags in het csv bestand....

Probeer eens het zo simpel mogelijk (iets van 3 regels) csv bestand en kijk of hij het dan wel doet.

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
In welke versie van PHP is de over-mijn-nek-error geintroduceerd? Ik heb deze foutmelding namelijk nog nooit gezien...

Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01
Soultaker schreef op 23 August 2003 @ 18:36:
In welke versie van PHP is de over-mijn-nek-error geintroduceerd? Ik heb deze foutmelding namelijk nog nooit gezien...
Het is ook geen foutmelding. Het is waarschijnlijk Apache wat op hol slaat door dat PHP zit te pielen met die CSV file.

Met 5 entries werkt het scriptje perfect. Ik ga morgen dus maar eens kijken wat de oorzaak is dat grotere files niet goed werken.

[ Voor 17% gewijzigd door Tux op 24-08-2003 01:39 ]

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Tux schreef op 24 August 2003 @ 01:36:
Het is ook geen foutmelding. Het is waarschijnlijk Apache wat op hol slaat door dat PHP zit te pielen met die CSV file.
Ah, hij gaat dus niet over z'n nek, maar hij slaat op hol! Dat is echt een stuk duidelijker........ |:(

Kun je misschien uitleggen wat "over z'n nek gaan" respectievelijk "op hol slaan" betekent? En dan bedoel ik niet de real-life betekenis...

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Soultaker schreef op 24 August 2003 @ 02:29:
[...]

Ah, hij gaat dus niet over z'n nek, maar hij slaat op hol! Dat is echt een stuk duidelijker........ |:(

Kun je misschien uitleggen wat "over z'n nek gaan" respectievelijk "op hol slaan" betekent? En dan bedoel ik niet de real-life betekenis...
Tux schreef op 21 August 2003 @ 15:32:
Alleen gaat PHP erg vaak totaal over zijn nek. Het script begint met laden en IE doet een refresh en het begint weer opnieuw. Zo gaat dit een kleine minuut door waarna ik een mooie 404 error voorgeschoteld krijg.
Dit brengt wellicht wat verduidelijking; ik vraag mij af waarom IE een refresh doet? Heb je al met een alternatieve browser gekeken? Eventueel getelnet om te kijken of je wat ziet langskomen? Wat staat er in de PHP en Apache access en error logs?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • Mickman
  • Registratie: Juni 2001
  • Laatst online: 27-08 11:32
Bosmonster schreef op 21 August 2003 @ 17:42:
Begin eens met de functie fgetcsv :P

Want er komt meer kijken dan een beetje splitten. Je moet letten op quotes\quotes-afhankelijke escaping, etc.

fgetcsv doet dat allemaal voor je
Het wordt je met php ook steeds makkelijker gemaakt met al die functies. Voor veel normale (soms wat moeilijkere) programmeerstructuren bestaan er tegenwoordig functies.

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Mickman schreef op 24 August 2003 @ 16:58:
[...]


Het wordt je met php ook steeds makkelijker gemaakt met al die functies. Voor veel normale (soms wat moeilijkere) programmeerstructuren bestaan er tegenwoordig functies.
Yup, over 10 jaar schrijven we allemaal zo programma's:
PHP:
1
2
csvParserForCompanyX = new csvParser();
csvParserForCompanyX->autoConfigure();
;)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate

Pagina: 1