Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP] Wyświetlanie danych z pliku TXT
Elber
post 18.10.2011, 11:22:13
Post #1





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

Ostrzeżenie: (0%)
-----


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.):



--------------------
GG: 564555
Go to the top of the page
+Quote Post
-cuterOne-
post 18.10.2011, 11:24:06
Post #2





Goście







explode('#') do utworzenia tablicy
explode('.')/substr()/strtr() do wycięcia/usunięcia ul.
Go to the top of the page
+Quote Post
-cuterOne-
post 18.10.2011, 11:25:13
Post #3





Goście







imie i nazwisko też explode(" ") wink.gif
Go to the top of the page
+Quote Post
Sephirus
post 18.10.2011, 11:47:06
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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

Ten post edytował Sephirus 18.10.2011, 11:47:39


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Elber
post 18.10.2011, 12:06:36
Post #5





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował Elber 18.10.2011, 11:54:45


--------------------
GG: 564555
Go to the top of the page
+Quote Post
Sephirus
post 18.10.2011, 12:12:59
Post #6





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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

Ten post edytował Sephirus 18.10.2011, 12:15:03


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Elber
post 18.10.2011, 12:20:36
Post #7





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

Ostrzeżenie: (0%)
-----


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


--------------------
GG: 564555
Go to the top of the page
+Quote Post
konrados
post 18.10.2011, 12:28:03
Post #8





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował konrados 18.10.2011, 12:30:58
Go to the top of the page
+Quote Post
Elber
post 18.10.2011, 12:53:59
Post #9





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

Ostrzeżenie: (0%)
-----


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 ?


--------------------
GG: 564555
Go to the top of the page
+Quote Post
konrados
post 18.10.2011, 12:56:23
Post #10





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował konrados 18.10.2011, 12:56:47
Go to the top of the page
+Quote Post
Elber
post 18.10.2011, 13:07:32
Post #11





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

Ostrzeżenie: (0%)
-----


Próbowałem nim napisałem post...jednak nic to nie daje, dalej jest ten błąd.


--------------------
GG: 564555
Go to the top of the page
+Quote Post
konrados
post 18.10.2011, 13:18:26
Post #12





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował konrados 18.10.2011, 13:20:24
Go to the top of the page
+Quote Post
Elber
post 18.10.2011, 13:20:14
Post #13





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

Ostrzeżenie: (0%)
-----


Extra wink.gif if(strlen($linia) == 0) break; przed explode załatwiła sprawę smile.gif Wielkie dzięki za pomoc smile.gif


--------------------
GG: 564555
Go to the top of the page
+Quote Post
konrados
post 18.10.2011, 13:20:49
Post #14





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

Ostrzeżenie: (0%)
-----


Spoko smile.gif
Go to the top of the page
+Quote Post
Elber
post 18.10.2011, 14:21:45
Post #15





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

Ostrzeżenie: (0%)
-----


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 ?


--------------------
GG: 564555
Go to the top of the page
+Quote Post
konrados
post 18.10.2011, 15:20:17
Post #16





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

Ostrzeżenie: (0%)
-----


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ść.

Ten post edytował konrados 18.10.2011, 15:20:35
Go to the top of the page
+Quote Post
Elber
post 21.10.2011, 19:47:49
Post #17





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

Ostrzeżenie: (0%)
-----


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ć ?

Ten post edytował Elber 21.10.2011, 10:50:15


--------------------
GG: 564555
Go to the top of the page
+Quote Post
gorden
post 22.10.2011, 11:19:23
Post #18





Grupa: Zarejestrowani
Postów: 486
Pomógł: 101
Dołączył: 27.06.2010

Ostrzeżenie: (0%)
-----


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 />

Ten post edytował gorden 22.10.2011, 11:20:26
Go to the top of the page
+Quote Post
lukasz_test
post 25.10.2011, 18:56:19
Post #19





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Elber
post 25.10.2011, 23:39:03
Post #20





Grupa: Zarejestrowani
Postów: 381
Pomógł: 12
Dołączył: 9.07.2007

Ostrzeżenie: (0%)
-----


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?

Ten post edytował Elber 25.10.2011, 23:39:28


--------------------
GG: 564555
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.05.2025 - 08:37