Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Import określonych danych z pliku *.txt
Forum PHP.pl > Forum > Przedszkole
websterPL
Witam,
chciałbym pobrać z pliku http://nbp.pl/Kursy/xml/dir.txt nazwy zaczynające się od litery "a" (są to nazwy plików *.xml - kursy średnie) i wyświetlić te wszystkie nazwy (z ostatnich 30 dni). Ostatni wpis w pliku *txt to najnowszy plik (dzisiejszy). I wykombinowałem taki kod:

  1. $subject = file_get_contents('http://nbp.pl/Kursy/xml/dir.txt');
  2. $pattern = '/^a\d{3}z\d{6}/';
  3. preg_match_all($pattern, $subject, $matches);
  4. print_r($matches);


W wyniku otrzymuję niestety tylko 1 rekord (do tego najstarszy). Czy ktoś wie jak za to się zabrać ?
golaod
  1. $file = file_get_contents( 'http://nbp.pl/Kursy/xml/dir.txt' );
  2.  
  3. preg_match_all( '/(^a.+)/mi', $file, $pregs );
  4. print_r( $pregs );
Wicepsik
Usuń ^ z początku.
erix
Znaczy, nie usuń, a wyciągnij przed nawias. ;]
websterPL
Fajnie, działa - pobiera wszystkie rekordy zaczynąjące się od litery "a" !
Nie wiem dlaczego, ale wynik kodu wyświetla się 3 razy worriedsmiley.gif

  1.  
  2. $file = file_get_contents( 'http://nbp.pl/Kursy/xml/dir.txt' );
  3. preg_match_all( '/^(a.+)/mi', $file, $pregs );
  4. print_r( $pregs );
  5.  


Teraz pytanie jak zrobić aby zaczął zczytywać plik *.txt od końca i np tylko 30 wartości ?

kriszna
  1. for($i=count($pregs)-1; $i>=count($pregs)-31, $i--){
  2. echo $pregs[$i];
  3. }

Daj tą pętle zamiast var_dump(). Może coś nie działać, bo nie testowałem, ale ogólny zarys jest.
websterPL
Dzięki za błyskawiczną odpowiedź. W pętli for zapomniałeś o średniku i tak kod:

  1.  
  2. $file = file_get_contents( 'http://nbp.pl/Kursy/xml/dir.txt' );
  3. preg_match_all( '/^(a.+)/mi', $file, $pregs );
  4.  
  5. for ($i=count($pregs)-1; $i>=count($pregs)-31; $i--){
  6. echo $pregs[$i];
  7.  


daje w wyniku: "ArrayArray" i nic więcej sadsmiley02.gif
Kofel
Zamiast echo daj var_dump i zobacz jak wygląda tablica
websterPL
wynik wykorzystania var_dump (kilka rekordów od końca):

(...)
"a151z090805 " [1921]=> string(12) "a152z090806 " [1922]=> string(12) "a153z090807 " [1923]=> string(12) "a154z090810 " [1924]=> string(12) "a155z090811 " } NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
dr_bonzo
w $matches[1][$i] bedziesz mial kolejne nazwy plikow
1 -- pierwszy nawias (...) uzyty w pregu
websterPL
ok, po użyciu kodu:

  1.  
  2. $file = file_get_contents( 'http://nbp.pl/Kursy/xml/dir.txt' );
  3. preg_match_all( '/^(a.+)/mi', $file, $pregs );
  4.  
  5. for ($i=count($pregs)-1; $i>=count($pregs)-31; $i--){
  6. echo $pregs[1][$i];
  7. }
  8.  


otrzymuje dokładnie:

a002z020103
a001z020102

czyli drugi i pierwszy wpis z literą "a" z pliku *.txt.

Pytanie jak wyciągnąć ostatnie wpisy z literą "a" czyli przykładowo:

a151z090805
a152z090806
a153z090807
a154z090810
a155z090811
dr_bonzo
count( $pregs[1] )
a nie
count( $pregs )

przeciez zagladales do tabeli print_r()'em
websterPL
faktycznie ... dzięki wielkie wszystko teraz działa poprawnie exclamation.gif

Ok już mam wszystkie adresy *.xml ale mam problem z pobraniem danych.

  1.  
  2. $file = file_get_contents( 'http://nbp.pl/Kursy/xml/dir.txt' );
  3. preg_match_all('/^(a.+)/mi', $file, $pregs );
  4.  
  5. for ($i=count($pregs[1])-1; $i>=count($pregs[1])-31; $i--){
  6.  
  7. $plik = $pregs[1][$i];
  8. $przetworzony = substr($plik, 0, -1);
  9. $koncowy = $przetworzony.'.xml';
  10. $sciezka_xml = 'http://nbp.pl/Kursy/xml/'.$koncowy;
  11.  
  12. $get_xml = file_get_contents($sciezka_xml);
  13. $tresc_xml = new SimpleXMLElement($get_xml);
  14. foreach ($tresc_xml->rekord as $rekord) {
  15.  
  16. echo 'USD: '.$rekord->kod_waluty.$rekord->kurs_sredni.'<br /><br />';
  17.  
  18. }
  19.  
  20. }
  21.  


Powyższy kod w zamyśle ma pobierać dane np z pliku http://nbp.pl/Kursy/xml/a156z090812.xml (zmienna $sciezka_xml) ale nic się nie wyświetla. Co jest nie tak ?
dr_bonzo
A skad wyczraowales taga <rekord> w XMLu z kursem??
websterPL
A faktycznie ! smile.gif Teraz śmiga aż miło.

  1.  
  2. $file = file_get_contents( 'http://nbp.pl/Kursy/xml/dir.txt' );
  3. preg_match_all('/^(a.+)/mi', $file, $pregs );
  4.  
  5. for ($i=count($pregs[1])-1; $i>=count($pregs[1])-31; $i--){
  6.  
  7. $plik = $pregs[1][$i];
  8. $przetworzony = substr($plik, 0, -1);
  9. $koncowy = $przetworzony.'.xml';
  10. $sciezka_xml = 'http://nbp.pl/Kursy/xml/'.$koncowy;
  11.  
  12. echo '<br />'.$sciezka_xml.'<br />';
  13.  
  14. $get_xml = file_get_contents($sciezka_xml);
  15. $tresc_xml = new SimpleXMLElement($get_xml);
  16. foreach ($tresc_xml->pozycja as $pozycja) {
  17.  
  18. if ($pozycja->kod_waluty == 'USD')
  19. echo 'USD: '.$pozycja->kod_waluty.$pozycja->kurs_sredni.'<br />';
  20.  
  21. }
  22. }
  23.  


Ciągnąc ten wątek dalej - jak wyciągnąć datę z pliku *.xml ( http://nbp.pl/Kursy/xml/a156z090812.xml ) ?
dr_bonzo
$data = (string)$tresc_xml->data_publikacji;
websterPL
Wielkie dzięki, teraz to już wszystko jest ok. Super !

I znowu mały problem. Jestem już przy końcu budowania wykresu. Ale pytanie dotyczy innej kwestii.
  1.  
  2. $ydata = array(2.2413,2.5413,2.3413, 2.7413);
  3.  


Chcę w $ydata powrzucać po kolei (w pętli) kursy średnie walut ($pozycja->kurs_sredni), jak to zrobić ?
Fifi209
  1. $ydata[] = $kurs;

tak w skrócie.
websterPL
Tak też miałem zrobione

  1.  
  2. $ydata[] = $pozycja->kurs_sredni;
  3.  


ale w wyniku otrzymuje: Array ( [0] => SimpleXMLElement Object ( [0] => 2,9795 ) i tak dalej ...
chciałbym wyciągnąć te dane aby otrzymać coś co łatwo wywołać czyli: array(2.2413,2.5413,2.3413, 2.7413);
erix
A o czym ~dr_bonzo pisał? Bądź konsekwentny...
websterPL
no tak ale dlaczego ten kod działa:

  1. $kurs_linia = $pozycja->kurs_sredni;
  2. $ydata = array(2.1456);


a ten już nie ?

  1. $kurs_linia = $pozycja->kurs_sredni; // "2.1456"
  2. $ydata = array($kurs_linia );
Fifi209
rzutuj na float smile.gif
websterPL
Ja już nie wiem jak to zrobić, 3 godziny i nic (ciągle jakieś błędy).

  1. foreach ($tresc_xml->pozycja as $pozycja) {
  2. $kurs_linia[] = settype($pozycja->kurs_sredni, "float");
  3. }
  4.  
  5. $ydata = array($kurs_linia[0], $kurs_linia[1]);


Przy takim kodzie mam komunikat (jpgraph):
Cannot use auto scaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).

sciana.gif
dr_bonzo
Porownaj
  1. $kurs_linia = $pozycja->kurs_sredni;
  2. var_dump( $kurs_linia );


  1. $kurs_linia = (float)$pozycja->kurs_sredni;
  2. var_dump( $kurs_linia );
websterPL
Porównałem i nie podoba mi się, że float zaokrągla mi liczbę. W przypadku kursów zamiana 1.5 na 1 jest tragiczna.
  1. $float = (float) '1,5'; // float(1)


Problem w tym, że zmienna "$pozycja->kurs_sredni" ma przecinek (,) a dane w tablicy muszą być zapisane z kropką (.)
erix
Najpierw rzutuj na string, zamieniaj przecinek na kropkę, dopiero potem na float.
websterPL
czyli kod jest taki:

  1. $liczba = str_replace(",",".",$pozycja->kurs_sredni);
  2. $float = (float)$liczba;
  3. $ydata[] = $float;


i teraz wszystko działa pięknie, dzięki za "wędke" biggrin.gif
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.