[PHP] String splitten

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Pascal Saul
  • Registratie: Augustus 2001
  • Laatst online: 07-07 17:03
Ik ben bezig met het automatiseren van gepubliceerde standen in PDF formaat te importeren in mijn eigen database. Het volgende heb ik al:

Downloaden van .pdf
Converteren van .pdf -> .txt
Filteren van .txt

Dan houd ik het volgende over:
code:
1
2
3
4
5
    [1] => Hoofdklasse afd 1
    [2] => 1840   BC LEERDAM 2      -WORMENSE SV 1       4-4     23/09/2006 16:00
    [3] => 1837   OSM BADMINTON 2   -BV HOUTEN 1         5-3     24/09/2006 10:00
    [4] => 1838   LEUSDER BC 2      -IDUNA BC 4          3-5     24/09/2006 13:30
    [5] => 1839   AMERSFOORT 12     -AMERSFOORT 9        5-3     24/09/2006 13:00


Om de gegevens in een database op te slaan moet ik deze uit elkaar halen. Hoe kan ik dit nu het beste doen? Waar dacht ik zelf aan:

Optie #1
1. Zoek naar eerste spatie -> van 0 tot eerste spatie = Wedstrijdnummer
2. Zoek naar "-" -> van spatie tot "-" = Thuis team
3. Zoek naar volgende (2de) "-" -> van streep #1+1 tot #2 -1 = Uit team
4. streep #2 -1 = Thuis stand
5. streep #2 + 1 = Uit stand
6. streep #2 +2 tot eind = Datum

Optie #2
1. Vervang alle spatie reeksen langer dan 2 door ;
2. Split op ;

Resultaat moet worden:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    [1] => Array
        (
            [0] => Hoofdklasse afd 1
        )

    [2] => Array
        (
            [0] => 1840
            [1] => BC LEERDAM 2
            [2] => WORMENSE SV 1
            [3] => 4
            [4] => 4
            [5] => 23/09/2006 16:00
        )

    [3] => Array
        (
            [0] => 1837
            [1] => OSM BADMINTON 2
            [2] => BV HOUTEN 1
            [3] => 5
            [4] => 3
            [5] => 24/09/2006 10:00
        )

    [4] => Array
        (
            [0] => 1838
            [1] => LEUSDER BC 2
            [2] => IDUNA BC 4
            [3] => 3
            [4] => 5
            [5] => 24/09/2006 13:30
        )

    [5] => Array
        (
            [0] => 1839
            [1] => AMERSFOORT 12
            [2] => AMERSFOORT 9
            [3] => 5
            [4] => 3
            [5] => 24/09/2006 13:00
        )


Optie #1 zal me waarschijnlijk nog wel lukken alleen ben ik bang dat het veel makkelijker kan en dat het een performance killer is. Optie #2 lijkt mij de beste alleen weet ik niet hoe :(

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Om alle 2+ spaties te vervangen door een speciaal teken (en daarvoor zou ik niet eens de puntkomma gebruiken), zou ik eens kijken naar preg_replace, of zelfs direct naar preg_split.

Volgens mij moet "[ ]+" werken...

[ Voor 26% gewijzigd door CodeCaster op 29-09-2006 20:06 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
PHP:
1
2
$nieuwearray[0] = explode("\t", $oudearray[0]);
$nieuwearray[1] = explode("\t", $oudearray[1]);


etc etc

dit werkt alleen als er een tab staat tussen alle 'velden'.. maar gezien de layout denk ik dat dat wel van toepassing is (zou ook heel goed niet kunnen ivm pdf -> txt)


edit: ha! toch zeker 20 seconden eerder :P

[ Voor 7% gewijzigd door Mental op 29-09-2006 20:09 ]


Acties:
  • 0 Henk 'm!

  • brute51
  • Registratie: Augustus 2001
  • Laatst online: 07-08 23:35
Kijk is naar de functie explode. Of begrijp ik het verkeerd?

edit: sorry voor de dubbelpost

[ Voor 22% gewijzigd door brute51 op 29-09-2006 20:09 ]

Ik heb echt een hele goeie PC.


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

@ de twee hierboven, TS meldt toch duidelijk dat het om meerdere spaties gaat, en niet om tabs.

En een dubbelpost is tweemaal dezelfde poster onder elkaar ;)

