Avatar billede nvr Nybegynder
23. juni 2000 - 10:53 Der er 28 kommentarer og
1 løsning

Sletning af fil

Okay... jeg har det hersens nyhedsscript, der kan tilføje og slette nyheder.

Men da jeg har modificeret den ud i det uendelige, har jeg fået problemer, når jeg skal slette mere end een fil.

Følgende kode går ind i en alm. tekstfil og sletter et linie:

open(GW,"$BaseDir/$DataFile");
    @lines = <GW>;
    close GW;
   
    open (GB,">$BaseDir/$DataFile");
    foreach $line (@lines) {
        chop $line;
        @TempData = split (/\t/, $line);
       
        if ($TempData[1] ne "$in{'Filename'}") {
            print GB "$line\n";
        }
    }
    close GB;

$Datafile ser ud som følger:

Testoverskrift    Detteerenoverskrift.shtml
Testoverskrift2    Detteerenoverskrift2.shtml

-------------------------------------------

Kommandoen kører fint. Har man bedt den om at slette f.eks. "Testoverskrift" går den ind og finder linien, hvor Detteerenoverskrift.shtml (Filename) og sletter linien.

Nu har jeg imidlertid flere filer, der alle skal have slettet den linie, hvor teksten Detteerenoverskrift.shtml findes.

Derfor har jeg lavet en variant:

open(GW2,"$BaseDir/$DataFile2");
    @lines2 = <GW2>;
    close GW2;
   
    open (GB2,">$BaseDir/$DataFile2");
    foreach $line2 (@lines2) {
        chop $line2;
        @TempData2 = split (/\t/, $line2);
       
        if ($TempData2[1] ne "$in{'Filename'}") {
            print GB2 "$line2\n";
        }
    }
    close GB2;

Datafile2 ser ud som følger:

  |nyheder/Detteerenoverskrift.shtml  |1B8DB9|ffffff|Testoverskrift
  |nyheder/Detteerenoverskrift2.shtml  |1B8DB9|ffffff|Testoverskrift2

