Anzeige:
Ergebnis 1 bis 10 von 10

Thema: Ersetzen einzelner Zeilen einer Textdatenbank mit Perl?

  1. #1
    antimon
    Gast

    Question Ersetzen einzelner Zeilen einer Textdatenbank mit Perl?

    Hi,

    sagt mal, wie funzt das Ersetzen einzelner Zeilen einer Textdatenbank mit Perl??
    Ich habe eine Textdatei, in der in jeder Zeile eine Nummer von 11-100 steht, danach folgt ein Doppelpunkt und danach steht ein Name, also z.B. so:

    11:Martin
    12:Matthias
    ...

    Ich möchte damit einen Sitplan realisieren, bei dem sich jeder online eintragen kann.
    Wenn noch niemand auf einem Platz sitzt, ist der Eintrag rechts neben dem Doppelpunkt leer. Die Zahlen links sind die Platznummern.

    Wenn sich jemand z.B. den Platz 51 reservieren will, soll die Zeile, die mit "51" beginnt, gesucht werden und durch "51:Username" ersetzt werden. Will jemand den Platz doch nicht mehr haben, soll wiederum die Zeile mit "Platznummer:Username" gesucht und durch "Platznummer:" ersetzt werden.

    Ich habe schon vergeblich nach Hilfe in meinem Perl-Buch gesucht, aber nix gefunden.

    Könnte mir jemand von Euch helfen???

    Thx,
    Antimon

  2. #2
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Hallo!

    Es gibt im Prinzip zwei Möglichkeiten, die zwar gundsätzlich gleich sind, aber sich darin unterscheiden, ob die Text-Datenbank sehr groß ist/wird.

    a) Du lädst die komplette Datei ein und bearbeitest das ganze im Speicher um dann die Daten wieder geändert in die Datei zu speichern.

    b) Du bearbeitest die Datei zeilenweise (jede Zeile einzeln einlesen und ebarbeiten) und speicherst die bearbeiteten Daten erst in eine temp. Datei und kopierst diese dann um.

    Wenn möglich, empfehle ich a) !

    Hier die eigentliche Bearbeitung mit Möglichkeit a). Bei b) mußt du das ganze entsprechend anpassen und ändern.

    Code:
    my $DBName = "file.tdb";
    my @DBData = ();
    
    # MAIN
    ######
    
    # erst mal Datanbank einlesen...
    &LoadDB;
    
    # Hier jetzt User add oder delete...
    &AddUser(12, "Dieter Müller");
    &DeleteUser(53);
    
    &SaveDB;
    
    exit 0;
    
    # Funktionen
    ############
    
    sub LoadDB()
    {
      if (open(TDBFILE,"<$DBName")
      {
      my @TextDB = ();
      my $DBEntry;
    
        @TextDB = &lt;TDBFILE&gt;;
        close(TDBFILE);
    
        foreach $DBEntry (@TextDB)
        {
        my ($PEntry,$UserName) = split(/:/, $DBEntry);
    
          # Ich gehe davon aus, das die Einträge durchgehend sind...
          push(@DBData, $UserName);
        }
      }
      else
      {
      # Hier Fehlerbehandlung...
      }
    }
    
    sub SaveDB()
    {
      if (open(TDBFILE,"<$DBName")
      {
      my $i;
    
        for(i = 0; $i < $#DBData; $i++)
        {
          print TDBFILE "$i:$DBData[$i]\n";
        }
        close(TDBFILE);
      }
      else
      {
        # Fehlerbehandlung...
      }
    }
    
    # Hier kommen jetzt Funktionen zum hinzufügen oder entfernen eines Users
    sub AddUser($Entry, $User)
    {
    my ($Entry, $User) = @_;
    
      $DBData[$Entry] = $User;
    }
    
    sub DelUser($Entry)
    {
    my ($Entry) = @_;
    
      $DBData[$Entry] = "";
    }
    Falls die Einträge in der Text-Datenbank nicht durchgehend ihrer Nummer sind, solltest du für @DBData eine Hash-Table (%DBData) benutzen.

    Gruß

    Robert


    [Diese Nachricht wurde von robert am 22. Februar 2000 editiert.]

  3. #3
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Sorry, kleine Korrektur...

    Bei SaveDB statt $#DBData lieber (scalar @DBData) schreiben, oder du mußt statt kleiner ein kleiner-gleich davor einsetzen!

    Gruß

    Robert

  4. #4
    antimon
    Gast

    Smile

    Danke für die Antwort, Robert.

    Wenn das Skript läuft, kann ich dir ja die Adresse sagen.

    Ich arbeite nämlich gerade an einem Sitzplan für unsere nächste LAN-Party, wozu ich dich recht herzlich einlade ;-)))
    Auf diesem soll es möglich sein, einen bereits reservierten Platz wieder freizumachen.

    Danke schön für den Hinweis!

  5. #5
    Hagen von Tronje
    Gast

    Post

    Hi,

    Roberts a) b) Antwort erweckt den Eindruck,
    der Compi wuerde tatsaechlich die Datei
    zeilenweise einlesen, was nicht stimmt
    -> Cache, Read-Ahead.

    Hagen

  6. #6
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Antimon...

    Du warst nicht zufällig letztes WE auf einer LAN-Party in Paderborn, oder?

    Robert

  7. #7
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Post

    Hagen,

    es gint nicht darum wie und ob er es so einliest, sondern um die Art der Verarbeitung.
    Man kann das ganze auch so umbauen, das die Daten Zeilen-Weise verarbeitet werden und direkt geändert werden.

    input to output

    Robert

  8. #8
    antimon
    Gast

    Post

    Nee, aber wir veranstalten hier in Bayern, südlich von München Netzwerkparties. Wenn du kommen möchtest, kannst du das gerne tun (www.langame.de).

    Wäre mal toll, jemand von Euch kennenzulernnen...

  9. #9
    Registrierter Benutzer Avatar von reno
    Registriert seit
    24.05.1999
    Ort
    Hohenpeißenberg
    Beiträge
    67

    Post

    Da hab' ich's ja nicht weit von Hohenpeißenberg.

    Hack on


    ------------------
    Gruss Reno

  10. #10
    Registrierter Benutzer
    Registriert seit
    21.06.1999
    Beiträge
    677

    Post

    Warum machst du sowas mit Perl??????
    (von hinten durch die Brust ins Auge?)

    Mit sed geht das viel einfacher:

    sed "s/\(^51:\).*/\1username/"

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •