steve: Array durchsuchen

Hallo liebe Leut,

habe folgendes Problem: Ich habe eine Textdatei, wobei jede Zeile einem Datensatz entspricht. Getrennt sind die Felder mit dem Zeichen "|"

Nr. Vorname Nachname

1|stefan|meier
2|otto|mueller
3|sabine|bauer
4|heidi|bach

Nun muss ich z.B. zwischen Satz 3 und 4 einen weiteren einfügen.
Dieser neue Satz soll die Nummer 3.1 erhalten.

1|stefan|meier
2|otto|mueller
3|sabine|bauer
3.1|walter|jansen
4|heidi|bach

Nun kann es vorkommen, das wieder ein Satz zwischen 3 und 4 eingefügt werden muss. Dieser soll nun die Nummer 3.2 erhalten

1|stefan|meier
2|otto|mueller
3|sabine|bauer
3.1|walter|jansen
3.2|evi|albert
4|heidi|bach

Und wenn sowas gegeben ist:

1|stefan|meier
2|otto|mueller
3|sabine|bauer
3.1|walter|jansen
3.2|evi|albert
3.4|herman|otto
4|heidi|bach

Dann soll ein neuer Satz zwischen 3 und 4 die Nummer 3.5 haben.

Wie kann maan das elegant lösen?

Mein Versuch:

open(DATA, "<$daten") || die("can't open/read $daten, $!");

@allRec = <DATA>; # alle Daten in ein Array kopieren

foreach $dataRec (@allRec) # Array durchlaufen
{
 ($entry{"nr"},$rest) = split(/|/,$dataRec);

if ($entry{"nr"} ne $gFormCtrl{"commentTo"})
 {
  $foundID = 0;
  push(@allRecTMP,$dataRec);
  # nicht gefunden => Satz in Hilfsarray koieren
 }
 else
 {
  $foundID = 1;
  # gefunden
 }
}

Meine Frage: Wie kann man die nächste fortlaufenden Nummer finden?

Weiss jemand eine Lösung?

Danke,
Steve

  1. Hi

    if ($entry{"nr"} ne $gFormCtrl{"commentTo"})
    {
      $foundID = 0;
      push(@allRecTMP,$dataRec);
      # nicht gefunden => Satz in Hilfsarray koieren
    }
    else
    {
      $foundID = 1;
      # gefunden
    }
    }

    Meine Frage: Wie kann man die nächste fortlaufenden Nummer finden?

    Was auch immer du da vor hast:

    if($entry{"nr"}=~/^\d$/) {
      $nextnumber = $entry{"nr"}.".1";
    } else {
      $entry{"nr"} =~ s/^(\d+.)(\d+)$/; # Die vollen Zahlen und zehntel splitten (Würde auch mit split gehen).
      $nextnumber = $2 + 1; # Die alte zehntel plus 1/10.
      $entry{"nr"}=$1.$nextnumber; # Und wieder zusammensetzen
    }

    Gruß
    csx

    1. Hi csx,

      ja so einfach ist das nicht.

      if($entry{"nr"}=~/^\d$/) {
        $nextnumber = $entry{"nr"}.".1";
      } else {
        $entry{"nr"} =~ s/^(\d+.)(\d+)$/; # Die vollen Zahlen und zehntel splitten (Würde auch mit split gehen).
        $nextnumber = $2 + 1; # Die alte zehntel plus 1/10.
        $entry{"nr"}=$1.$nextnumber; # Und wieder zusammensetzen
      }

      Nimm das Beispiel:

      1|stefan|meier
      2|otto|mueller
      3|sabine|bauer
      3.1|walter|jansen
      3.2|evi|albert
      4|heidi|bach

      Die Anwendug soll einen neuen Unterpunkt 3 einfügen. In diesem Beispiel nach 3.2

      Der neue Satz soll somit die Nummer 3.3 haben.

      Ich glaub ich hab die Lösung. Suchen im Array nach gesuchter Nummer+1
      Dann Zeilennummer x-1 auslesen und dann deinen Code anwenden. Das müsste gehen!

      Bye,
      Steve

      1. Hi

        Die Anwendug soll einen neuen Unterpunkt 3 einfügen. In diesem Beispiel nach 3.2

        Der neue Satz soll somit die Nummer 3.3 haben.

        Ich glaub ich hab die Lösung. Suchen im Array nach gesuchter Nummer+1
        Dann Zeilennummer x-1 auslesen und dann deinen Code anwenden. Das müsste gehen!

        Ups, ich dachte dein Code den du gepostet hattest würde die betrffende Stelle suchen und in $entry{'nr'} speichern. Hätte ich mir doch etwas genauer angucken sollen :o)

        Gruß
        csx