Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]czytanie z pliku
Forum PHP.pl > Forum > Przedszkole
piasekps
czesc

mam problem z czytaniem z plika textowego.
mianowicie zapisuje sobie do pliku wartosci oddzielone |
wczytuje je w za pomoca file i zliczajac kolejne linie rozdzielam
wartosci odseparowane |, wszystko dziala ok dopuki
nie pojawi sie nowa linia w danych wtedy 'szablon' sie rozwala
i zamiast wszystkich informacji w jednej linii rozwala mi sie na kilka
np. tak : 15|maj|karol jest u cioci
a ciocia jest u nas|15:16

normalnie w linii powinny byc 4 zmienne (oddzielone |)
a tak pojawiaja sie te zmienne w 2 liniach/wiecej

pomyslalem ze fajnie by bylo gdyby dalo sie czytac wartosc
pliku w sposob jaki jest dostepny w pythonie czyli: plik[poczatek:koniec]
i wtedy wycina mi tresc od 'poczatek' az do 'koniec'
wiem ze funkcja fread, pozwala czytac jakas dlugosc pliku ale czy da sie
w niej ustawic aby czytala od ktoregos znaku np od 20

jesli w jakiejs zmiennej wystepuje nowa linia aby sie pojawila rowniez po odczytaniu
mam nadzieje ze udalo mi sie to jakos wytlumaczyc
da sie cos takiego zrobic w php a moze da sie to zrobic jesce inaczej

pozdrawiam
p.s.
potreb
A jakbyś jeszcze mógł dodać do posta wyżej kod php, to byśmy może coś poradzili.
piasekps
to zapisuje w taki sposob
  1. <?php
  2. $tmp = $czas."|".$autor."|".$comment."|".$serwer."\n";
  3. if(!file_exists($Dir))
  4. { 
  5. $plik = fopen($Dir, 'x');
  6. fwrite($plik, $tresc); 
  7. fclose($plik);
  8. @chmod($Dir, 0777); 
  9. }
  10. else
  11. { 
  12. $plik = fopen($Dir, 'a');
  13.  fwrite($plik, $tresc);
  14. fclose($plik);
  15. }
  16. ?>


a tak z niego czytam

  1. <?php
  2. if (file_exists($Dir))
  3.  {
  4. $plik = file($Dir);
  5. for ($i = 0; $i < count($plik); $i++)
  6. {$poz = explode("|", $plik[$i]);}
  7.  }
  8. ?>

no i pozniej jesce wykorzystuje w petli for zmienne $poz
brzuchalski
spróbuj tego:
  1. <?php
  2. preg_match_all('/([0-9]*)|([^|]*)|([^|]*)|([0-9]{2}:[0-9]{2})/s', file_get_contents('plik.txt'), $wynik, PREG_SET_ORDER);
  3. print_r($wynik);
  4. ?>

wynik jest tablica twoich kolejnych rekordów gdzie pierwszy element to zawsze linia wczytana a kolejne to po kolei czas, autor, comment, serwer
czytaj to tak przeleć wyrażeniem regularnym (liczta 0-9 wielocyfrowa| znaki inne od "|" | znaki inne od "|" | liczba dwucyfrowa ":" liczba dwucyfrowa) przez zawartość pliku ile razy się da i zwróć w kolejności dopasowania wzorca

pozdrawiam
piasekps
nie dziala, dostaje pusta tablice Array()
prubowalem to jakos zmodyfikowac do moich potrzeb
ale jakos mi sie nie udalo

moze moglbys mi pomoc
  1. <?php
  2. $tmp = $czas."|".$autor."|".$comment."|".$serwer."\n";
  3. ?>

$tmp zapisuje taki przykladowy kod:
18:01 03.01.2008|piasek|koles lubi lody|255.255.255.255

i czy bedzie to dzialac gdy $tmp bedzie w pliku.txt
zapisywac sie w ten sposob:
18:01 03.01.2008|piasek|koles
lubi
chodzic do
szkoly|255.255.255.255
brzuchalski
najprościej:
  1. <?php
  2. preg_match_all('/(^|*)|([^|]*)|([^|]*)|([^|]*)/s', file_get_contents('plik.txt'), $wynik, PREG_SET_ORDER);
  3. print_r($wynik);
  4. ?>

