René: CSV-Datei - einzelne Zeilen auslesen

Hallo!
Ich brauche einmal einen Lösungsansatz. Ich habe nämlich im Moment absolut keinen blassen Schimmer, wie ich das ganze angehen soll. Hier mein Problem:
Ich habe eine CSV-Datei. Nun möchte ich aber daraus nur die Zeile auslesen, wo in der ersten Spalte die Zahl 3 vorkommt, welche vorher übergeben wird, und dann diese Zeile weiter verarbeiten.
Wie mache ich es, daß nur eine Zeile ausgelesen wird?

Danke!
René

  1. Moin!

    Ich brauche einmal einen Lösungsansatz. Ich habe nämlich im Moment absolut keinen blassen Schimmer, wie ich das ganze angehen soll. Hier mein Problem:
    Ich habe eine CSV-Datei. Nun möchte ich aber daraus nur die Zeile auslesen, wo in der ersten Spalte die Zahl 3 vorkommt, welche vorher übergeben wird, und dann diese Zeile weiter verarbeiten.
    Wie mache ich es, daß nur eine Zeile ausgelesen wird?

    Zeile einlesen, zerteilen, erste Spalte auf die Zahl 3 prüfen - wenn nicht gefunden, dann nächste Zeile einlesen.

    - Sven Rautenberg

    1. Moin!
      Da wir hier im Norden arbeite müssen, beschäftige ich mich auch heute weiter mit meinem Problem. Aber ich bin schon weiter.

      Zeile einlesen, zerteilen, erste Spalte auf die Zahl 3 prüfen - wenn nicht gefunden, dann nächste Zeile einlesen.

      Danke Sven. Mit deiner Hilfe und der von O'Reilly ging das ganz gut. Allerdings verstehe ich etwas nicht. Dieses Script (hier nur der relevante Auszug) hier läuft:

      @Zeilen = ("");

      open(DATEI, "<$Datei") || die "$Quelle nicht gefunden"; #Datei wird  zum auslesen geöffnet

      while (<DATEI>)
              {
              push(@Zeilen, $_);
              }

      close (DATEI);

      for(@Zeilen)
           {
           ($OrdNr, $ArtBld, $ArtNr, $ArtBez, $ArtBeschr, $ArtEUR) = split (/;/,$_);
           print "$OrdNr\n";
           if($OrdNr eq $Nummer)
                          {
                          print "$ArtBeschr\n";
                          }
           }

      wogegen es nicht läuft, wenn ich das print "$OrdNr\n"; for der if-Schleife weglasse.Warum?

      Danke!
      René
      Retrotexteam

      1. use Mosche;

        @Zeilen = ("");

        Du weisst, dass du damit einen Array anlegst, der als erstes Element einen leeren String ('') hat? Das wird wahrscheinlich auch das Problem mit deiner for-Schleife und dem print sein, denn auf einen leeren String läßt sich schwer ein split ausführen, oder? :-) Das print sorgt vielleich dafür, dass die Warnung unterdrückt wird. Es wird dir vielleicht helfen, wenn du in Zukunft deine Scripte mit 'strict' laufen läßt ('use strict;') und die entsprechenden Warnungen beachtest ('use diagnostics;' könnte für den etwas ungeübteren Perler auch hilfreich sein!).

        Ein leerer Array wird mit

        my @array = ();

        angelegt.

        use Tschoe qw(Matti);

  2. Hallo,

    $liste=file("daten.csv");
    for($i=0;$i<length($liste);$i++) {
     $liste[$i]=explode(";",$liste[$i]);
     if ($liste[$i]==3) {
      // bla
     }
    }

    MfG
    Christian

    1. use Mosche;

      $liste=file("daten.csv");
      for($i=0;$i<length($liste);$i++) {
      $liste[$i]=explode(";",$liste[$i]);
      if ($liste[$i]==3) {
        // bla
      }
      }

      Und was für eine Sprache ist das? Perl ist es jedenfalls nicht.

      use Tschoe qw(Matti);

  3. Hoi,

    Ich habe eine CSV-Datei. Nun möchte ich aber daraus nur die Zeile auslesen,
    wo in der ersten Spalte die Zahl 3 vorkommt, welche vorher übergeben wird,
    und dann diese Zeile weiter verarbeiten.
    Wie mache ich es, daß nur eine Zeile ausgelesen wird?

    Nun, es gibt den herkoemmlichen Weg und den "perlschen" Weg. Den herkoemmlichen
    Weg hat Sven beschrieben. Der "perlsche" Weg waere z. B. eine Loesung mit grep:

    my ($zeile) = grep {
      my @lines = split /;/,$_;
      $lines[2] eq 'gesuchter wert';
    } <FILE>;

    Das macht im Grunde dasselbe, aber etwas kuerzer :-)

    Gruesse,
     CK

    1. use Mosche;

      Der "perlsche" Weg waere z. B. eine Loesung mit grep:

      my ($zeile) = grep {
        my @lines = split /;/,$_;
        $lines[2] eq 'gesuchter wert';
      } <FILE>;

      Das macht im Grunde dasselbe, aber etwas kuerzer :-)

      Trifft deine Lösung allerdings nur, wenn genau _einmal_ der gesuchte Wert auftritt. Wenn diese Spalte nicht eindeutig ist, dann ist diese Lösung so nicht drin, denn da werden Lösungen verloren. Mit uneindeutigen Spalten bekommst du die gewünschten mit

      my @zeilen = grep {# wie oben #} <FILE>;

      Die _eigentliche_ Perl Lösung wäre die Benutzung von DBD::CSV, dem Grundsatz folgend, möglichst viel in (Standard-) Module auszulagern.

      use Tschoe qw(Matti);

      1. Hallo Matti,

        Die _eigentliche_ Perl Lösung wäre die Benutzung von DBD::CSV, dem Grundsatz folgend, möglichst viel in (Standard-) Module auszulagern.

        Ob das die ultimative Lösung für das Problem ist, wage ich zu bezweifeln. Ich denke, daß dieses Modul nur dort angebrahct ist, wo eventuell alternativ zu einem wirklichen DBMS auch CSV-Dateien zum Einsatz kommen könnten, und man daher auf das gleiche Interface zurückgreifen will.
        Ansonsten finde ich die von Dir vorgeschlagene Lösung als ziemlcih unperformant, da das DBD-Modul neben dem DBI-Overhead noch einen SQL-Parser benötigt, um dann doch wieder die CSV-Datei voll durchkämmen zu müssen.

        Grüße
          Klaus