Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam! mam taki problem! Zastanawiam się nad skryptem który wyciągnie dane z pliku po danym znaku.
Podam przykładowy plik:
plik.txt
1,2,3,test,imie,nazwisko,tu_są_dane_które_chcę_wyciągnąć
1,2,3,test2,imie2,nazwisko2,tu_są_dane_które_chcę_wyciągnąć2
1,2,3,test32,imie32,nazwisko32,tu_są_dane_które_chcę_wyciągnąć3
No i sprawa wygląda tak że dane które chciałbym wyciągnąć z każdej lini znajdują w innych miejscach,
jedne dalej drugie bliżej.
Gdyby wszystko było równo ( czyli dane które chce wyciągnąć znajdowały się w tym samym miejscu w każdej
lini to użył bym czyegoś takiego:
<?
$fd1 = fopen("/var/www/apache2-default/plik.txt","rw");
$wiersz1 = 0;
while(!feof($fd1))
{
$dane1[$wiersz1] = substr(fgets($fd1,1024),24,150);
$wiersz1++;
}
echo $dane1[1];
echo $dane1[2];
echo $dane1[3];
?>
Czyli jak widać z każdej lini ciągnął bym dane od 24 znaku w sumie 150 znaków.
Ale tu te dane sie przesuwają także myślałem o skrypcie który wyciągnie mi dane
z każdej lini np po szóstym przecinku np 150 znaków. I to by pasowało.
Wie ktos może jak przerobić ten skrypt albo czego użyć aby zrobić taki skrypt??
Offline
No ok! ale ja chciałbym żeby wyświetlały mi się tylko dane po 6 przecinku. Niebardzo kumam jak tego użyć?
moge zrobić coś w stylu jak ten przykład ze strony:
<?
// Example 1
$pizza = "piece1,piece2,piece3,piece4,piece5,piece6";
$pieces = explode(",", $pizza);
echo $pieces[4]; // piece5
?>
i wyświetli mi się piece5 można by to było nawiązac do mojego skryptu. Ale on tu wyciągnie tylko jeden wyraz
a nie np po 4 przecinku do końca.
Ostatnio edytowany przez debbie (2008-08-22 10:34:29)
Offline
Napisz sobie funkcję która zacznie wczytywać znaki, licząc przy okazji napotkane przecinki. Niech wszystkie znaki aż do wybranego przecinka ignoruje, a resztę dodaje do jakiegoś stringa aż do napotkania kolejnego przecinka lub znaku końca wiersza lub znaku końca pliku. Myślę że łatwe do napisania. Jak bym znał php to bym Ci to trzasnął, ale dopiero kupiłem sobie o nim książkę i nie zdążyłem jej przeczytać.
Offline
No właśnie o to chodzi! Tylko jak to napisać???
Offline
<?php // poczatek Twoj, wiec nie tlumacze $fd1 = fopen("/var/www/apache2-default/plik.txt","rw"); $wiersz1 = 0; while(!feof($fd1)){ // odczytujemy kolejne linie z pliku jednoczesnie dzielac dane oddzielone przecinkami i wrzucamy do tablicy $linia1 = explode(",",fgets($fd1,1024)); // zapisujemy interesującą nas wartość z linii (tablicy) utworzonej wyżej (php tablice indexuje od 0) $dane1[$wiersz] = $linia[5]; $wiersz1++; } // na koniec zwalniamy tablice linii (zawiera dane z ostatniej odczytanej linii) unset $linia1; print_r($dane1); ?>
Ostatnio edytowany przez grzegorz.85 (2008-08-22 11:09:49)
Offline
ja bym wywalil z fgets 1024 jeszcze i dodał limit , w explode jako 3 parametr.
Ostatnio edytowany przez milyges (2008-08-22 11:17:34)
Offline
jezeli dobrze rozumiem problem to zamiast:
echo $pieces[4];
daj:
for ($i=4; $i<count($pieces); $i++) echo $pieces[$i];
PS pisane bez testow wiec moze byc jakas literowka
Ostatnio edytowany przez bercik (2008-08-22 18:21:17)
Offline
debbie napisał(-a):
Ale on tu wyciągnie tylko jeden wyraz a nie np po 4 przecinku do końca.
Znaczy Twój string wygląda tak:
1,2,3,test,imie,nazwisko,tu_są_dane_które_chcę_wyciągnąć
czy tak:
1,2,3,test,imie,nazwisko,tu_są_dane_które_chcę_wyciągnąć,tutaj są jakieś, inne dane, które trzeba wyciągnąć, także oddzielane przecinkami
?
Explode, o ile mi wiadomo, dzieli string na tablicę korzystając z określonego delimitera. Więc po 6 przecinku nie wytnie jednego wyrazu, chyba że pomiędzy 6. a 7. przecinkiem znajduje się tylko jeden wyraz — wytnie wszystko co znajduje się pomiędzy 6. a 7. przecinkiem.
Jeżeli chcesz wyciąć coś od piątego przecinka do końca, to masz... problem, bo widzę że PHP nie oferuje żadnej funkcji od tego. Ale napisanie tego nie powinno być szczególnie trudne. Możesz skopiować to rozwiązanie lub napisać własne (pseudokod):
podziel string na tablicę (explode) dla każdego elementu tablicy od X do końca: $string.=element_tablicy[i] echo $string
Offline
Minio napisał(-a):
Jeżeli chcesz wyciąć coś od piątego przecinka do końca, to masz... problem, bo widzę że PHP nie oferuje żadnej funkcji od tego.
Ehh. Wkleję może przykład z manuala.
<?php $row = 1; $handle = fopen("test.csv", "r"); while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $num = count($data); echo "<p> $num fields in line $row: <br /></p>\n"; $row++; for ($c=0; $c < $num; $c++) { echo $data[$c] . "<br />\n"; } } fclose($handle); ?>
Offline
<?php // poczatek Twoj, wiec nie tlumacze $fd1 = fopen("/var/www/apache2-default/plik.txt","rw"); $wiersz1 = 0; while(!feof($fd1)){ // odczytujemy kolejne linie z pliku jednoczesnie dzielac dane oddzielone przecinkami i wrzucamy do tablicy $linia1 = explode(",",fgets($fd1), 7); /* MOD by milyges: bierzemy pod uwagętylko 7 pierwszych przecinków!! (moze tu 6 trzeba wstawic, do sprawdzenia) */ // zapisujemy interesującą nas wartość z linii (tablicy) utworzonej wyżej (php tablice indexuje od 0) $dane1[$wiersz] = $linia[5]; $wiersz1++; } // na koniec zwalniamy tablice linii (zawiera dane z ostatniej odczytanej linii) unset $linia1; print_r($dane1); ?>
Offline
Lekki retusz :)
<?php $row = 1; $nr_kolumny=5; //liczone od zera $handle = fopen("test.csv", "r"); while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $num = count($data); echo "<p> $num fields in line $row: <br /></p>\n"; $row++; for ($c=$nr_kolumny; $c < $num; $c++) { if ($c!=$nr_kolumny) echo ","; echo $data[$c] . "<br />\n"; } } fclose($handle); ?>
jeśli dobrze dobierzesz parametr nr_kolumny będzie działało niezależnie od ilości ja wykorzytuje takie coś do sciągania opisów z konta bankowego tam mam od 1 do 5 danych.
Offline
Tak czysto porównawczo, to samo w pythonie:
#!/usr/bin/env python from csv import reader nr_kolumny=5 f = reader(open('test.csv')) for i in f: print '<p>',i.__len__(),'fields in line',int(f.line_num),'<p>\n', print ','+i[nr_kolumny],'<br />\n', for y in i[(nr_kolumny+1):]: print y
Offline
Strony: 1