[ Voor 28% gewijzigd door CodeCaster op 29-09-2006 20:10 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • analog_
  • Registratie: Januari 2004
  • Niet online
Toevallig ben ik met iets gelijkaardigs bezig (behalve dat ik in het in een zip vorm krijg waarin een xml zit). Het probleem bij mij is dat de database corrupt is maar dat is flink offtopic.

Bon wat wou ik zeggen ik gebruik de explode methode en doe dit op ongeveer 28000 rows. Dit duurt op een P3 500Mhz (linux-2.6 met Apache 2.0 en PHP 5) ongeveer 120 seconden... Het valt dus best wel mee ...

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dan bedoel je vast " {2,}" of evt nog "\s{2,}" ?

[ Voor 5% gewijzigd door ACM op 29-09-2006 20:13 ]


Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
CodeCaster schreef op vrijdag 29 september 2006 @ 20:10:
@ de twee hierboven, TS meldt toch duidelijk dat het om meerdere spaties gaat, en niet om tabs.

En een dubbelpost is tweemaal dezelfde poster onder elkaar ;)
daarom zet ik er ook tussen haakjes bij dat het ook heel goed geen tab kan zijn, maar het word niet letterlijk in de startpost vermeld. voor de een is een tab namelijk gewoon een reeks spaties, maar net hoe je er tegen aan kijkt (technisch gezien klopt daar natuurlijk niets van).

Maarre, TS .. zo te zien begint elke string die je apart wil hebben op een bepaalde positie en eindigt op een bepaalde positie.. kan je dan niet gewoon substrings maken op basis van karakterplaatsen?

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

ACM schreef op vrijdag 29 september 2006 @ 20:13:
[...]

Dan bedoel je vast " {2,}" of evt nog "\s{2,}" ?
Inderdaad. Hm, ik durf te zweren dat ik mezelf beloofd had een boek over expressies te kopen om het principe eens door te krijgen... :X

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Pascal Saul
  • Registratie: Augustus 2001
  • Laatst online: 07-07 17:03
ACM schreef op vrijdag 29 september 2006 @ 20:13:
[...]
Dan bedoel je vast " {2,}" of evt nog "\s{2,}" ?
De bijna held :)
code:
1
2
3
4
5
6
7
8
9
$split[] = preg_split("/\s{2,}/", $line);
    [2] => Array
        (
            [0] => 1840
            [1] => BC LEERDAM 2
            [2] => -WORMENSE SV 1
            [3] => 4-4
            [4] => 23/09/2006 16:00
        )


Nog niet helemaal door die stomme streepjes, maar
code:
1
2
3
4
5
6
7
8
9
10
$split[] = preg_split("/\s{2,}/", str_replace("-", "  ", $line));
    [2] => Array
        (
            [0] => 1840
            [1] => BC LEERDAM 2
            [2] => WORMENSE SV 1
            [3] => 4
            [4] => 4
            [5] => 23/09/2006 16:00
        )


Bedankt allemaal!

Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
nette oplossing inderdaad, let er alleen wel op dat er geen teams zijn met streepjes zijn in de tamnaam ;)

Acties:
  • 0 Henk 'm!

  • Pascal Saul
  • Registratie: Augustus 2001
  • Laatst online: 07-07 17:03
L4m0r schreef op vrijdag 29 september 2006 @ 20:19:
[...]


daarom zet ik er ook tussen haakjes bij dat het ook heel goed geen tab kan zijn, maar het word niet letterlijk in de startpost vermeld. voor de een is een tab namelijk gewoon een reeks spaties, maar net hoe je er tegen aan kijkt (technisch gezien klopt daar natuurlijk niets van).

Maarre, TS .. zo te zien begint elke string die je apart wil hebben op een bepaalde positie en eindigt op een bepaalde positie.. kan je dan niet gewoon substrings maken op basis van karakterplaatsen?
Je had met view de source kunnen zien dan wist je dat het om spaties ging of tabs. Ik had het ook over een reeks spaties en geen tabs. Ik kan snappen dat je dat dacht. Met tabs had ik het ook wel geweten.

In dit voorbeeld lijkt het te gaan om vaste posities maar in werkelijkheid is dat niet altijd zo. Hier zou het een fatale aanname zijn geweest :P