to tak, a lepiej:
  1. <?php
  2. preg_match_all('/([0-9]{1,2}:[0-9]{1,2}s{1}[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}|([^|]*)|([^|]*)|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})/s', file_get_contents('plik.txt'), $wynik, PREG_SET_ORDER);
  3. print_r($wynik);
  4. ?>

to czytaj tak wyrazenie regularne=(1-2cyfry ":" 1-2cyfry 1"spacja" 1-2cyfry "-" 1-2cyfry "-" 4cyfry | wszystko co nie "|" | wszystko co nie "|" | 1-3cyfry "kropka" 1-3cyfry "kropka" 1-3cyfry "kropka" 1-3cyfry),
ale pierwszy sposob powinien bez problemu pojsc tyle ze nie ma takiej kontroli nad danymi

inny wogole sposob na:
  1. <?php
  2. $tmp[] = array($czas, $autor, $comment, $serwer);
  3. $tmp[] = array($czas, $autor, $comment, $serwer);
  4. $tmp[] = array($czas, $autor, $comment, $serwer);
  5.  
  6. //zapisanie do pliku zamiast tekstu to zapisuj tekst jaki powstaje 
  7. $tmp = serialize($tmp);
  8.  
  9. //a potem czytaj
  10.  
  11. $tmp = unserialize(file_get_contents('plik.txt'));
  12. print_r($tmp); //tablica
  13.  
  14. ?>
piasekps
w przykladzie pierwszym wyskakuje taki komunikat
  1. <?php
  2. Warning: preg_match_all() [function.preg-match-all]: Compilation failed: nothing to repeat at offset 3 in /var/www/skrypty/main1.php on line 344
  3. ?>

w tejze linii znajduje sie :
  1. <?php
  2. preg_match_all('/(^|*)|([^|]*)|([^|]*)|([^|]*)/s', file_get_contents('plik.txt'), $wynik, PREG_SET_ORDER);
  3. ?>


drugi przyklad:

  1. <?php
  2. Warning: preg_match_all() [function.preg-match-all]: Compilation failed: missing ) at offset 124 in /var/www/skrypty/main1.php on line 344
  3. ?>


  1. <?php
  2. preg_match_all('/([0-9]{1,2}:[0-9]{1,2}s{1}[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}|([^|]*)|([^|]*)|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})/s', file_get_contents('plik.txt'), $wynik, PREG_SET_ORDER);
  3. ?>


czy tutaj nie powinno byc tak? aby uwydatnic co dodalem dam kilka spacji
  1. <?php
  2. preg_match_all('/([0-9]{1,2}:[0-9]{1,2}s{1}[0-9]{1,2} . [0-9]{1,2} . [0-9]{4} *)| ([^|]*)|([^|]*)|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} *) /s', file_get_contents('plik.txt'), $wynik, PREG_SET_ORDER);
  3. ?>


w trzecim przykladzie
jesli wystepuje w zmiennej $comment tresc z kilkoma liniami to po odczytaniu
wszystko jest w jednej linii, i po dopisaniu nowego rekordu nie da sie go odczytac

mam jesce jedno pytanie:
  1. <div class="comments">
  2. <div class="c1">
  3.  <form action="skrypt.php" method="post">
  4. <b>Autor:</b> 
  5. <input type="text" name="autor" size="15" class="in2"><br />
  6. <textarea name="komentarz" rows="5" cols="60" class="in2"></textarea>
  7. <?php  
  8. echo '<input type="hidden" name="p" value="'.$self.'">';
  9. echo '<input type="hidden" name="d" value="'.$dir.'">'; 
  10. echo '<input type="hidden" name="n" value="'.$nr.'">';
  11. ?>  
  12. <div class="in1">
  13.  <input type="submit" value="Dodaj">
  14. </div>
  15.  </form>
  16. </div>


wykorzystuje ten kod do pobrania komentarza i wysalania go do skryptu.php
gdzienastepnie jest zapisywany, ale po nacisnieciu przycisku Dodaj strona przeladowywuje
sie na pusta strone, moje pytanie gdzie i co powinienem zmienic zeby po nacisnieciu Dodaj
wrocilo spowrotem na strone z ktorej zostalo wyslane,
druga sprawa to czy mozna jakos w zrodle ukryc czesc kodu (chodzi o inputy, hidden)
nie chcialbym aby jakies wiadomosci/dane zostaly wyswietlane

dzieki wielkie
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.