bepaalde regels uit tekstbestand lezen

Status
Niet open voor verdere reacties.

DarkFeather

Gebruiker
Lid geworden
21 jan 2004
Berichten
134
Is het mogelijk (d.m.v. php) een specifieke regel uit een tekst bestand te lezen?

Stel het tekst bestand is dit:

1 Goedemorgen
2 Goedemiddag
3 Goedeavond
4 Goedenacht

Stel dat ik dan de variabele $t = 2 is er dan een script die het tekstbestand opent en dan de regel die begint met 2 opzoekt en dan: Goedemiddag weergeeft (of in een variabele plaatst?)

Als het niet duidelijk is wat ik bedoel zeg het dan, dan probeer ik het anders uit te leggen!
 
Waarom uit een tekst bestand?
Heb je hier wat aan?

PHP:
<?php
$vandaag = getdate();
$uur = $vandaag['hours'];
if(($uur >= 6) && ($uur < 12)){	
	$groet = "Goedenmorgen";}
elseif (($uur >= 12) && ($uur < 18)){
	$groet = "Goedenmiddag";}
elseif (($uur >= 18) && ($uur <= 23)){
	$groet = "Goedenavond";}
elseif (($uur >= 0) && ($uur < 6)){
	$groet = "Goedenacht";}
echo("<font face=Verdana size=2>$groet gast.<BR>Dit is een voorbeeld van een tekst die afhankelijk is van de tijd van de dag.</font>");
?>

Groeten,
Olav
 
Laatst bewerkt:
Sorry, hier heb ik niets aan. Ik ben niet op zoek naar zoiets.

Er staat niet voor niets:
Stel het tekst bestand is dit

Het gaat er nu niet om wat er in het tekstbestand komt te staan, maar om het script om een bepaalde regel (met een id ervoor) uit het tekstbestand te lezen.

Stel mijn link is dit index.php?t=2 dan wil ik een script die dan in het tekst bestand zoekt naar de regel die begint met 2 en dan hetgeen wat erachterstaat weergeeft. Snappie?
 
Laatst bewerkt:
Okidoki, gesnopen ;)

Voor het openen en lezen van standaard tekst bestanden gebruik je de functies fopen() en fgets()
voorbeeld uit de handleiding:
PHP:
<?php
$handle = fopen ("/tmp/inputfile.txt", "r");
while (!feof ($handle)) {
    $buffer = fgets($handle);
    echo $buffer;
}
fclose ($handle);
?>

Alleen in jouw geval heb je daar niet al te veel aan. Jij kan beter de functie "ini_get()" gebruiken.
Een ini file is ook een tekst bestand, maar heeft een bepaalde opmaak waarbij je gebruik maakt van variabelen die je weer aanroept met ini_get.

Voorbeeld uit de handleiding:
PHP:
<?php
/*
Our php.ini contains the following settings:

display_errors = On
register_globals = Off
post_max_size = 8M
*/

echo 'display_errors = ' . ini_get('display_errors') . "\n";
echo 'register_globals = ' . ini_get('register_globals') . "\n";
echo 'post_max_size = ' . ini_get('post_max_size') . "\n";
echo 'post_max_size+1 = ' . (ini_get('post_max_size')+1) . "\n"; 

?>

Voor een uitgebreide uitleg van deze functies, kan je het beste de handleiding lezen. (download)

Olav
 
Bedankt voor de moeite, maar na wat uitproberen snap ik hoe de functie (ini_get) werkt. De functie geeft de configuratiewaarde van de gevraagde variabele weer. Echter de gevraagde variabelen worden uit php.ini gehaald, je kan zelf geen ander bestand. De php.ini waaruit de waarden worden gehaald is de php-configuratie van de server.

Ik ben indd opzoek naar zo'n soort functie, maar dan een waarbij jezelf het bestand op moet geven van waaruit de waarden van de opgegeven variabele moet worden opgehaald.

Is er niet iemand die een kant-en-klaar script heeft die doet wat ik vraag (onder het motto van: liever lui dan moe?)?
 
Laatst bewerkt:
Bedankt voor de moeite, maar na wat uitproberen snap ik hoe de functie (ini_get) werkt. De functie geeft de configuratiewaarde van de gevraagde variabele weer. Echter de gevraagde variabelen worden uit php.ini gehaald, je kan zelf geen ander bestand. De php.ini waaruit de waarden worden gehaald is de php-configuratie van de server.
Ik heb het zelfde gedaan, ook mee aan het spelen en proberen gegaan en kwam tot dezelfde conclusie. Ik had in eerste instantie alleen de handleiding even erop na geslagen. Maar met het volgende moet het lukken. Mij in ieder geval wel.

In dezelfde directory waar het php bestand staat heb ik een txt bestand gezet genaamd tekst.txt.
De tekst.txt bevat de volgende waarden:
1=Goedemorgen
2=Goedemiddag
3=Goedeavond
4=Goedenacht