De volgende klus wordt het automatiseren van de ranking, die is ook leuk :P
L4m0r schreef op vrijdag 29 september 2006 @ 20:27:
nette oplossing inderdaad, let er alleen wel op dat er geen teams zijn met streepjes zijn in de tamnaam ;)
Haha, dat had zo kunnen zijn. Gelukkig is hun informatiesysteem zo slecht dat ze geen vreemde karakters doorlaten :) Wat ik zo zie wordt alleen alfanummeriek en nummeriek door gelaten in de naam.

[ Voor 16% gewijzigd door Pascal Saul op 29-09-2006 20:31 ]


Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
heerlijk.. mag ik vragen wat voor sportclubs dit zijn? bowls toevallig?

Acties:
  • 0 Henk 'm!

  • Pascal Saul
  • Registratie: Augustus 2001
  • Laatst online: 07-07 17:03
Badminton :+

En het is trouwens niet helemaal perfect zie ik net. Bij een enkeling zit het wedstrijdnummer met een spatie verbonden met het thuis team :( Nu moet ik als nog voor optie #1gaan :'(

Doet even :r op de NBB

[ Voor 8% gewijzigd door Pascal Saul op 29-09-2006 20:49 ]


Acties:
  • 0 Henk 'm!

  • Pascal Saul
  • Registratie: Augustus 2001
  • Laatst online: 07-07 17:03
code:
1
2
3
4
5
6
7
8
9
10
            $p1 = strpos($line, " ");
            $p2 = strpos($line, "-");
            $p3 = strrpos($line, "-");

            $temp[] = trim(substr($line, 0 , $p1));
            $temp[] = trim(substr($line, $p1 , $p2-$p1));
            $temp[] = trim(substr($line, $p2+1, $p3-$p2-$p1-1));
            $temp[] = trim(substr($line, $p3-1, 1));
            $temp[] = trim(substr($line, $p3+1 , 1));
            $temp[] = strftime("%Y-%m-%d %H:%M", strtotime(trim(substr(str_replace ("/", "-", $line), $p3+2))));


Zo heb ik altijd zes kloppende velden in mijn Array. De performance is prima overigens. Wel erg ranzig uitgewerkt maar het is niet anders. Het verschil in tijd is:

code:
1
2
3
4
5
6
7
mijn:
TIME: 0.0244238376617   Uitslagen Junioren 1
TIME: 0.0277960300446   Uitslagen Senioren 1

preg_split:
TIME: 0.00501680374146  Uitslagen Junioren 1
TIME: 0.00499081611633  Uitslagen Senioren 1

[ Voor 16% gewijzigd door Pascal Saul op 29-09-2006 21:46 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Mwah. een reguliere expressie of een explode zal ook gewoon door de hele string moeten wandelen hoor. ZOveel scheelt het niet in performance.

Als ik trouwens naar de gegevens kijk dan lijkt het me eerder een fixed position achtige opmaak. In dat geval kun je er altijd vanuit gaan dat vanaf positie x tot positie y altijd het thuisteam staat en hoef je dus niet naar spaties en - te zoeken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Wanneer performance een probleem is dan moet je juist geen regular expressions gebruiken wanneer je het af kan met functies als strpos, substr, explode etc etc. Deze php functies zijn erg snel.

Acties:
  • 0 Henk 'm!

  • Pascal Saul
  • Registratie: Augustus 2001
  • Laatst online: 07-07 17:03
Janoz schreef op zaterdag 30 september 2006 @ 02:02:
Mwah. een reguliere expressie of een explode zal ook gewoon door de hele string moeten wandelen hoor. ZOveel scheelt het niet in performance.

Als ik trouwens naar de gegevens kijk dan lijkt het me eerder een fixed position achtige opmaak. In dat geval kun je er altijd vanuit gaan dat vanaf positie x tot positie y altijd het thuisteam staat en hoef je dus niet naar spaties en - te zoeken.
Je bent mijn held als je het met een reg exp kan doen of een explode. Op dat gebied ga ik afhaken :+

Als je een andere post gelezen had, gaat het niet om fixed velden :P

Ik ben zo tevreden over het resultaat, mocht het beter kunnen hoor ik dat erg graag. Ik ben niet tevreden over de grote van de oplossing al is de performance meer als goed te noemen :)
Pagina: 1