tietyn rivin hakeminen tekstitiedostosta

miten onnistuisin hakemaan tietyn rivin tekstitiedostosta hakusanalla joka olisi nimi? esimerkkiä jossain?

oletetaan että minulla olisi esim. tiedosto.txt
rivi1: niilo,25,mies,kausala
rivi2: nanja,22,nainen,nokia
rivi3: hannu,30,mies,jyväskylä

eli miten hakisin rivin2, tiedolla että siellä on nanja niminen tieto?

sql:llähän tuo olisi helppo tyyliin SELECT * FROM person WHERE nimi = "nanja"

mutta miten hakisin siis tekstitiedostosta tuon tiedon?
13568
Äänestä

Muut lukivat myös

Vastaukset 13

Vanhimmat

luet tiedoston taulukkoon (file - funktiolla) ja käyt taulukon läpi (for tai foreach) kunnes vastaava tieto löytyy.

Äänestä
  • Mutta miten siis tuon saa tulostamaan vain tuon rivin Nanja.. ideana siis että syötän esim. formista nimen "Nanja" ja sitten tuo etsisi rivin jossa on nimi Nanja ja näyttää sen minulle...

    Äänestä

Eli pitäisi olla siis tyyliin:
Anna hakusana:
(käyttäjä antaa esimerkiksi tuon Nanja)

Tulostus-->

Hakusanalla Nanja löytyi rivi:
nanja,22,nainen,nokia

Ja tämä etsiminen siis tekstitiedostosta...

Äänestä

Eli kokeilin alla olevaa ratkaisua, mutta jostain syystä se ei tulosta mitään.

