Citire randuri cu date din fisier text

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
andras
Mesaje: 430

Citire randuri cu date din fisier text

Salut,
Am un fisier PGN (utilizat in sah) de urmatoarea forma (se poate deschide si in Notepad, deci este text):

Cod: Selectaţi tot

[Event "Open Teplice 2006"]
[Site "Teplice"]
[Date "2006.06.17"]
[Round "1"]
[White "Kalina Jiri, SK Chem. Litvinov"]
[Black "GM Vokac Marek, SK Mahrla Praha"]
[Result "0-1"]
[ECO "B23"]
[WhiteElo "2052"]
[BlackElo "2455"]
[Annotator "Team Teplice Open"]
[PlyCount "58"]
[EventDate "2006.06.17"]
[EventType "swiss"]
[EventRounds "9"]
[EventCountry "CZE"]

1. e4 c5 2. Nc3 Nc6 3. Bc4 e6 4. Nf3 a6 5. a4 Nge7 6. d4 cxd4 7. Nxd4 Nxd4 8.
Qxd4 Nc6 9. Qd1 Qc7 10. O-O b6 11. f4 Bb7 12. Be3 Be7 13. Qe1 O-O 14. Bd3 Nb4
15. Qf2 Bc5 16. Rac1 d5 17. exd5 exd5 18. Bxc5 bxc5 19. Qh4 f5 20. Qh3 Nxd3 21.
cxd3 Rae8 22. d4 cxd4 23. Ne4 Qb6 24. a5 Qxa5 25. Nd6 Re3 26. Nxb7 Qb6 27. Rf3
Qxb2 28. Rc7 Qb1+ 29. Rf1 Qb6 {Diagram #} 0-1

[Event "Open Teplice 2006"]
[Site "Teplice"]
[Date "2006.06.17"]
[Round "1"]
[White "IM Hausner Ivan, SK Holdia Praha"]
[Black "Stanek Stanislav, SK Bydo Zakrany"]
[Result "1-0"]
[ECO "A10"]
[WhiteElo "2416"]
[BlackElo "2007"]
[Annotator "Team Teplice Open"]
[PlyCount "41"]
[EventDate "2006.06.17"]
[EventType "swiss"]
[EventRounds "9"]
[EventCountry "CZE"]

1. c4 d6 2. Nc3 c6 3. g3 Nf6 4. Bg2 e5 5. Rb1 Be7 6. b4 Be6 7. d3 Nbd7 8. Nf3
Nf8 9. b5 Bd7 10. O-O h6 11. d4 Ng6 12. bxc6 bxc6 13. c5 exd4 14. cxd6 dxc3 15.
dxe7 Qxe7 16. Qb3 Qe6 17. Qa3 Nd5 18. e4 Qe7 {Diagram #} 19. exd5 Qxa3 20. Bxa3
cxd5 21. Nd4 1-0
aici sint notate 2 partide, dar poate fi cu doar o singura partida sau mai multe. Marea majoritate a fisierelor PGN sint facute dupa acest standard, dar numarul de paranteze patrate poate fi diferit (ex. poate lipsi informatia privitoare la Elo, in acest caz cimpul Elo din tabela va ramine gol, deci trebuie sa fac si variabile $WhiteElo si $BlackElo sa vad ce valori au, primul cuvint de dupa paranteza va fi numele variabilei).
Cum parcurg acest fisier si cum salvez in baza de date (sa fac 2 inregistrari), adica tot ce este intre paranteze patrate sa fie fiecare paranteza patrata in cimp separat (dar sa nu contina si simbolul parantezelor), iar mutarile toate (de la 1 la N) de asemenea intr-un singur cimp separat (text)? Am deja structura tabelei, contine 18 cimpuri (id+ cele din fisier). Nu-mi trebuie script, doar un mic exemplu cum parcurg fisierul, cum iau continutul parantezelor si cum trec la urmatoarea partida. Multumesc.

MarPlo Mesaje: 4343
Salut
Cu functia file() poti prelua randurile dintr-un fisier text intr-un array numeric.

Cod: Selectaţi tot

$rows_txt = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
Poti sa parcurgi randurile cu for() sau foreach(), iar cu preg_match() poti prelua partea dintre paranteze:

Cod: Selectaţi tot

$str ='[Black "GM Vokac Marek, SK Mahrla Praha"]';
if(preg_match('/\[([^\]]*)\]/i', $str, $mt)) echo $mt[1];  // Black "GM Vokac Marek, SK Mahrla Praha"

andras Mesaje: 430
Multumesc, functioneaza, am reusit sa fac varianta cind exista o singura partida in fisierul PGN. Mai ramine sa fac varianta de preluare cind sint mai multe partide de sah in acelasi PGN. Inca ma gindesc cum sa rezolv. Poate ai o idee.

MarPlo Mesaje: 4343
Poti sa verifici cand incepe fiecare partida. De exemplu, am vazut ca datele ei incep cu "[Event".
La parcurgerea randurilor din fisier se poate folosi stripos() pt. a verifica daca un sub-sir e intr-un sir; si se retine intr-o variabila numarul partidei curente.
Cam asa:

Cod: Selectaţi tot

$rows_txt = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$nri = count($rows_txt);
$nr_match =0;  //current match
$this_match =1;  //to know is other match
for($i=0; $i<$nri; $i++){
  if(stripos($rows_txt[$i], '[Event') >=0) $nr_match++;  //when the beginning of a match is found

  if($nr_match == $this_match){
    //... parse and use data of current match, after the row with [Event ...]
  }
  else {
    //$nr_match changes, we know that another match begins
    $this_match = $nr_match;
    //this loop /row contains [Event ...], begining of a match, next rows are with the next of its data
  }
}
- Te poti folosi de $nr_match ca sa stii numarul partidei curente, si cu $this_match cand a inceput alta.

andras Mesaje: 430
A mers cu ideea ta cu '[Event'. Multumesc!

Subiecte similare