Men her sletter den IKKE "Detteerenoverskrift.shtml"-linien. Hvorfor ikke?
Avatar billede erikjacobsen Ekspert
23. juni 2000 - 11:14 #1
Lige et opklarende spørgsmål. I den nederste har du også |-er til at adskille felter.
Og dem splitter du da vist ikke på. Har det noget med sagen at gøre?
Avatar billede nvr Nybegynder
23. juni 2000 - 11:20 #2
| er et tegn, der SKAL indgå i Datafile2, i det tekstfilen skal bruges af et andet script senere hen, der netop benytter |-tegnet! :)
Avatar billede erikjacobsen Ekspert
23. juni 2000 - 11:30 #3
Ok, jamen, så er det i sammenligningen

    if ($TempData2[1] ne "$in{'Filename'}") {

For det første skal du slå op i $TempData2[0] (første felt) og så skal du ikke sammenligne på lighed,
men bruge lidt patternmatching

  if ($TempData2[0] =~ /$in{'Filename'}$/) {

eller - mere overskueligt (?) og effektivt, anfør øverst i scriptet $f=$in{'Filename'};  og så

  if ($TempData2[0] =~ /$f$/) {

Avatar billede erikjacobsen Ekspert
23. juni 2000 - 11:32 #4
(det der med patternmatching i stedet for ne er selvfølgelig kun hvis du rent faktisk
ikke skriver det fulde navn i feltet: |nyheder/Detteerenoverskrift.shtml  )
Avatar billede nvr Nybegynder
23. juni 2000 - 11:51 #5
Hmm... det duede ikke. Hverken den ene eller den anden måde. Det sletter blot alle linier i filen, og det er jo ikke ligefrem meningen. Jeg specificerede endda for den, hvad det første i filen hed:

open(GW2,"$BaseDir/$DataFile2");
    @lines2 = <GW2>;
    close GW2;

open (GB2,">$BaseDir/$DataFile2");
$f="nyheder/$in{'Filename'}";
foreach $line2 (@lines2) {
    chop $line2;
    @TempData2 = split (/\t/, $line2);
   
    if ($TempData2[0] =~ /$f$/) {
        print GB2 "$line2\n";
    }
}
close GB2;
Avatar billede nvr Nybegynder
23. juni 2000 - 11:55 #6
ikke i filen, men i linien naturligvis! :)
Avatar billede erikjacobsen Ekspert
23. juni 2000 - 12:20 #7
Ok - så har jeg prøvet en variant af dit script, og det virker. Så.... prøv det lige

open(GW2,"nvr.txt");
  @lines2 = <GW2>;
close GW2;

$f="Detteerenoverskrift.shtml";
foreach $line2 (@lines2) {
  chop $line2;
  @TempData2 = split (/\t/, $line2);
  if (!($TempData2[0] =~ /$f$/)) {
    print "$line2\n";
  }
}
Avatar billede shifter Nybegynder
23. juni 2000 - 12:41 #8
Det var da utroligt... det dur heller ikke. Den sletter blot alt i filen og kommer samtidig med en error 500.

Jeg har naturligvis rettet nvr.txt til den korrekte txt-fil (med korrekt sti) og ændret detteeren....shtml til det korrekte filnavn.
Avatar billede shifter Nybegynder
23. juni 2000 - 12:49 #9
Ups... jeg burde vist have skiftet til nicket for min arbejdsplads... nå men bare så du ved det: nvr er når jeg har arbejdskasketten på og shifter er hjemme i privaten! :)
Avatar billede erikjacobsen Ekspert
23. juni 2000 - 14:06 #10
nuvel - en lille ting (har dårligt tid lige nu): står der tabuleringstegn i filen ??
Avatar billede nvr Nybegynder
26. juni 2000 - 10:07 #11
Der står ingen tabuleringstegn i filen.

Jeg har prøvet at skære koden helt ned til benet.

Med:

#!/usr/bin/perl

    open(GW2,"/hotel/nvr/WWW/cgi_bin/hotnewsticker2.txt");
    @lines2 = <GW2>;
    close GW2;
   
    open (GB2,">/hotel/nvr/WWW/cgi_bin/hotnewsticker2.txt");
            $f="test.shtml";
    foreach $line2 (@lines2) {
        chop $line2;
        @TempData2 = split (/\t/, $line2);
       
        if ($TempData2[0] =~ /$f$/) {
            print GB2 "$line2\n";
        }
    }
    close GB2;

kommer den med en fejl 500 plus den slettet alt i filen (den går altså ned på at fylde 0 bytes, men filen eksisterer stadig).
Avatar billede nvr Nybegynder
26. juni 2000 - 10:08 #12
For god ordens skyld kan det nævnes, at tekststrengen: test.shtml forefindes i hotnewsticker2.txt
Avatar billede erikjacobsen Ekspert
26. juni 2000 - 10:16 #13
HVis der ikke står tabuleringstegn i .txt filen kommer du ikke langt med at lave en split på
et tabuleringstegn
        @TempData2 = split (/\t/, $line2);
I mit eksempel var nvr.txt følgende:
|nyheder/Detteerenoverskrift.shtml    |1B8DB9|ffffff|Testoverskrift
|nyheder/Detteerenoverskrift2.shtml    |1B8DB9|ffffff|Testoverskrift2
hvor mellemrummene er et tabuleringstegn. Hvad har DU stående imellem?
Avatar billede nvr Nybegynder
26. juni 2000 - 10:20 #14
Jeg har f.eks.:

  |nyheder/test.shtml  |1B8DB9|ffffff|Test
  |nyheder/grandprix.shtml  |1B8DB9|ffffff|Grand Prix

hos mig er det ganske almindelig mellemrum.
Avatar billede erikjacobsen Ekspert
26. juni 2000 - 10:21 #15
Vi kunne splitte på mellemrum, men så får du et problem med "Grand Prix". Lav dem
om til tabuleringstegn!!
Avatar billede nvr Nybegynder
26. juni 2000 - 10:38 #16
Det bliver mere og mere sjovt det her! :)

Med:

  |nyheder/test.shtml    |1B8DB9|ffffff|Test
  |nyheder/grandprix.shtml    |1B8DB9|ffffff|Grand Prix

hvor der er tabuleringer, sletter den den nederste linie, selvom jeg har defineret, at den skal slette test.shtml!

Den kommer stadig med en fejl 500.
Avatar billede nvr Nybegynder
26. juni 2000 - 11:23 #17
Jeg ved ikke, om det kan hjælpe noget, men når den skal slette, skal den jo slette hele linien. F.eks.: |nyheder/test.shtml    |1B8DB9|ffffff|Test
Avatar billede erikjacobsen Ekspert
26. juni 2000 - 12:34 #18
Dit test skal negeres:

