Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [GPW] Jak pobrać wybrane dane z pliku txt ?
Forum PHP.pl > Forum > PHP
free
Na stronie parkiet.pl jest link do danych z sesji giełdy.
Chciałbym z tego całego tekstu wybrac np dla wartosci :
WIG,20070517,59764.2,60247.23,59218.2,59350.3,56311389
jedynie 59764.2
Jakich funkcji użyć ?
skowron-line
google.pl->wyrazenia regularne php
free
Wiem co to sa wyrazenia regularne. Nie wiem natomiast z jakiej funkcji skorzystac by wydobyc dane ze srodka txt : WIG,20070517,59764.2,60247.23,59218.2,59350.3,56311389
kubarek
użyj funkcji preg_match_all
free
Mozesz mała podpowiedź ?
dr_bonzo
free: skoro znasz wyrazenia regularne i masz manuala do php i znasz nazwe funkcji (preg_match tez moze byc) to juz wiesz jak to masz zrobic.

Mozesz tez uzyc explode().
webdice
Cytat(free @ 18.05.2007, 15:32:15 ) *
Wiem co to sa wyrazenia regularne. Nie wiem natomiast z jakiej funkcji skorzystac by wydobyc dane ze srodka txt : WIG,20070517,59764.2,60247.23,59218.2,59350.3,56311389


file_get_contents" title="Zobacz w manualu PHP" target="_manual plus jak napisał ~dr_bonzo explode" title="Zobacz w manualu PHP" target="_manual, ewentualnie przyda Ci się jeszcze pętla.
free
Funkcja file_get_contents okazała sie bardzo przydatna. Nie wiem jak optymalnie z tego ciagu znakow wydobyc interesującą mnie linijke:

WIG,20070517,59764.2,60247.23,59218.2,59350.3,56311389

jak to bede mial ją już w zmiennej to sobie poradzę bo użyję:

  1. <?php
  2. $data = "WIG,20070517,59764.2,60247.23,59218.2,59350.3,56311389";
  3. list($nazwa, $wolumen, $aktual, $max, $min, $ostatnio, $ilosc) = explode(",", $data);
  4. echo $nazwa; // otrzymam WIG
  5. echo $aktual; // otryzmam 59764.2
  6. ?>

A tak sie zastanawiam jak najoptymalniej z tego ciągu znaków wydobyć te linijkę
webdice
a jakie inne dane masz w tym pliku?
free
Podałem link
A oto część danych z tego pliku :
Kod
...
LDS,20070518,1.17,1.17,1.17,1.17,4353
WIG,20070518,59457.59,59952.26,59409.38,59952.26,60590951
WIG20,20070518,3490.02,3516.38,3477.79,3515.77,666856
mWIG40,20070518,5116.26,5194.57,5115.34,5194.57,8198479
...

I chce wydobyć np linijkę WIG,20070518,59457.59,59952.26,59409.38,59952.26,60590951
Ludvik
Otworzyć plik funkcją file" title="Zobacz w manualu PHP" target="_manual. Jeżeli chcesz wyciągnąć WIG, to po prostu sprawdzasz po kolei, która linijka zaczyna się od "WIG,". Można to zrobić funkcją substr" title="Zobacz w manualu PHP" target="_manual na przykład... Jeżeli nie chcesz całego pliku do tablicy pchać, to musisz sobie utworzyć bufor, do którego po kolei będziesz zczytywał całe linijki...
free
substr tu nie pomoze, bo ten plik jest zmienny co 15 minut sie zmienia i linijki tez sie zmienia.
ale stala jest nazwa poszczegolnych np WIG itp
Wiec tu trzeba by raczej poprzez wyrazenia regualrne i z tym mam teraz najwiekszy problem.
Ludvik
W tym rzecz, że pomoże... Otwierasz plik funkcją file" title="Zobacz w manualu PHP" target="_manual, która zwraca tablicę, w której dostajesz plik rozłożony na linie. Następnie po kolei sprawdzasz każdą linijkę czy zawiera na początku "WIG,", jeżeli tak, to rozkładasz ją i masz wynik jaki chciałeś.

  1. <?php
  2.  
  3. $lines = file('http://www.parkiet.com/dane/danesesji/akcje.prn');
  4.  
  5. $line = '';
  6.  
  7. for ($i = 0, $count = count($lines); $i < $count; $i++) {
  8. if (substr($lines[$i], 0, 4) == 'WIG,') {
  9. $line = $lines[$i];
  10. break;
  11. }
  12. }
  13.  
  14. var_dump(explode(',', $line));
  15.  
  16. ?>
free
Rzeczywiście działa. Jak używam funkcji file_get_contents zamiast file to nie działa /czemu tak sie dzieje?/

Nie rozumiem za bardzo lini nr 5 -- czemu deklarujemy zmienna z pustym polem $line = ''; Dlatego ze w naszym przypadku linie sa tak od siebie oddzielone ?

W lini 8 na sztywno definiowane jest ilosc liter na 4 wraz z przecinkiem :
  1. <?php
  2. if (substr($lines[$i], 0, 4) == 'WIG,') {
  3. ?>

czy mozna by to jakos obejsc, by skrypt nie byl zalezny od tej liczby tylko automatycznie pobieral całą linię, gdzie jest słowo w naszym przypdaku WIG ? Chcialbym to rozwinac do dynamicznego wyswietlania wartosci i zamiast WIG skrypt bedzie pobieral nazwe ze zmiennej, ale do tego potrtzebne jest obejscie sztywno deklarowanej wartości substr($lines[$i], 0, 4)
Ludvik
1. Bo funkcja file zwraca tablicę, a fil_get_contents treść pliku w postaci stringa...
2. Deklarujemy pustą zmienną $line, żeby nie tworzyć jej w pętli - inny zakres...
3. To tylko sprawdzenie od czego zaczyna się ta linijka, żeby wybrać odpowiednią. A są trzy litery i przecinek, żeby nie pobrać przypadkiem WIG20...

Musisz mieć zapisane nazwy indeksów gdzieś, to po pierwsze. A z resztą, najlepiej popatrzeć na kod...
  1. <?php
  2.  
  3. $lines = file('http://www.parkiet.com/dane/danesesji/akcje.prn');
  4.  
  5. $index = 'WIG20';
  6. $line = '';
  7.  
  8. $start = $index . ','. // Dodajemy przecinek, żeby dokonać poprawnego sprawdzenia...
  9.  
  10. for ($i = 0, $count = count($lines); $i < $count; $i++) {
  11. if (substr($lines[$i], 0, strlen($start)) == $start) {
  12. $line = $lines[$i];
  13. break;
  14. }
  15. }
  16.  
  17. var_dump(explode(',', $line));
  18.  
  19. ?>


Regexem też można, tylko po co...
webdice
  1. <?php
  2. preg_match ('#WIG,([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^(n)]+)#', file_get_contents ('http://www.parkiet.com/dane/danesesji/akcje.prn'), $result);
  3.  
  4. print_r ($result);
  5. ?>
free
Ludvik dziekuje za wytlumaczenie. W 8 lini jest błąd poprawilem na $start = "$index.','.";
Po poprawieniu skrypt nie wyswietla danych wiec cos jest nie tak.

Webdicepl ciekawe rozwiazanei z wyrazeniem regularnym. Tyl;ko ze dane pokazuje w postaci tablicy Array. Gdy dodaje kod :
  1. <?php
  2. list($nazwa, $wolumen, $aktual, $max, $min, $ostatnio, $ilosc) = explode(",", $line);
  3. echo "<b>$nazwa </b><br />" ; 
  4. echo "Wolumen: $wolumen <br />";
  5. ?>

to jest niepoprawnie. gdy daje funkcje file zamiast file_get_contents pojawia sie blad-komunikat ze musi byc string w wartosci funkcji preg_match.
webdice
Nie mam teraz dostępu do PHP, ale robisz to mniej więcej tak:

  1. <?php
  2. $nazwa  = $result[0];
  3. $wolumen = $result[1];
  4. $aktual  = $result[2];
  5. $max = $result[3];
  6. //...
  7. ?>


EDIT: zobacz jak jest zbudowana tablica i przypisz wartości do zmienny podobnie jak podałem wyżej.
Ludvik
Racja, w ósmej linii jest błąd, ale powinien być poprawiony na:
  1. <?php
  2. $start = $index . ',';
  3. ?>
free
Ludvik poprawiłem te linijke tak jak napisales i jest OK.
Webdicel czy twoja funkcje preg_match mozna zastapic inna by poznij uzyc funkcji file zamiast zwracajacej stringa file_get_contents ?
w dotychczasowym kodzie jest jakiś błąd logiczny bo otrzymuję zły wynik [0] w postaci tablicy :
Array ( [0] => WIG,20070521,60286.67,61050.47,60286.67,61050.47,61496700 [1] => 20070521 [2]
a przeciez [1] =>powinien byc WIG, [2]=>20070521
tymczasem do [1] przypisdane jest wszystko.
chyba w wyrazeniu regularnym jest cos nie tak.
webdice
~free przy użyciu preg_match" title="Zobacz w manualu PHP" target="_manual nie możesz użyć funkcji file" title="Zobacz w manualu PHP" target="_manual dlatego że zwraca ona tablice, a w tym wypadku funkcja preg_match" title="Zobacz w manualu PHP" target="_manual nie zadziała.

W funkcji którą podałem nie ma błędu, pierwszy index (0) tablicy zwróci cały szukany ciąg, nazwa zawsze będzie WIG , dlatego że musiałem dać jakiś punkt zaczepienia od którego ma szukać ta funkcja.

  1. <?php
  2. preg_match ('#WIG,([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^(n)]+)#', file_get_contents ('http://www.parkiet.com/dane/danesesji/akcje.prn'), $result);
  3.  
  4. $nazwa = 'WIG';
  5. $wolumen = $result[1];
  6. $aktual = $result[2];
  7. $max = $result[3];
  8. $min = $result[4];
  9. $ostatnio = $result[5];
  10. $ilosc = $result[6];
  11. ?>


EDIT: Ty chcesz wyciągnąć tylko wartości dla WIG, czy wszystkie?
kubarek
tak ma właśnie być
indeks zerowy zawiera cały znaleziony ciąg pasujący do wzorca, kolejne indeksy to kolejne podciągi
np:
  1. <?php
  2. $str='a,b,c,d';
  3. preg_match_all('#a,([^,]+),([^,]+),([^,]+)#', $str, $matches);
  4. ?>

w $matches[0] będzie 'a,b,c,d', w $matches[1] - 'b', $matches[2] - 'c' i $matches[3] - 'd'
free
aha ok.
a czy mozna zamiast na sztywno WIG dac tam odnosnik do zmiennej ?
Sprobowalem tak ale jest zle:
  1. <?php
  2. $akcja=WIG20;
  3. preg_match ('#$akcja,([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^(n)]+)#', file_get_contents ('http://www.parkiet.com/dane/danesesji/akcje.prn'), $result);
  4.  
  5. explode(",", $result); //DODAŁEM tę funkcję - czy jest potrzebna ?
  6. $nazwa= $result[0];
  7. $max=$result[3];
  8.  
  9. echo "NAZWA: $nazwa <br> MAX: $max"; 
  10. ?>


trzebaby z #$akcja cos pokombinowac, probowalem #.$akcja lub # $akcja lub #'$akcja' i nie pomogło.
webdice
  1. <?php
  2. preg_match ('#' . $akcja . ',([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^(n)]+)#', file_get_contents ('http://www.parkiet.com/dane/danesesji/akcje.prn'), $result);
  3. ?>


EDIT: ucina slasha przed n w ([^(\n)]+)

Eplode Ci tam już nic nie da, zrób tak jak napisałem wyżej.
free
Dziala ok, tylko po tej ostatniej zmianie jak wyswietlam element[0] to zamiast linijki nalezacej do WIG20 wyswietla tez pozostale:

WIG20,20070521,3529.65,3567.66,3523.66,3567.18,1022950 mWIG40,20070521,5254.21,5344.88,5238.03,5344.88,11883304 TECHWIG,20070521,1297.64,1303.58,1295.68,1301.5,17627166 sWIG80,20070521,18785.9,19045.07,18774.67,19030.64,13675262 WIG-TELE,20070521,1234.61,1234.61,1225.81,1225.81,5084721 WIG-SPOZ,20070521,4342.91,4352.89,4342.91,4352.89,2263569
webdice
Napisałem w pości wyżej ze ucina slasha przed n w ([^(\n)]+)
free
Ok zmienilem ([^(\n)]+) i jest ok
fullrespect
Witam serdecznie,
jestem pierwszy raz na forum, z PHP miałem troszkę do czynienia ale nadal uważam że jestem bardzo początkującym.

Mam podobny problem do rozwiązania, z tym że ja mam plik lokalny do odczytania i wydobycia z niego określonych danych, mianowicie:

Plik wygląda tak:

  1. ACSS00001110511
  2. HFFXA050
  3. HFDTE110511
  4. HFPLTPILOT:Imie Nazwisko
  5. HFGTYGLIDERTYPE:ASW27
  6. HFGIDGLIDERID:CHARON
  7. HFDTM100DATUM:WGS-1984
  8. HFGPSGPS:CCSS_SOFTWARE_GPS
  9. HFFTYFRTYPE:CCSS
  10. HFRFWFIRMWAREVERSION:1.0
  11. HFRHWHARDWAREVERSION:0.0
  12. HFCIDCOMPETITIONID:BAD
  13. HFCCLCOMPETITIONCLASS:15-meter
  14. C110511130414110511000004
  15. C4903978N01857012EMartin
  16. C4904655N01855072EMARTIN
  17. C4828200N01814450EVELKY TRIBEC
  18. C4826965N01854707EBAN STIAVNICA
  19. C4840024N01806066EDUCHONKA
  20. C4903978N01857012EMartin
  21. C4903978N01857012EMartin
  22. LCONFPL[Version]
  23. LCONFPLCondor version=1140
  24. LCONFPL[Task]
  25. LCONFPLLandscape=Czechoslovakia
  26. LCONFPLCount=6
  27. LCONFPLTPName0=Martin
  28. LCONFPLTPPosX0=104637.390625
  29. LCONFPLTPPosY0=83746.53125
  30. LCONFPLTPPosZ0=410


dane które mnie interesują to:
Imie Nazwisko
ASW27
15-meter
Czechoslovakia
1140

Nie za bardzo kumam jak odfiltrować te dane za pomocą preg_match();
Zrobiłem jakąś namiastkę żeby wyszukać pierwszą daną czyli Imie i Nazwisko.
Ale problem z tym że nie mam pojęcia co te krzaki oznaczają które występują po naszym $pattern.


Kod:

  1. // składnia funkcji
  2. // int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
  3.  
  4. $wyznacznik = "HFPLTPILOT:";
  5. $plik = file_get_contents('test.igc');
  6.  
  7. if (preg_match('#'.$wyznacznik.', ,([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^(\n)]+)#', $plik, $dane)) {
  8.  
  9. print "wyraz \"$wyznacznik\" znaleziono";
  10. print "<br>dane za wyznacznikiem: \"$dane[0]\"";
  11. } else echo "Błąd";


Będę bardzo wdzięczny za naprowadzenie mnie jak to ugryźć.

Pozdrawiam
Tomek
amii
Tutaj masz regexpa, przetestowalem mi działalo:
  1. #HFPLTPILOT:(.*)\s+HFGTYGLIDERTYPE:(.*)\s+HFCCLCOMPETITIONCLASS:(.*)\s+LCONFPLCondor version=(.*)\s+LCONFPLLandscape=(.*)\s+#isU

Przy okazji do testów wyrażeń polecam tego typu strony:
http://www.functions-online.com/preg_match.html
fullrespect
Dzięki za wyrażenie smile.gif
Prawie działa smile.gif
ale u mnie wygląda to tak:

  1. wyraz "HFPLTPILOT:" znaleziono
  2. "Imie Nazwisko"
  3.  
  4. "ASW27 HFGIDGLIDERID:CHARON HFDTM100DATUM:WGS-1984 HFGPSGPS:CCSS_SOFTWARE_GPS HFFTYFRTYPE:CCSS HFRFWFIRMWAREVERSION:1.0 HFRHWHARDWAREVERSION:0.0 HFCIDCOMPETITIONID:BAD"
  5.  
  6. "15-meter C110511130414110511000004 C4903978N01857012EMartin C4904655N01855072EMARTIN C4828200N01814450EVELKY TRIBEC C4826965N01854707EBAN STIAVNICA C4840024N01806066EDUCHONKA C4903978N01857012EMartin C4903978N01857012EMartin LCONFPL[Version]"
  7.  
  8. "1140 LCONFPL[Task]"


A gdzie znaleźć objaśnienia wszystkich wyrażeń regularnych, szukam w sieci to tylko znajduję kilkanascie i na przykład nie wiem co oznacza "#" questionmark.gif


EDIT.
Zrobiłem tak:

  1. $plik = file_get_contents('test.igc');
  2.  
  3. preg_match('#HFPLTPILOT:(.*)\s\s#isU', $plik, $pilot);
  4. preg_match('#HFCIDCOMPETITIONID:(.*)\s#isU', $plik, $cn);
  5. preg_match('#HFGTYGLIDERTYPE:(.*)\s#isU', $plik, $szybowiec);
  6. preg_match('#HFCCLCOMPETITIONCLASS:(.*)\s+#isU', $plik, $klasa);
  7. preg_match('#LCONFPLCondor version=(.*)\s+#isU', $plik, $wersja);
  8. preg_match('#LCONFPLLandscape=(.*)\s+#isU', $plik, $sceneria);
  9. preg_match('#LCONFlightInfoStartTime=(.*)\s+#isU', $plik, $starttime);
  10. preg_match('#LCONFlightInfoFlightTime=(.*)\s+#isU', $plik, $flighttime);
  11. preg_match('#LCONFlightInfoTaskStart=(.*)\s+#isU', $plik, $taskstart);
  12. preg_match('#LCONFlightInfoTaskTime=(.*)\s+#isU', $plik, $tasktime);
  13. preg_match('#LCONFlightInfoPlayerStatus=(.*)\s+#isU', $plik, $playerstatus);
  14. preg_match('#LCONFlightInfoDistanceFlown=(.*)\s+#isU', $plik, $distanceflown);
  15. preg_match('#LCONFlightInfoAverageSpeed=(.*)\s+#isU', $plik, $averagespeed);
  16. preg_match('#LCONFlightInfoPenaltyPoints=(.*)\s+#isU', $plik, $penaltypoints);
  17.  
  18. print "<br>\"$pilot[1]\"<br>";
  19. print "<br>\"$cn[1]\"<br>";
  20. print "<br>\"$szybowiec[1]\"<br>";
  21. print "<br>\"$klasa[1]\"<br>";
  22. print "<br>\"$wersja[1]\"<br>";
  23. print "<br>\"$sceneria[1]\"<br>";
  24. print "<br>\"$starttime[1]\"<br>";
  25. print "<br>\"$flighttime[1]\"<br>";
  26. print "<br>\"$taskstart[1]\"<br>";
  27. print "<br>\"$tasktime[1]\"<br>";
  28. print "<br>\"$playerstatus[1]\"<br>";
  29. print "<br>\"$distanceflown[1]\"<br>";
  30. print "<br>\"$averagespeed[1]\"<br>";
  31. print "<br>\"$penaltypoints[1]\"<br>";


i efekt mam taki:
  1. "Imie Nazwisko"
  2. "BAD"
  3. "ASW27"
  4. "15-meter"
  5. "1140"
  6. "Czechoslovakia"
  7. "13:00:00"
  8. "04:00:41"
  9. "13:53:44"
  10. "02:37:34"
  11. "Finished"
  12. "274.48"
  13. "104.52"
  14. "0.0"


plik test.igc ma duzo wiecej danych niż pokazałem wcześniej.

Ale na dal nie kumam znaczenia wszystkich wzorców tongue.gif

Dzieki za naprowadzanie i czekam na jeszcze smile.gif

Ok Panowie,
a jak wyciągnąć całą ostatnią linijkę która za każdym razem (od róznych userów) jest inna i unikalna.

plik wyglada mniej więcej tak:

  1. ACSS00001211112 //Ta linia by sie przydała, to jest pierwsza linia w pliku
  2. ...
  3. ...
  4. ...
  5. ...
  6. LCONFlightInfoTaskStart=13:38:28
  7. LCONFlightInfoTaskTime=02:01:27
  8. LCONFlightInfoPlayerStatus=Finished
  9. LCONFlightInfoDistanceFlown=213.03 km
  10. LCONFlightInfoAverageSpeed=105.23 km/h
  11. LCONFlightInfoPenaltyPoints=0.0
  12. LCONFlightInfoGhostCount=0
  13. GNXNYNLLVRS27HD27BU6Y8HRX2OATP72O9DOHVM1XQ7EXEKUVXV8BSDR5P5AX4ELF //Interesuje mnie też cała ta linijka, jest to ostatnia linia z pliku


Wielkie dzięki za podpowiedź.
piotrala
Cytat(fullrespect @ 25.05.2012, 10:07:24 ) *
A gdzie znaleźć objaśnienia wszystkich wyrażeń regularnych, szukam w sieci to tylko znajduję kilkanascie i na przykład nie wiem co oznacza "#" questionmark.gif

Znaczek # jest w tym przypadku oznaczeniem początku i końca wyrażenia regularnego. Zwróć uwagę, że po zakończeniu wyrażenia regularnego znajduje się jeszcze kilka dodatkowych literek - to są flagi, na przykład "i" oznacza ignorowanie wielkości liter. Zamiast hasha często widuje się znak |, o ile nie występuje on w środku wyrażenia.

A odnośnie problemu kolegi free to podejrzewam, że zamiast wyrażeń regularnych czy explode() lepiej sprawdziłaby się funkcja fgetcsv(). Służy ona do tego, aby pobrać kolejny wiersz z pliku i od razu przetworzyć go na tablicę, dzieląc wiersz w miejscu przecinków. Z tego co widzę, plik z Parkietu jest właśnie w formacie CSV (ang. Comma-Separated Values).
http://pl.wikipedia.org/wiki/CSV_(format_pliku)
fullrespect
Cytat(piotrala @ 25.05.2012, 15:01:50 ) *
(...) na przykład "i" oznacza ignorowanie wielkości liter. (...)


Super dzieki za podpowiedź - skąd się tego nauczyć ? Gdzie znajdę objaśnienia do wszystkich znaków ?
piotrala
Cytat(fullrespect @ 25.05.2012, 17:52:39 ) *
Super dzieki za podpowiedź - skąd się tego nauczyć ? Gdzie znajdę objaśnienia do wszystkich znaków ?

Hmm... sam szukam dobrej ściągawki z regexów, najlepiej w formie książeczki.

Do tej pory korzystałem z tego:
http://pl.wikipedia.org/wiki/Wyrażenie_regularne
http://pl.wikibooks.org/wiki/PHP/Podstawy_...żeń_regularnych
http://wyrazeniaregularne.wordpress.com/

Chyba najambitniejszą rzeczą, jaką robiłem przy użyciu regexów, było parsowanie rozkładu PKP i przerabianie go na formę strawną do wydruku w gazecie wink.gif
fullrespect
Chyba po woli łapię o co tu biega z wyrażeniami regularnymi smile.gif
przy okazji znalazlem super tester: http://www.solmetra.com/scripts/regex/index.php

Kolejnym etapem będzie wczytanie danych z pliku do bazy MySQL i proste operacje matematyczne na nich (no może nie takie bardzo proste).
Niebawem wstawie na serwerek co wymodziłem a może utworzyć nowy wątek z moim małym projektem ? Bo zapewne jeszcze nie jedno pytanko bedę chciał zadać specjalistom.

Właśnie, jak zamienić dane tekstowe na liczbowe ? bo wszystko co pobieram z tego pliku jest pobierane jako text, czy mozna dokonac konwersji w locie aby do bazy trafiło już w poprawnym formacie ?

Pozdrawiam
i jeszcze raz dziękuję za fachową pomoc!
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.