PHP:
<?php
$handle = fopen("tekst.txt", "r");
$t = 4; #moet je weghalen, is alleen om dit script te laten werken.
while (!feof ($handle)) {
    $buffer = fgets($handle);
	list($nummer,$string) = explode("=",$buffer);
	if($nummer == $t)
	{
		echo("$string gast");
	}
}
fclose($handle);
?>

De uitleg:
$handle = fopen("tekst.txt", "r");
Hiermee wordt het tekst bestand geopend.

while (!feof ($handle))
Hiermee wordt aanzet gegeven om de inhoud van je tekst bestand te gaan lezen tot hij aan het einde van het bestand is (eof = End Of File, met de "!"maak je het een ontkenning, dus wordt het netzolang tot je nog niet bij de EOF bent.).

$buffer = fgets($handle);
hier wordt een regel uit je tekst bestand gelezen en opgeslagen in de variabele $buffer.

list($nummer,$string) = explode("=",$buffer);
Hier wordt je gelezen regel uit elkaar getrokken. link en rechts van het "=" teken. Wat links van het "="teken staat wordt in de variabele $nummer gezet en wat rechts van de "=" staat in $string.

if($nummer == $t)
Hier wordt variabele $nummer vergeleken met $t en als het gelijk is wordt de actie echo("$string gast"); uitgevoerd.
Daarmee wordt dus de string zoals je die in je tekst bestand had staan neergezet met daar achter de tekst gast.
Die echo kan je natuurlijk aanpassen zoals je wilt.

fclose($handle);
Hiermee sluit je het tekst bestand weer.

Olav
 
Laatst bewerkt:
Dank je!!! :thumb:

Het lukt me alleen nog niet om als ik $t = 4; heb verwijderd om dan door middel van een link de variabele in te stellen. Het lukt me nog niet om door middel van de volgende link:
Code:
<a href="script.php?t=2">klik hier</a>

de variabele $t door te geven. Wat doe ik fout? Ik wil dat als je op een link klikt, dat door middel van die link, de variabele $t wordt door gegeven (zie mijn link hierboven) en dat dan het script wordt uitgevoerd, met de doorgegeven $t als variabele.
 
Laatst bewerkt:
Je manier is goed, zo moet dat werken.
Alleen je test hem lokaal zeker?
Ik heb hetzelfde probleem thuis, als ik op die manier zaken doorgeef werkt het niet, echter als ik de pagina's bij Lycos upload werkt het wel.

Er zijn nog wel andere manieren om die $t uit te lezen, maar ik zit hier op mijn werk en kan dus niet alles naslaan.

Misschien dat iemand anders je daar aan kan helpen?

Groeten,
Olav
 
Nog een klein vraagje: is het mogelijk om een fout melding weer te geven als het nummer niet is gevonden?
 
Ook dat is mogelijk, met een kleine aanpassing:
PHP:
<?php
/*
In dezelfde directory waar het php bestand staat heb ik een txt bestand gezet.
Mijn tekst.txt bevat de volgende waarden:
1=Goedemorgen 
2=Goedemiddag 
3=Goedeavond 
4=Goedenacht
*/
$handle = fopen("tekst.txt", "r");
$t = 5; #moet je weghalen, is alleen om dit script nu te laten werken.
$i = 1; # niet perse noodzakelijk.
while (!feof ($handle) && ($i <= 4)) {
    $buffer = fgets($handle);
	list($nummer,$string) = explode("=",$buffer);
	if($nummer == $t){
		echo("$string gast");
		break;
	}
	else {
		if ($i == 4){
			echo("Fout, uw nummer is niet bekend.");
		} 
		else {
			$i++;
		}
	}
}
fclose($handle);
?>

De uitleg:
Je ziet een nieuwe variabele; "$i". Dit is een teller, die gelijk op loopt met het aantal regels in je tekst bestand, beginnend bij 1.
Ook zie je bij de while-loop een extra controle. "&& ($i <= 4)" Dus de while loop blijft nu net zolang doorlopen tot het einde van het bestand is bereikt (!eof) EN $i kleiner of gelijk is aan 4 of als er eerder uit de loop gesprongen wordt.
Die 4 slaat zoals gezegd op het aantal regels in het tekst bestand. Heb jij 100 regels in je tekst bestand, dan maak je daar dus "&& ($i <= 100)" van.
Zo ook bij "if ($i == 4){" Ook hier is "4" de laatste regel in je tekst bestand. Bij 100 regels wordt het dus "if ($i == 100){"
De foutmelding wordt dus alleen getoond op het moment dat $t niet gevonden is in $nummer EN als $i gelijk is aan 4. Of te wel als ook de laatste regel niet begint met het nummer van $t. (Volg je het nog ;))
Komt $nummer niet over een met $t, maar heeft $i nog geen waarde 4(de laatste regel) bereikt, dan wordt er 1 opgeteld bij $i.
Komt $t wel overeen met $nummer, dan wordt $string behorend bij $nummer getoond en wordt de while loop afgebroken door middel van "break;"

Succes,
Olav
 
