Bekijk Volledige Versie : regel verwijderen uit bestand
mistery guest
03/05/03, 13:50
Hallo mensen. Hoe kan ik een regel verwijderen uit een bestand?
Bijvoorbeeld
ik heb een bestand bestand.dat
daar staat op iedere regel een code
<? $plaatje = 1 ?>
<? $fiets = rood ?>
<? $zadel = true ?>
Ik moet dus via een opgegeven 'input'. de regel verwijderen.
Dus bv via een form vul ik in een tekstveld
"<? $fiets = rood ?>" en klik op verwijderen en de regel is verwijderd.
Wie kan me vertellen hoe ik dit doe?
Daniel Tryba
03/05/03, 14:05
mistery guest <fdshk@gfsd.fd> wrote:
> ik heb een bestand bestand.dat
> daar staat op iedere regel een code
> <? $plaatje = 1 ?>
> <? $fiets = rood ?>
> <? $zadel = true ?>
>
> Ik moet dus via een opgegeven 'input'. de regel verwijderen.
> Dus bv via een form vul ik in een tekstveld
> "<? $fiets = rood ?>" en klik op verwijderen en de regel is verwijderd.
>
> Wie kan me vertellen hoe ik dit doe?
Het is jammer dat je niet vertelt in welke taal je dit voor elkaar wilt
krijgen dus dan maar in pseudo:
open bestand, lees regel voor regel in, controleert of de regel matched
met de gezocht string, is dat niet het geval dan schrijf je de gelezen
regel weg naar een nieuwe file en overschrijf als laatste de oude file
met de nieuwe.
Punten van aandacht die je niet moet vergeten zijn locking van te
scannen file.
--
Daniel Tryba
mistery guest
03/05/03, 16:05
> > ik heb een bestand bestand.dat
> > daar staat op iedere regel een code
> > <? $plaatje = 1 ?>
> > <? $fiets = rood ?>
> > <? $zadel = true ?>
> >
> > Ik moet dus via een opgegeven 'input'. de regel verwijderen.
> > Dus bv via een form vul ik in een tekstveld
> > "<? $fiets = rood ?>" en klik op verwijderen en de regel is verwijderd.
> >
> > Wie kan me vertellen hoe ik dit doe?
>
> Het is jammer dat je niet vertelt in welke taal je dit voor elkaar wilt
> krijgen dus dan maar in pseudo:
>
> open bestand, lees regel voor regel in, controleert of de regel matched
> met de gezocht string, is dat niet het geval dan schrijf je de gelezen
> regel weg naar een nieuwe file en overschrijf als laatste de oude file
> met de nieuwe.
>
> Punten van aandacht die je niet moet vergeten zijn locking van te
> scannen file.
Zou inderdaad makkelijk zijn, misschien kan je me op weg helpen met een code
als ik zeg dat ik het met PHP wil doen
Daniel Tryba
03/05/03, 17:05
mistery guest <fdshk@gfsd.fd> wrote:
>> open bestand, lees regel voor regel in, controleert of de regel matched
>> met de gezocht string, is dat niet het geval dan schrijf je de gelezen
>> regel weg naar een nieuwe file en overschrijf als laatste de oude file
>> met de nieuwe.
>>
>> Punten van aandacht die je niet moet vergeten zijn locking van te
>> scannen file.
>
> Zou inderdaad makkelijk zijn, misschien kan je me op weg helpen met een code
> als ik zeg dat ik het met PHP wil doen
Niet uitvoerig getest (mbt tot locking maar IMHO zou het moeten werken:),
mogelijk dat je problemen krijgt indien er end-of-line conversies plaats
vinden, in dit voorbeeld hoe je altijd een "unix" tekstfile over.
<?php
$remove='string to remove';
if($fp=fopen('file.txt','r+'))
{
if(flock($fp,LOCK_EX,true))
{
$out='';
while(!feof($fp))
{
$line=trim(fgets($fp));
if(strcmp($line,$remove))
{
$out.="$line\n";
}
}
if(strlen($out))
{
if(rewind($fp))
{
fwrite($fp,$out);
}
}
}
fclose($fp);
}
?>
--
Daniel Tryba
mistery guest
03/05/03, 17:50
> Niet uitvoerig getest (mbt tot locking maar IMHO zou het moeten werken:),
> mogelijk dat je problemen krijgt indien er end-of-line conversies plaats
> vinden, in dit voorbeeld hoe je altijd een "unix" tekstfile over.
Ik heb het uitgeprobeerd.
Om het te test had ik een bestand gemaakt met getallen onder elkaar van 1
tot 10
na het gebruik van het script veranderd het bestand in alle getallen naast
elkaar met zwarte vakjes ertussen. en getal 17 tm 20 wordt herhaald aan het
einde :s
Daniel Tryba
03/05/03, 18:35
mistery guest <fdshk@gfsd.fd> wrote:
>> Niet uitvoerig getest (mbt tot locking maar IMHO zou het moeten
>> werken:), mogelijk dat je problemen krijgt indien er end-of-line
>> conversies plaats vinden, in dit voorbeeld hoe je altijd een "unix"
>> tekstfile over.
>
> Ik heb het uitgeprobeerd. Om het te test had ik een bestand gemaakt
> met getallen onder elkaar van 1 tot 10 na het gebruik van het script
> veranderd het bestand in alle getallen naast elkaar met zwarte vakjes
> ertussen.
Dat komt zeer waarschijnlijk door een EOL conversie. Ik neem aan dat je
het script op een windows host draaid?
> en getal 17 tm 20 wordt herhaald aan het einde :s
Aha, dat was me niet opgevallen...
Pogin 2, zou beide bovenstaande problemen moeten oplossen.
<?php
$remove='string to remove';
if($fp=fopen('file.txt','r+'))
{
if(flock($fp,LOCK_EX,true))
{
$changed=false;
$out='';
while(!feof($fp))
{
$line=fgets($fp);
if(preg_match("/^(.*)([\r\n|\n|\r]?)$/",$line,$match))
{
if(strcmp($match[1],$remove))
{
$out.=$line;
}
else
{
$changed=true;
}
}
}
if($changed && rewind($fp))
{
$size=strlen($out);
ftruncate($fp,$size);
fwrite($fp,$out,$size);
}
}
fclose($fp);
}
?>
--
Daniel Tryba
mistery guest
03/05/03, 21:20
Geen op linux.
Maar ik zal even het nieuwe script proberen
"Daniel Tryba" <news_nl.internet.www.server-side@canopus.nl> schreef in
bericht news:b90q97$sa3$1@news.tue.nl...
> mistery guest <fdshk@gfsd.fd> wrote:
> >> Niet uitvoerig getest (mbt tot locking maar IMHO zou het moeten
> >> werken:), mogelijk dat je problemen krijgt indien er end-of-line
> >> conversies plaats vinden, in dit voorbeeld hoe je altijd een "unix"
> >> tekstfile over.
> >
> > Ik heb het uitgeprobeerd. Om het te test had ik een bestand gemaakt
> > met getallen onder elkaar van 1 tot 10 na het gebruik van het script
> > veranderd het bestand in alle getallen naast elkaar met zwarte vakjes
> > ertussen.
>
> Dat komt zeer waarschijnlijk door een EOL conversie. Ik neem aan dat je
> het script op een windows host draaid?
>
> > en getal 17 tm 20 wordt herhaald aan het einde :s
>
> Aha, dat was me niet opgevallen...
>
> Pogin 2, zou beide bovenstaande problemen moeten oplossen.
>
> <?php
>
> $remove='string to remove';
>
> if($fp=fopen('file.txt','r+'))
> {
> if(flock($fp,LOCK_EX,true))
> {
> $changed=false;
> $out='';
>
> while(!feof($fp))
> {
> $line=fgets($fp);
>
> if(preg_match("/^(.*)([\r\n|\n|\r]?)$/",$line,$match))
> {
> if(strcmp($match[1],$remove))
> {
> $out.=$line;
> }
> else
> {
> $changed=true;
> }
> }
> }
>
> if($changed && rewind($fp))
> {
> $size=strlen($out);
>
> ftruncate($fp,$size);
> fwrite($fp,$out,$size);
> }
> }
>
> fclose($fp);
> }
>
> ?>
>
>
> --
>
> Daniel Tryba
mistery guest
03/05/03, 21:20
Niet op windows dus,
Ik heb de nieuwe geprobeerd, maar er veranderd helemaal niets aan het
bestand.
Ik snap ook het hele script niet.
Ik krijg geen foutmeldeingen in ieder geval
"mistery guest" <fdshk@gfsd.fd> schreef in bericht
news:b9142r$ek$1@news3.tilbu1.nb.home.nl...
> Geen op linux.
> Maar ik zal even het nieuwe script proberen
>
> "Daniel Tryba" <news_nl.internet.www.server-side@canopus.nl> schreef in
> bericht news:b90q97$sa3$1@news.tue.nl...
> > mistery guest <fdshk@gfsd.fd> wrote:
> > >> Niet uitvoerig getest (mbt tot locking maar IMHO zou het moeten
> > >> werken:), mogelijk dat je problemen krijgt indien er end-of-line
> > >> conversies plaats vinden, in dit voorbeeld hoe je altijd een "unix"
> > >> tekstfile over.
> > >
> > > Ik heb het uitgeprobeerd. Om het te test had ik een bestand gemaakt
> > > met getallen onder elkaar van 1 tot 10 na het gebruik van het script
> > > veranderd het bestand in alle getallen naast elkaar met zwarte vakjes
> > > ertussen.
> >
> > Dat komt zeer waarschijnlijk door een EOL conversie. Ik neem aan dat je
> > het script op een windows host draaid?
> >
> > > en getal 17 tm 20 wordt herhaald aan het einde :s
> >
> > Aha, dat was me niet opgevallen...
> >
> > Pogin 2, zou beide bovenstaande problemen moeten oplossen.
> >
> > <?php
> >
> > $remove='string to remove';
> >
> > if($fp=fopen('file.txt','r+'))
> > {
> > if(flock($fp,LOCK_EX,true))
> > {
> > $changed=false;
> > $out='';
> >
> > while(!feof($fp))
> > {
> > $line=fgets($fp);
> >
> > if(preg_match("/^(.*)([\r\n|\n|\r]?)$/",$line,$match))
> > {
> > if(strcmp($match[1],$remove))
> > {
> > $out.=$line;
> > }
> > else
> > {
> > $changed=true;
> > }
> > }
> > }
> >
> > if($changed && rewind($fp))
> > {
> > $size=strlen($out);
> >
> > ftruncate($fp,$size);
> > fwrite($fp,$out,$size);
> > }
> > }
> >
> > fclose($fp);
> > }
> >
> > ?>
> >
> >
> > --
> >
> > Daniel Tryba
>
>
Daniel Tryba
04/05/03, 21:50
mistery guest <fdshk@gfsd.fd> wrote:
> Niet op windows dus,
Het werkt niet op windows of je draaid geen windows?
> Ik heb de nieuwe geprobeerd, maar er veranderd helemaal niets aan het
> bestand.
Ik kan niets anders melden dan dat het wel werkt bij mij (php 4.2.3 op
een Linux doos).
> Ik snap ook het hele script niet.
Stel dan maar eens een gerichte vraag erover :)
> Ik krijg geen foutmeldeingen in ieder geval
[insert standaard verhaaltje over topposten + integraaf kwooten]
--
Daniel Tryba