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?
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?
Vastaukset 13
Vanhimmat
luet tiedoston taulukkoon (file - funktiolla) ja käyt taulukon läpi (for tai foreach) kunnes vastaava tieto löytyy.
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...
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...
Eli kokeilin alla olevaa ratkaisua, mutta jostain syystä se ei tulosta mitään.
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".
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;
}
}
eli edelleen strstr toimii myös jos hakusanaksi laittaa koko rivin, mutta ei jos yksittäisen sanan.
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.
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ä
Koko koodi