Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyświetlanie danych z pliku TXT
Forum PHP.pl > Forum > Przedszkole
Elber
Witam, Mam plik test.txt który wygląda tak:

ID#Imie Nazwsiko##ID2#UL. nazwa_ulicy

Jak wyświetlić osobno:

Imię:
Nazwisko:
Nazwa ulicy(bez tego UL.):

cuterOne
explode('#') do utworzenia tablicy
explode('.')/substr()/strtr() do wycięcia/usunięcia ul.
cuterOne
imie i nazwisko też explode(" ") wink.gif
Sephirus
Albo uzyć odpowiedniego preg_match'a typu:

  1.  
  2. preg_match_all('/([^#]+)#([^ ]+)\s([^]+)#([^#]+)#([^#]+)#(ul\.)*\s*[^\n]+/si',$kod_pliku,$matches);
  3. print_r($matches);
  4.  


Jest to w zasadzie jedna linijka, metoda kolegi wyżej napewno będzie miała więcej linijek ale będzie bardziej wydajna wink.gif

Wybór należy do Ciebie

HTH! wink.gif
Elber
HMm napisałem coś takiego:

  1. if (is_file('pliki_txt/test.txt')){
  2.  
  3. $plik=file_get_contents('pliki_txt/test.txt');
  4.  
  5. $plik_utf8 = iconv('ISO-8859-2', 'UTF-8', $plik);
  6.  
  7. for ($ile_danych = 0; $ile_danych < count($plik_utf8); $ile_danych++ ){
  8.  
  9. $linia=explode("\n",$plik_utf8);
  10.  
  11. for ($i = 0; $i < count($linia); $i++ ){
  12.  
  13. $dane=explode('#',$linia[$i]);
  14.  
  15. $imie = explode(' ',$dane[1]);
  16.  
  17. $ulica = explode(' ',$dane[4]);
  18.  
  19. echo 'ID: '.$dane[0].' - Imię: '.$imie[0].' - Nazwisko: '.$imie[1].' - Ulica: '.$ulica[1].'<br />';
  20.  
  21. }
  22.  
  23. }
  24.  
  25. } else { echo 'brak pliku'; }


Ale czy jest to wydajne ? I czy nie można tego zrobić lepiej / szybciej ? I wywala mi błąd na końcu że ostatnia linijka jest pusta ...

Notice: Undefined offset: 1 in test.php on line 31 Notice: Undefined offset: 4 in test.php on line 32
Notice: Undefined offset: 1 in test.php on line 34 Notice: Undefined offset: 1 in test.php on line 34
ID: - Imię: - Nazwisko: - Ulica:

Jak zrobić aby sprawdzał czy ostatnia linijka jest pusta i jak tak to ma nie wyświetlać ?

Ok zrobiłem to z tą ostatnią linią teraz to wygląda tak:

  1. if (is_file('pliki_txt/test.txt')){
  2.  
  3. $plik=file_get_contents('pliki_txt/test.txt');
  4.  
  5. $plik_utf8 = iconv('ISO-8859-2', 'UTF-8', $plik);
  6.  
  7. for ($ile_danych = 0; $ile_danych < count($plik_utf8); $ile_danych++ ){
  8.  
  9. $linia=explode("\n",$plik_utf8);
  10.  
  11. for ($i = 0; $i < count($linia); $i++ ){
  12. if($linia[$i] != ''){
  13.  
  14. $dane=explode('#',$linia[$i]);
  15.  
  16. $imie = explode(' ',$dane[1]);
  17.  
  18. $ulica = explode(' ',$dane[4]);
  19.  
  20. echo 'ID: '.$dane[0].' - Imię: '.$imie[1].' - Nazwisko: '.$imie[0].' - Ulica: '.$ulica[1].' '.$dane[5].'/'.$dane[6].'<br />';
  21.  
  22. }
  23. }
  24.  
  25. }
  26.  
  27. } else { echo 'brak pliku'; }


Ale czy jest to wydajne ? I czy nie można tego zrobić szybciej / lepiej ?
Sephirus
Szczerze - strasznie to zagmatwałeś smile.gif

Przede wszystkim niepotrzebnie liczysz jakiekolwiek literki smile.gif (te 2 fory)

Jeżeli dasz

$linijki = explode("\n",iconv('ISO-8859-2', 'UTF-8',file_get_contents('pliki_txt/test.txt')));

to już masz tabelę z liniami, którą następnie wystarczy tylko explodować po "#" pustą linijkę rozpoznasz po tym że tabela wynikowa z ekslozji linijki będzie miała 1 wiersz lub sama linijka będzie pusta (jak masz to sprawdzane) wink.gif

Co do wydajności. Raczej się szybciej tego nie da zrobić chyba smile.gif

Wyrażenia regularne Ci zwróciły całą tabelę wszystkich potrzebnych pól naraz ale wydaje mi się, że byłoby to wolniejsze

Reszta ok wink.gif
Elber
Cytat(Sephirus @ 18.10.2011, 13:12:59 ) *
Szczerze - strasznie to zagmatwałeś smile.gif

Przede wszystkim niepotrzebnie liczysz jakiekolwiek literki smile.gif (te 2 fory)

Jeżeli dasz

$linijki = explode("\n",iconv('ISO-8859-2', 'UTF-8',file_get_contents('pliki_txt/test.txt')));

to już masz tabelę z liniami, którą następnie wystarczy tylko explodować po "#" pustą linijkę rozpoznasz po tym że tabela wynikowa z ekslozji linijki będzie miała 1 wiersz lub sama linijka będzie pusta (jak masz to sprawdzane) wink.gif

Co do wydajności. Raczej się szybciej tego nie da zrobić chyba smile.gif

Wyrażenia regularne Ci zwróciły całą tabelę wszystkich potrzebnych pól naraz ale wydaje mi się, że byłoby to wolniejsze

Reszta ok wink.gif


to jeśli wstawię $linijki = explode("\n",iconv('ISO-8859-2', 'UTF-8',file_get_contents('pliki_txt/test.txt'))); to jak wyświetlić te dane bo już się zgubiłem sad.gif
konrados
Cytat
to jeśli wstawię $linijki = explode("\n",iconv('ISO-8859-2', 'UTF-8',file_get_contents('pliki_txt/test.txt'))); to jak wyświetlić te dane bo już się zgubiłem


No to zrób sobie var_dump($linijki); a zobaczysz, że masz array, i teraz:

  1. foreach($linijki as $linia){
  2. $dane=explode('#',$linia);
  3. if(count($dane) == 0) break;
  4. //dane masz w $dane, np:
  5. $id = $dane[0];
  6. }
Elber
Hmm jak dam tak:

  1. foreach($linijki as $linia){
  2. $dane=explode('#',$linia);
  3. $imie = explode(' ',$dane[1]);
  4. $ulica = explode(' ',$dane[4]);
  5. if(count($dane) == 0) break;
  6.  
  7. echo 'ID: '.$dane[0].' - Imię: '.$imie[1].' - Nazwisko: '.$imie[0].' - Ulica: '.$ulica[1].'<br />';
  8. }


TO wyniki wyświetlają mi się kilka razy czyli leci od poczatku do końca i potem znowu od początku do końca i tak kilka razy...a na końcu mam błąd:

Notice: Undefined offset: 1 in test.php on line 27
Notice: Undefined offset: 4 in test.php on line 28
Notice: Undefined offset: 1 in test.php on line 30
Notice: Undefined offset: 1 in test.php on line 30
ID: - Imię: - Nazwisko: - Ulica: /

Linia 27 -> $ulica = explode(' ',$dane[4]);
Linia 28 -> if(count($dane) == 0) break;
Linia30 -> echo 'ID: '.$dane[0].' - Imię: '.$imie[1].' - Nazwisko: '.$imie[0].' - Ulica: '.$ulica[1].'<br />';



Ok z tym od początku do końca to mój błąd ... sory ;( Ale co zrobić z tymi błędami na końcu ?
konrados
Cytat
Ok z tym od początku do końca to mój błąd ... sory ;( Ale co zrobić z tymi błędami na końcu ?


Ta linijka: if(count($dane) == 0) break; odpowiada właśnie za to by przerwać gdy puste dane, wrzuć ją oczywiście wyżej, tuż po $dane=explode('#',$linia); tak jak było.
Elber
Próbowałem nim napisałem post...jednak nic to nie daje, dalej jest ten błąd.
konrados
No to popróbuj, może if(count($dane) < 4) break; no nie pamiętam jak się zachowa explode gdy w stringu nie ma podanego separatora a nie chce mi się sprawdzać.

Zrób sobie var_dump przy każdej iteracji i zobacz co ląduje w $dane w przypadku pustej linijki. Może
if(strlen($linia) == 0) break; pomoże.
Elber
Extra wink.gif if(strlen($linia) == 0) break; przed explode załatwiła sprawę smile.gif Wielkie dzięki za pomoc smile.gif
konrados
Spoko smile.gif
Elber
Jeszcze teraz mi się nasunęło ... jak wyświetlić pełną ulicę w momencie gdy będzie on kilkuczłonowa ? Bo teraz robie explode i jako separator daje spacje i wyświetlam $ulica[1] bo $ulica[0] to UL. Jak zrobić by wyświetlała się ulica kilku wyrazowa ?
konrados
A po co robisz explode? Jeśli chodzi Ci o to, że na początku stringa jest "ul. " i chcesz się tego pozbyć, to zrób

$ulica = str_replace("UL. ", "", $dane[4]);//czyli zamieniamy "UL. " na nicość.
Elber
OK wink.gif Działa dzięki wink.gif

Mam jeszcze jedno pytanie wink.gif Otóż zmieniła mi się struktura pliku TXT ... Teraz wygląda to tak:

Kod
Komunikat 1
#
Komunikat 2
#
ID#Imie Nazwsiko##ID2#UL. nazwa_ulicy
ID#Imie Nazwsiko##ID2#UL. nazwa_ulicy
ID#Imie Nazwsiko##ID2#UL. nazwa_ulicy
ID#Imie Nazwsiko##ID2#UL. nazwa_ulicy
itd


Jak w takim wypadku wyświetlić najpierw komunikat 1, potem komunikat 2, a potem całą listę tak jak prędzej ? Teraz bez tych komunikatów kod php wygląda tak:

  1.  
  2. $linijki = explode("\n",iconv('ISO-8859-2', 'UTF-8',file_get_contents('pliki/plik.txt')));
  3.  
  4. foreach($linijki as $linia){
  5.  
  6. if(strlen($linia) == 0) break;
  7.  
  8. $dane=explode('#',$linia);
  9. $imie = explode(' ',$dane[1]);
  10. $ulica = str_replace('UL. ', '', $dane[4]);
  11.  
  12. echo $dane[0].' '.$imie[1]. ' '.$imie[0].' '.$ulica.'<br />';
  13. }


Nikt nie ma pomysłu jak to zrobić ?
gorden
po pierwsze, zdeklaruj pętlę tak:
  1. foreach(file('pliki/plik.txt') as $num => $linia) {


a potem
  1. if(stristr('Komunikat', $linia)) {
  2. $komunikat == true;
  3. $wyswietl == $num +1;
  4. }
  5. if($wyswietl == $num && $komunikat == true) {
  6. echo $linia;
  7. $komunikat = false;
  8. }

oczywiście komunikat w jednej linii, ale możesz je łamać używając <br />
lukasz_test
Cytat(gorden @ 22.10.2011, 12:19:23 ) *
po pierwsze, zdeklaruj pętlę tak:
  1. foreach(file('pliki/plik.txt') as $num => $linia) {


a potem
  1. if(stristr('Komunikat', $linia)) {
  2. $komunikat == true;
  3. $wyswietl == $num +1;
  4. }
  5. if($wyswietl == $num && $komunikat == true) {
  6. echo $linia;
  7. $komunikat = false;
  8. }

oczywiście komunikat w jednej linii, ale możesz je łamać używając <br />

Zgadza się. File nadaje sie właśnie do czegoś takiego, poniewąż od razu w tablicy mamy wiersze. Jednak na wierszach zobiłbym explode.
Elber
Kolega @konrados napisał mi:
Cytat
Po if(strlen($linia) == 0) break; spróbuj:

$dane=explode('#',$linia);
if(count($dane) < 2) echo 'to jest komunikat: '.$dane[0];
else {
echo 'to są dane:';//tu jedź z danymi
$imie = explode(' ',$dane[1]);
$ulica = str_replace('UL. ', '', $dane[4]);
echo $dane[0].' '.$imie[1]. ' '.$imie[0].' '.$ulica.'<br />';
}


I jest OK wink.gif Tylko komunikaty są 2 wink.gif i jak wyświetlić To jest komunikat nr 1: komunikat1 i To jest komunikat nr 2: komunikat2 questionmark.gif?
dwwa
wpakuj to w xml i później użyj simplexml ;d
Elber
W tym momencie byłoby to bez sensu wink.gif próbowałem zrobić for'a ale wyświetla mi to dwa razy sad.gif

Da się to zrobić jakoś inaczej niż dać przed foreach $i=1; i w if(count($dane) < 2) { dać echo 'To jest komunikat nr '.$i++; questionmark.gif
gorden
a próbowałeś mojego sposobu ?
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.