Laatst bewerkt:
Geplaatst door Olav
De uitleg:
Je ziet een nieuwe variabele; "$i". Dit is een teller, die gelijk op loopt met het aantal regels in je tekst bestand, beginnend bij 1.
Ook zie je bij de while-loop een extra controle. "&& ($i <= 4)" Dus de while loop blijft nu net zolang doorlopen tot het einde van het bestand is bereikt (!eof) EN $i kleiner of gelijk is aan 4 of als er eerder uit de loop gesprongen wordt.
Die 4 slaat zoals gezegd op het aantal regels in het tekst bestand. Heb jij 100 regels in je tekst bestand, dan maak je daar dus "&& ($i <= 100)" van.
Zo ook bij "if ($i == 4){" Ook hier is "4" de laatste regel in je tekst bestand. Bij 100 regels wordt het dus "if ($i == 100){"
De foutmelding wordt dus alleen getoond op het moment dat $t niet gevonden is in $nummer EN als $i gelijk is aan 4. Of te wel als ook de laatste regel niet begint met het nummer van $t. (Volg je het nog ;))
Komt $nummer niet over een met $t, maar heeft $i nog geen waarde 4(de laatste regel) bereikt, dan wordt er 1 opgeteld bij $i.
Komt $t wel overeen met $nummer, dan wordt $string behorend bij $nummer getoond en wordt de while loop afgebroken door middel van "break;"

Olav

Als ik het goed heb begrepen moet ik dus elke keer als ik een regel toevoeg aan het bestand ook in het script wijzigen.

De bedoeling is echter dat ik dat de regels automatisch toegevoegd kunnen worden. Is er geen andere manier om een foutmelding weer te geven als het nummer niet is gevonden? Dus zonder dat je elke keer het script moet aanpassen???
Ik heb het al geprobeerd om if ($i == 1000) en (!eof) te verwijderen, maar dan werkt ie niet...

En wat baal ik ervan dat ik met koninginnedag & dit stalend mooie weer moet werken, zucht, dat moest ik ff kwijt
 
Laatst bewerkt:
Ik zal eens kijken later vandaag of van het weekend. Moet ook anders kunnen idd, dat hij eerst de rijen telt in het bestand en met het resultaat daarvan aan de slag gaat.

Als je tijd hebt, probeer eens:
$myCount = count($handle)
while (!feof ($handle) && ($i <= $myCount))

$handle is namelijk een array. Met count moet hij het aantal items in een array kunnen tellen. Elk item bevat een regel uit je tekst bestand.

Groetjes,
Olav
 
Geplaatst door Olav
Ik zal eens kijken later vandaag of van het weekend. Moet ook anders kunnen idd, dat hij eerst de rijen telt in het bestand en met het resultaat daarvan aan de slag gaat.

Als je tijd hebt, probeer eens:
$myCount = count($handle)
while (!feof ($handle) && ($i <= $myCount))

$handle is namelijk een array. Met count moet hij het aantal items in een array kunnen tellen. Elk item bevat een regel uit je tekst bestand.

Groetjes,
Olav

Ik zal het eens proberen, in ieder geval bedankt voor de moeite! :thumb:
 
hmm dat gaat dus niet werken. :o
Ik kijk nog even verder.

Olav
 
Iemand enig idee wat wel de goede oplossing is? Ik kom er zelf ook niet uit.
 
sorry, even geen tijd gehad. Ik zit nog midden in de verbouwing van mijn huis en de afgelopen dagen een paar hulp roepen gehad van vrienden die besmet waren met virussen en spyware.... :S
 
Hebbes
PHP:
<?php
/*
In dezelfde directory waar het php bestand staat heb ik een txt bestand gezet.
Mijn tekst.txt bevat de volgende waarden:
1=Goedemorgen 
2=Goedemiddag 
3=Goedeavond 
4=Goedenacht
*/
//Variabelen
$t = 4; //moet je weghalen, is alleen om dit script nu te laten werken.
$i = 1;
$myCount = 0;

//Teller, telt hoeveel regels er in je tekst bestand staan. 
//De variabele $myCount bevat aan het einde dus het aantal regels die er in je tekst bestand staan.
$handle = fopen("tekst.txt", "r");
while (!feof ($handle)) 
{
    $buffer = fgets($handle);
	if(buffer != "")
	{ 	
		$myCount = $myCount +1;
	}
}
fclose($handle);

//Geeft bericht weer naar aanleiding van de variabele $t
$handle = fopen("tekst.txt", "r");
while (!feof ($handle) && ($i <= $myCount)) {
    $buffer = fgets($handle);
    list($nummer,$string) = explode("=",$buffer);
    if($nummer == $t){
        echo("$string gast");
        break;
    }
    else {
        if ($i == $myCount){ //Als dus nummer niet gevonden is in de voorgaande regel EN de teller ($i) gelijk is aan het aantal regels in je tekst bestand ($myCount) dan foutmelding.
            echo("Fout, uw nummer is niet bekend."); 
        } 
        else {
            $i++;
        }
    }
}
fclose($handle);
?>
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan