PDA

Bekijk Volledige Versie : plan van aanpak



Matthijs de Z
30/09/04, 19:35
Hoi,

Ik moet een scriptje maken voor het vervangen van bepaalde waarden in een
text file. Die ziet er ongeveer zo uit.

ABC,20040101,D,000000,10,12,9,11,14611,0
ABC,20040102,D,000000,12,13,9,9,113451,0
ABC,20040103,D,000000,10,11,8,9,1144341,0
ABC,20040104,D,000000,12,14,1,11,114341,0
QWE,20040101,D,000000,29,30,28,29,1114343,0
QWE,20040102,D,000000,33,34,30,32,1147643,0
QWE,20040103,D,000000,31,33,30,32,155443,0

En van ABC en QWE is de data rij een stuk langer dan het voorbeeld van
hierboven en er zijn nog veel meer soorten dan ABC en QWE.

Nu heb ik een andere file (vervangreeksen)met bijvoorbeeld dit:
ABC,XYZ-AMS
QWE,RTY-AMS
D,60
000000,1200000

Wat wil ik doen: Ik moet de gegevens die voor de comma staan in de file
vervangreeksen vervangen door de gegevens die er achter staan. Dus je krijgt
dan (om regel 1 van het origineel te nemen) dit:

XYZ-AMS,20040101,60,120000,10,12,9,11,14611,0

Nu dacht ik, ik lees die hele originele file in als string, maak een while
loop waarbij ik de file vervangreeksen regel voor regel doorloop en gooi een
eregi_replace over de string heen en sla de string na de complete loop op in
een file. Maar de datafile is ongeveer 25 MB en er moeten ongeveer 300
dingen vervangen worden.

Ik wil het graag zonder MySQl oplossen (aangezien ik daar niet in thuis ben)
hoe kan ik dit het beste doen? Is het verstandig het te doen zoals ik
ongeveer beschrijf, of kan ik beter vanuit een andere hoek beginnen?
Groeten,

Matthijs

Daniel Tryba
30/09/04, 20:25
Matthijs de Z <haalallesvoorhetstreepjeplushetstreepjezelfweg-mldz@hotmail.com> wrote:
> ABC,20040101,D,000000,10,12,9,11,14611,0
....
> QWE,20040103,D,000000,31,33,30,32,155443,0
>
> En van ABC en QWE is de data rij een stuk langer dan het voorbeeld van
> hierboven en er zijn nog veel meer soorten dan ABC en QWE.
>
> Nu heb ik een andere file (vervangreeksen)met bijvoorbeeld dit:
> ABC,XYZ-AMS
> QWE,RTY-AMS
> D,60
> 000000,1200000
[vervangen]
> Nu dacht ik, ik lees die hele originele file in als string, maak een while
> loop waarbij ik de file vervangreeksen regel voor regel doorloop en gooi een
> eregi_replace over de string heen en sla de string na de complete loop op in
> een file. Maar de datafile is ongeveer 25 MB en er moeten ongeveer 300
> dingen vervangen worden.

eregi_replace lijkt op php?

Wachtend op een perl-oneliner kan je alvast het volgende doen:

lees de vervangreeksen in regel voor regel, split op ',' en zet alles
voor de ',' in het array $orig en na in array $repl.

Open de datafile en open een nieuwe file, lees datafile regel voor regel
in en schrijf dan 'str_replace($orig, $repl, $line)' weg naar de nieuwe
file.

Overschrijf het origineel.

Geheugen gebruik blijft dan beperkt (1 regel per keer + de omvang van de
orig/repl arrays).

Benodigde php functies:
fopen, flock , fputs, fgets, str_replace, fclose, tempnam, explode, rtrim....

--

Daniel Tryba

Matthijs de Z
30/09/04, 20:45
> eregi_replace lijkt op php?

Idd, PHP. Even vergeten te melden.

> Wachtend op een perl-oneliner kan je alvast het volgende doen:
>
> lees de vervangreeksen in regel voor regel,

Met fgets

>split op ','

yep, met explode

>en zet alles
> voor de ',' in het array $orig en na in array $repl.

eitje tot nu toe

> Open de datafile en open een nieuwe file, lees datafile regel voor regel
> in

Weer met fgets

>en schrijf dan 'str_replace($orig, $repl, $line)' weg naar de nieuwe
> file.

Met fputs

> Overschrijf het origineel.
>
> Geheugen gebruik blijft dan beperkt (1 regel per keer + de omvang van de
> orig/repl arrays).
>
> Benodigde php functies:
> fopen, flock , fputs, fgets, str_replace, fclose, tempnam, explode,
rtrim....

OK, dus het kan in ieder geval wel zo. Ga ik in het weekend even lekker
rotzooien. Wat is overigens het voordeel van str_replace boven
eregi_replace?
Mazzel,

Matthijs

Daniel Tryba
01/10/04, 02:35
Matthijs de Z <haalallesvoorhetstreepjeplushetstreepjezelfweg-mldz@hotmail.com> wrote:
> Wat is overigens het voordeel van str_replace boven
> eregi_replace?

Afhankelijk van de toepassing, voor het simpele vervangen van strings
(dus zonder context) is 1 str_replace(array,array,string), vele vele
vele malen sneller dan een x aantal reguliere expressies.

--

Daniel Tryba