if (!($TempData2[0] =~ /$f$/)) {

Øh, sender du de rigtige headere tilbage, når du kører den på serveren?
Avatar billede erikjacobsen Ekspert
26. juni 2000 - 12:51 #19
Nå, ja forøvrigt - hvis der er syntaksfejl i sådan noget Perl-halløj, får
man slet ikke sendt nogen header tilbage, og så giver den en fejl (500??).
Test derfor lige dit script inden du sender det til serveren. Hvis jeg får
tid, lægger jeg lige noget op på en server, som skulle virke.
Avatar billede erikjacobsen Ekspert
26. juni 2000 - 13:15 #20
Ok. På http://www.hasselager.net/nvr/nvr.pl  ligger et program, der virker. Du kan indtaste
den tekst, der skal slettes efter. På  nvrpl.txt  sammested kan du se programmet, og
input.filen  nvr.txt  kan du også se. Output-filen  nvrny.txt  er også tilgængelig.
Hav det sjovt.
Avatar billede nvr Nybegynder
29. juni 2000 - 12:00 #21
jeg kigger lige på det i morgen. Har haft p#¤%&/ travlt! :)
Avatar billede nvr Nybegynder
30. juni 2000 - 10:26 #22
Uha uha! Nu er det liiiige ved at være der. Når den sletter, sletter den korrekt, MEN den tager et bogstav med fra næste linie af!

Eks:

FØR:

  |nyheder/test.shtml    |1B8DB9|ffffff|Test
  |nyheder/grandprix.shtml    |1B8DB9|ffffff|Grand Prix

EFTER:

  |nyheder/grandprix.shtml    |1B8DB9|ffffff|Grand Pri

X'et mangler!

Koden ser således ud nu:

open(GW2,"/hotel/nvr/WWW/cgi_bin/hotnewsticker2.txt");
    @lines2 = <GW2>;
    close GW2;
   
    open (GB2,">/hotel/nvr/WWW/cgi_bin/hotnewsticker2.txt");
            $f="nyheder/$in{'Filename'}";
    foreach $line2 (@lines2) {
        chop $line2;
        @TempData2 = split (/\t/, $line2);
       
        if (!($TempData2[0] =~ /$f$/)) {
            print GB2 "$line2\n";
        }
    }
    close GB2;


PS. Husk at svare på spørgsmålet næste gang, så du kan få dine points! :)


Avatar billede erikjacobsen Ekspert
30. juni 2000 - 10:31 #23
Den der chop er vist overflødig. Prøv lige uden.
Avatar billede nvr Nybegynder
30. juni 2000 - 10:36 #24
Det var lige nøjagtig "chopperen", der stjal x'et!

Takker for svarene og tålmodigheden. :)
Avatar billede erikjacobsen Ekspert
30. juni 2000 - 10:41 #25
Altid en fornøjelse. Chop bruger man normalt til at fjerne linieskiftet i enden af en linie.
Men den er jo fjernet, når man læser ind med @lines = <...>. Men, jeg havde lavet
filen under DOS (det nogle kalder Windows), og den sætter både CR og LF på. Scriptet
kørte på UNIX hvor Perl fjernede det ene selv, og jeg det andet med chop.

Chop er lidt dum, for den fjerner ALTID det sidste tegn uanset hvad det er. Men den er så nem...
Avatar billede nvr Nybegynder
04. juli 2000 - 10:02 #26
Psssst! Erik, så er der problemer igen! :)

Se http://www.eksperten.dk/spm.asp?id=20435
Avatar billede y2k Nybegynder
09. juli 2000 - 01:33 #27
hej,
hvorfor bruge chop når chomp er bedre til formålet, hvis formålet altså er at fjerne uvedkommende \r'er og \n'er
Avatar billede erikjacobsen Ekspert
09. juli 2000 - 01:47 #28
Fra før verden gik af lave - da man kun brugte Perl på Unix - var det helt naturligt at bruge
chop. I dag skal man tage højde for skøre operativsystemer som DOS (med varianter),
og det er vel derfor man har opfundet noget så degenereret som chomp. Jo, jo, hvis den
havde været nødvendigt, var den da smartere.                      :-)
Avatar billede o-zone Nybegynder
04. februar 2003 - 22:02 #29
Hvorfor ???? hedder overskriften på spørgsmålet "sletning af fil", når det handler om at slette en linie i en fil????

...og nu jeg alligevel ER blevet irriteret, så fatter jeg (stadig) ikke hvad smart der er i at svare i kommentarer ... det er tudse svært hurtigt at scanne sig frem til hvad der er accepteret svar, når det som her f.eks. lyder "Den der chop er vist overflødig. Prøv lige uden."
eller endnu grimmere "svar" og lignende, fordi det rigtige svar er smidt i kommentarer :-(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester