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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2008-08-22 09:54:28

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

php i wyciąganie danych z lini po znaku

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


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#2  2008-08-22 10:17:36

  milyges - inż.

milyges
inż.
Skąd: Gorlice/Kraków
Zarejestrowany: 2006-04-09
Serwis

Re: php i wyciąganie danych z lini po znaku

Offline

 

#3  2008-08-22 10:27:11

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: php i wyciąganie danych z lini po znaku

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)


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#4  2008-08-22 10:45:52

  owca - Członek DUG

owca
Członek DUG
Skąd: Szczerców
Zarejestrowany: 2007-01-30
Serwis

Re: php i wyciąganie danych z lini po znaku

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

 

#5  2008-08-22 10:52:02

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: php i wyciąganie danych z lini po znaku

No właśnie o to chodzi! Tylko jak to napisać???


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#6  2008-08-22 11:08:15

  grzegorz.85 - Członek DUG

grzegorz.85
Członek DUG
Skąd: Ostrołęka
Zarejestrowany: 2007-07-12
Serwis

Re: php i wyciąganie danych z lini po znaku

Kod:

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

 

#7  2008-08-22 11:17:22

  milyges - inż.

milyges
inż.
Skąd: Gorlice/Kraków
Zarejestrowany: 2006-04-09
Serwis

Re: php i wyciąganie danych z lini po znaku

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

 

#8  2008-08-22 13:56:54

  czadman - Bicycle repairman

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: php i wyciąganie danych z lini po znaku

fgetcsv


http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#9  2008-08-22 18:20:36

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: php i wyciąganie danych z lini po znaku

jezeli dobrze rozumiem problem to zamiast:

Kod:

echo $pieces[4];

daj:

Kod:

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)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#10  2008-08-22 19:20:11

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: php i wyciąganie danych z lini po znaku

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:

Kod:

1,2,3,test,imie,nazwisko,tu_są_dane_które_chcę_wyciągnąć

czy tak:

Kod:

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

Kod:

podziel string na tablicę (explode)
dla każdego elementu tablicy od X do końca:
   $string.=element_tablicy[i]

echo $string

Offline

 

#11  2008-08-23 00:35:17

  czadman - Bicycle repairman

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: php i wyciąganie danych z lini po znaku

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.

Kod:

<?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);
?>

http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

#12  2008-08-23 09:18:51

  milyges - inż.

milyges
inż.
Skąd: Gorlice/Kraków
Zarejestrowany: 2006-04-09
Serwis

Re: php i wyciąganie danych z lini po znaku

Kod:

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

 

#13  2008-08-23 19:48:49

  djjanek - Użytkownik

djjanek
Użytkownik
Skąd: whereis
Zarejestrowany: 2007-11-15
Serwis

Re: php i wyciąganie danych z lini po znaku

Lekki retusz :)

Kod:

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

 

#14  2008-08-24 12:32:34

  czadman - Bicycle repairman

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: php i wyciąganie danych z lini po znaku

Tak czysto porównawczo, to samo w pythonie:

Kod:

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

http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)