Äänestä
  • Tietotyypin string vertailu ei ole mahdollista == operaattorilla. Tee vertailu strcmp() functiolla. Functio ei toimi odotetusti, vaan sitä käytetään näin: if(!strcmp($mojono1, $mjono2))echo"Samat";
    HUOMAA !-merkki ennen functiota. Functrio palauttaa 0, jos ovat samat...

    Äänestä

  • teuro kirjoitti:

    Tietotyypin string vertailu ei ole mahdollista == operaattorilla. Tee vertailu strcmp() functiolla. Functio ei toimi odotetusti, vaan sitä käytetään näin: if(!strcmp($mojono1, $mjono2))echo"Samat";
    HUOMAA !-merkki ennen functiota. Functrio palauttaa 0, jos ovat samat...

    Alla olevalla sain toimimaan == vertailun,
    palauttaa siis aku,35,mies,ankkalinna

    $tiedosto = file("tiedosto.txt");
    $nimi = "aku,35,mies,ankkalinna";

    for ($i = 0; $i < count($tiedosto); $i )
    {
    if($tiedosto[$i] == $nimi)
    {
    echo $tiedosto[$i];
    break;
    }
    }

    Ongelmana on kuitenkin se, että pitäisi saada niin että hakusanana on vain "aku" ja palauttaa sitten "aku, 35, mies, ankkalinna".

    Käsittääkseni tuo strcmp vertailee merkkijonojen pituutta, sellainen ei käy koska tiedosto.txt voi olla muitakin yhtä pitkiä merkkijonoja, kuten:
    "ile, 30, mies, ankkalinna".

    Äänestä

  • teuro kirjoitti:

    Tietotyypin string vertailu ei ole mahdollista == operaattorilla. Tee vertailu strcmp() functiolla. Functio ei toimi odotetusti, vaan sitä käytetään näin: if(!strcmp($mojono1, $mjono2))echo"Samat";
    HUOMAA !-merkki ennen functiota. Functrio palauttaa 0, jos ovat samat...

    Asia on noin monissa muissa ohjelmointikielissä, mutta PHP:llä voi verrata suoraan string-muuttujia.


    Tuossa vertailu ei onnistu koska "nanja,22,nainen,nokia" != "nanja".

    Vertaat siis suoraan tuota nimeä koko riviin ja nehän ei ole samat. Eikä tuohonkaan auta strcmp().


    Homma onnistuu vaikka strstr()-funtkioita ( http://w3schools.com/php/func_string_strstr.asp ) etsimään nimeä rivin sisältä. Eli jotain tähän tapaan:

    if (strstr($nimi,$tiedosto[$i]) != false) echo 'Löytyi';

    Äänestä

  • PHP-miäs kirjoitti:

    Asia on noin monissa muissa ohjelmointikielissä, mutta PHP:llä voi verrata suoraan string-muuttujia.


    Tuossa vertailu ei onnistu koska "nanja,22,nainen,nokia" != "nanja".

    Vertaat siis suoraan tuota nimeä koko riviin ja nehän ei ole samat. Eikä tuohonkaan auta strcmp().


    Homma onnistuu vaikka strstr()-funtkioita ( http://w3schools.com/php/func_string_strstr.asp ) etsimään nimeä rivin sisältä. Eli jotain tähän tapaan:

    if (strstr($nimi,$tiedosto[$i]) != false) echo 'Löytyi';

    Alla oleva koodi ei palauta yhtään mitään:

    $tiedosto = file("tiedosto.txt");
    $nimi = "aku";

    for ($i = 0; $i < count($tiedosto); $i )
    {
    if (strstr($nimi,$tiedosto[$i]) != false)
    {
    echo $tiedosto[$i];
    break;
    }
    }

    Äänestä

  • PHP-miäs kirjoitti:

    Asia on noin monissa muissa ohjelmointikielissä, mutta PHP:llä voi verrata suoraan string-muuttujia.


    Tuossa vertailu ei onnistu koska "nanja,22,nainen,nokia" != "nanja".

    Vertaat siis suoraan tuota nimeä koko riviin ja nehän ei ole samat. Eikä tuohonkaan auta strcmp().


    Homma onnistuu vaikka strstr()-funtkioita ( http://w3schools.com/php/func_string_strstr.asp ) etsimään nimeä rivin sisältä. Eli jotain tähän tapaan:

    if (strstr($nimi,$tiedosto[$i]) != false) echo 'Löytyi';

    eli edelleen strstr toimii myös jos hakusanaksi laittaa koko rivin, mutta ei jos yksittäisen sanan.

    Äänestä

  • cheese_ kirjoitti:

    Alla olevalla sain toimimaan == vertailun,
    palauttaa siis aku,35,mies,ankkalinna

    $tiedosto = file("tiedosto.txt");
    $nimi = "aku,35,mies,ankkalinna";

    for ($i = 0; $i < count($tiedosto); $i )
    {
    if($tiedosto[$i] == $nimi)
    {
    echo $tiedosto[$i];
    break;
    }
    }

    Ongelmana on kuitenkin se, että pitäisi saada niin että hakusanana on vain "aku" ja palauttaa sitten "aku, 35, mies, ankkalinna".

    Käsittääkseni tuo strcmp vertailee merkkijonojen pituutta, sellainen ei käy koska tiedosto.txt voi olla muitakin yhtä pitkiä merkkijonoja, kuten:
    "ile, 30, mies, ankkalinna".

    Mitä jos pätkisi tiedoston rakenteen explode() functiolla osiin ja vertailisi syntyneitä stringejä toisiinsa? Tiedoston rakenne voisi olla aku|35|mies|ankkalinna

    Tuosta voisi kehitellä...

    Äänestä

  • teuro kirjoitti:

    Mitä jos pätkisi tiedoston rakenteen explode() functiolla osiin ja vertailisi syntyneitä stringejä toisiinsa? Tiedoston rakenne voisi olla aku|35|mies|ankkalinna

    Tuosta voisi kehitellä...

    tiedoston rakennahan on jo aku,35,mies,ankkalinna. Se on varmaankin sama onko siinä , vai |.
    Mutta siis en kyllä millään saa tuolla explodella tulostettua koko riviä, yhden hakusanan avulla.

    Äänestä

  • cheese_ kirjoitti:

    Alla oleva koodi ei palauta yhtään mitään:

    $tiedosto = file("tiedosto.txt");
    $nimi = "aku";

    for ($i = 0; $i < count($tiedosto); $i )
    {
    if (strstr($nimi,$tiedosto[$i]) != false)
    {
    echo $tiedosto[$i];
    break;
    }
    }

    strstr - funktion parametrit ovat väärinpäin. Pitää olla
    strstr($tiedosto[$i], $nimi).

    Tuo on mielestäni huono tapa etsiä koska se voi palauttaa vääränkin nimen (jos nimi tiedostossa on esim: aku1, akua, akuankka).

    Itse pilkkoisin rivin explodella ja etsisin pelkästään nimi alkiosta.


    $tiedosto = file("tiedosto.txt");
    $nimi = "aku";

    for ($i = 0; $i < count($tiedosto); $i )
    {
    $rowarray = explode("|", $tiedosto[$i]);
    if ($rowarray[0] == $nimi)
    {
    echo "Nimi löytyi";
    break;
    }
    }

    Tiedoston rakenne tulee olla tässä tapauksessa:

    aku|77|ankka|ankkalinna
    hannu|30|mies|jyväskylä

    Äänestä

  • no siis kirjoitti:

    tiedoston rakennahan on jo aku,35,mies,ankkalinna. Se on varmaankin sama onko siinä , vai |.
    Mutta siis en kyllä millään saa tuolla explodella tulostettua koko riviä, yhden hakusanan avulla.

    Koko koodi

    Äänestä

Kommentoi aloitusta


cheese_ kirjoitti:

miten onnistuisin hakemaan tietyn rivin tekstitiedostosta hakusanalla joka olisi nimi? esimerkkiä jossain?

oletetaan että minulla olisi esim. tiedosto.txt
rivi1: niilo,25,mies,kausala
rivi2: nanja,22,nainen,nokia
rivi3: hannu,30,mies,jyväskylä

eli miten hakisin rivin2, tiedolla että siellä on nanja niminen tieto?

sql:llähän tuo olisi helppo tyyliin SELECT * FROM person WHERE nimi = "nanja"

mutta miten hakisin siis tekstitiedostosta tuon tiedon?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu