tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Enumerator
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
3338
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    chill0r55555 chill0r55555 ist offline Mitglied Silber
    Registriert seit
    Jan 2007
    Beiträge
    73
    Guten Abend an Alle,

    ich steh grad vor einem für mich eher großem Problem. Ich habe eine Datei (datei1.txt) dort stehen Werte mit einem Tabulator getrennt drinnen. Also so:

    datei.txt
    Code :
    1
    2
    3
    4
    
     
    test     123
    bla1     478
    bla2     720


    Dann hab ich eine 2te Datei (datei2.txt). Diese sieht so aus:

    Code :
    1
    2
    3
    
    test     test.htm
    bla1     bla1.htm
    bla2     bla2.htm
    Die Werte sind auch hier mit einem Tabulator getrennt.

    Ich möchte nun realisieren, dass ich Datei1 einlese und in ein Array speichere. Es kommt mir hier auf die erste Spalte an.
    Dann möchte ich in der 2ten Datei nach den Werten (test,bla1,bla2) in Datei2 suchen.
    Wenn ich nun einen Treffer habe, dann soll der dazugehörige Zahlenwert aus Datei1 ans Ende der Zeile in Datei 2 geschrieben werden.
    Als Beispiel:

    Datei1
    Code :
    1
    
    test[TABULATOR]123

    Nun suche ich nach "test" in Datei 2. Ich erhalte einen Treffer und schreibe den Wert von test (123) ans Ende der Trefferzeile in Datei 2.

    Datei2
    Code :
    1
    2
    3
    
    test[TABULATOR]test.htm[TABULATOR]123
    bla1[TABULATOR]bla1.htm
    bla2[TABULATOR]bla2.htm

    Leider klappt das einlesen mit meiner Methode auch noch nicht so ganz
    Es werden mir mit diesem Code immer nur die letze Zeile der Datei 1 ausgegeben:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    open (DATEI, "<datei1.txt") || die "Datei wurde nicht gefunden\n"; # einlesen der datei
    while(<DATEI>) #während des einlesens....
    { 
    @temp = split (/\t/, $_ ); #am tab trennen der aktuellen zeile
    }
    close (DATEI); # datei schließen
     
    #ausgabe...
     
    for ($i=0;$i<@temp;$i++){
    print "$temp[$i]\n";
    }

    Ich hoffe das war nun verständlich ausgedrückt und mir kann einer sagen wie ich hier vorgehen könnte. Ich bedanke mich schonmal im vorraus.

    mfg
     

  2. #2
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Abend!
    Wie wär's damit?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    
    #!/usr/bin/perl
    #
    # strict sieht einfach bessa aus ...
    # ---
     
      use strict;
     
    # ---
    # allerdings müssen wir jetzt alles "deklarieren"...
    # ---
     
      my @tempEinz = ();    my $datei;
      my @tempZwei = ();    my $count = 0;
     
    # ---
    # ok, lass uns mal die zwei dateien einlesen. leider müssen wir die arrayglättung umgehen.
    # ---
     
      open ($datei, '<', 'datei1.txt') or die "Datei1 wurde nicht gefunden\n";
      while(<$datei>)
      {
        chomp;
        @{$tempEinz[$count++]} = split("\t", $_);
      }
      close $datei;
     
      $count = 0;
     
      open ($datei, '<', 'datei2.txt') or die "Datei2 wurde nicht gefunden\n";
      while(<$datei>)
      {
        chomp;
        @{$tempZwei[$count++]} = split("\t", $_);
      }
      close $datei;
     
    # ---
    # jetzt überprüfen wir die gemeinsamkeiten und schreiben auch gleich die dritte datei.
    # natürlich kann das auch wieder datei 2 sein, aber erstmal testen ;-)
    # ---
     
      open ($datei, '>', 'datei3.txt') or die "Datei 3 blabla\n";
     
      for(my $i=0; $i <= $#tempZwei; ++$i)
      {
        print $datei join "\t", @{$tempZwei[$i]};
     
        for(my $j=0; $j <= $#tempEinz; ++$j)
        {
            if(@{$tempEinz[$j]}->[0] eq @{$tempZwei[$i]}->[0])
            {
                print $datei ("\t".@{$tempEinz[$j]}->[1]);
            }
        }
     
        print $datei "\n";
      }
     
      close $datei;
     
    # ---
    # soo, jetzt geben wir noch eine schöne EINZ zurück und wenn ich mich zu so später stunde nicht
    # total vertippt habe und dein prob richtig verstanden ... hast du jetzt keins mehr
    # ---
     
      1;
    __END__

    Mfg
    Enum
    Geändert von Enumerator (19.03.08 um 13:04 Uhr) Grund: Schönheitsfehler...
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  3. #3
    chill0r55555 chill0r55555 ist offline Mitglied Silber
    Registriert seit
    Jan 2007
    Beiträge
    73
    Hallo,
    ich danke dir das du so schnell geantwortet hast.
    Leider funktioniert das ganze noch nicht so ganz.

    Hier sind mal die Origininal Dateien (Anhang). Prinzip ist das gleiche wie oben beschriebn, nur dass ich dort Dummy Daten benutzt habe. Ich kenn mich leider noch nicht so aus mit Perl aber ich denke der Fehler liegt auch an dem komemntar in datei2.txt


    mfg
    Angehängte Dateien Angehängte Dateien
     

  4. #4
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Also, das ist natürlich ein Problem. Du kannst die Kommentarzeilen mit einem eindeutigen String einleiten (wie z.B. '--', das scheint ja so zu sein...) und mit Requlären ausdrücken abfangen und als komplette Zeile speichern. Allerdings musst Du dann wiederum bei der Ausgabe den Typ der Zeile (Array/Skalar) abfragen und enstprechend handeln...
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    
    #!/usr/bin/perl
    #
    # strict sieht einfach bessa aus ...
    # ---
     
      use strict;
     
    # ---
    # allerdings müssen wir jetzt alles "deklarieren"...
    # ---
     
      my @tempEinz = ();    my $datei;
      my @tempZwei = ();    my $count = 0;
     
    # ---
    # damit werden kommentarzeilen EINDEUTIG eingeleitet:
    # ---
     
      my $kommentar = '--';
     
    # ---
    # ok, lass uns mal die zwei dateien einlesen. leider müssen wir die arrayglättung umgehen.
    # ---
     
      open ($datei, '<', 'datei1.txt') or die "Datei1 wurde nicht gefunden\n";
      while(<$datei>)
      {
        chomp;
     
        if($_=~ /$kommentar.*/) 
        {
            $tempEinz[$count++] = $_;
        }
        else
        {
            @{$tempEinz[$count++]} = split("\t", $_);
        }
      }
      close $datei;
     
      $count = 0;
     
      open ($datei, '<', 'datei2.txt') or die "Datei2 wurde nicht gefunden\n";
      while(<$datei>)
      {
        chomp;
     
        if($_=~ /$kommentar.*/)
        {
            $tempZwei[$count++] = $_;
        }
        else
        {
            @{$tempZwei[$count++]} = split("\t", $_);
        }
      }
      close $datei;
     
    # ---
    # jetzt überprüfen wir die gemeinsamkeiten und schreiben auch gleich die dritte datei.
    # natürlich kann das auch wieder datei 2 sein, aber erstmal testen ;-)
    # ---
     
      open ($datei, '>', 'datei3.txt') or die "Datei 3 blabla\n";
     
      for(my $i=0; $i <= $#tempZwei; ++$i)
      {
        if(ref($tempZwei[$i]))
        {
            print $datei (join "\t", @{$tempZwei[$i]});
     
            for(my $j=0; $j <= $#tempEinz; ++$j)
            {
                if(ref($tempEinz[$j]))
                {
                    if(@{$tempEinz[$j]}->[0] eq @{$tempZwei[$i]}->[0])
                    {
                        print $datei ("\t".@{$tempEinz[$j]}->[1]);
                    }
                }
            }
        }
        else { print $datei $tempZwei[$i]; } print $datei "\n" unless $i == $#tempZwei;
      }
     
      close $datei;
     
    # ---
    # so...
    # ---
     
      1;
    __END__

    Mfg
    Enum
    Geändert von Enumerator (19.03.08 um 13:13 Uhr)
    chill0r55555 bedankt sich. 
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  5. #5
    chill0r55555 chill0r55555 ist offline Mitglied Silber
    Registriert seit
    Jan 2007
    Beiträge
    73
    Wow
    Ich danke dir vielmals! Das ist genu was ich gebraucht habe. Werd das ganze jetz noch schön Zeile für Zeile durchgehn um zu verstehn was genau gemacht wird. Ich will ja auch was lernen.

    Danke nochmals
     

  6. #6
    chill0r55555 chill0r55555 ist offline Mitglied Silber
    Registriert seit
    Jan 2007
    Beiträge
    73
    Hallo,

    ich bin bei dem nun fertigen Skript auf ein Problem gestoßen.
    Undzwar prüft er ja hier ob die Vorkommen in Array1 und Array2 an der Stelle 0 gleich sind.
    Sollte dies der fall sein, dann hängt er mir den Wert aus Datei1 in Datei2 hinten an mit ein davor eingefügten Tabulator.

    Code :
    1
    2
    3
    4
    
    if(@{$tempArray1[$j]}->[0] eq @{$tempArray2[$i]}->[0])
    {
    print $datei ("\t".@{$tempArray1[$j]}->[1]);
    }

    Wenn ich nun aber den Wert in Datei1 ändere, dann wird mir der neue Wert an den alten angehängt mit vorrausgegehndem Tabulator in Datei2. Ich habe probiert die den alten Wert in Datei2 zu überschreiben, bin hier aber leider gescheitert:

    Code :
    1
    2
    3
    4
    
    if(@{$tempArray1[$j]}->[0] eq @{$tempArray2[$i]}->[0])
    {
    print $datei (@{$tempArray1[$j]}->[1]);
    }

    Was mache ich hier flasch?

    MfG
     

  7. #7
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Moin!

    Wenn ich Dich richtig verstanden habe, löst das hier das Problem. Allerdings werden nun zwar alte Werte ersetzt, doch fehlt der alte Wert in Datei1, wird er auch in Datei2/3 beseitigt.
    Code :
    1
    
    print $datei @{$tempZwei[$i]}->[0] ."\t". @{$tempZwei[$i]}->[1];
    Das könnte man natülich auch vermeiden, doch ich glaube so macht es mehr Sinn - oder?

    Gruß
    Enum

    PS: Die zu ändernde Zeile ist diese:
    Code :
    1
    
    print $datei (join "\t", @{$tempZwei[$i]});
    Beachte bitte, dass Du evtl. Fehler bekommst, sollte die Zeile in Datei2 vorher nicht in dem von Dir oben definierten Format ([WERT][TAB][WERT]....) vorliegen. In diesem Fall kann es passieren, dass
    Code :
    1
    
    @{$tempZwei[$i]}->[1]
    nicht existiert...
    Geändert von Enumerator (28.03.08 um 03:37 Uhr)
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

Ähnliche Themen

  1. Perl: .gz Datei entpacken / einlesen
    Von dtm im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 1
    Letzter Beitrag: 29.11.09, 14:12
  2. [Perl] Regulärer Ausruck mit Tabulator
    Von chill0r55555 im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 4
    Letzter Beitrag: 17.07.09, 14:15
  3. [Perl] Script zum Einlesen einer Datei
    Von mkoeni1 im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 3
    Letzter Beitrag: 25.04.09, 14:37
  4. Tabulator getrennte Datei?
    Von Muckel1986 im Forum PHP
    Antworten: 5
    Letzter Beitrag: 12.12.08, 19:23
  5. perl: während dem einlesen einer datei zeilen löschen
    Von renslow im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 1
    Letzter Beitrag: 01.09.08, 11:29