Cheatah: Dateibearbeitung (Newbie)

Beitrag lesen

Hi,

ich muss eine textdatei einlesen, die als tabelle aufgebaut ist.

das Format nennt sich CSV, Comma Separated Values (auch wenn es keine Kommas sind, sondern z.B. Tabulatoren).

das problem ist eigentlich nicht das einlesen, sonder das es so viele feldnamen sind, das es über 4 zeilen geht.

Da das Filesystem, mit dem Du arbeitest, nichts vom Konzept "Zeilen" weiß, kann es auch keine Beschränkung für die Länge geben. Speichere also alle Werte eines Datensatzes in _eine_ Zeile.

ich habe schon ein gutes script im forum gefunden, nur liest man da für die feldnamen nur die erste zeile ein, wie kann ich das umstellen so das ich die ersten 4 zeilen als feldnamen einlese?

Indem Du den Lesevorgang vier- statt nur einmal machst. Ich möchte Dir aber davon abraten: Das aktuelle Dateiformat ist suboptimal.

#!/usr/bin/perl

#!/usr/bin/perl -w
use strict;

Anschließend werden Dir viele Fehler genannt werden, die Du korrigieren solltest. Lies hierzu auch

perldoc -f my

@Adressen

perldoc perlstyle (Großschrift in Variablennamen)

= ("");    # Speicher für alle Datensaetze

Du füllst das Array hier mit einem leeren Wert, möchtest aber - vermutlich! - _keinen_ Wert haben. Lass die Quotes weg.

Gewöhn Dir bitte außerdem an, nur dann "Doublequotes" zu verwenden, wenn Du sie _wirklich_ brauchst. Ansonsten wähle 'Singlequotes'.

open(eingabe, "<eingabedatei.txt") || die "Adressendatei nicht gefunden\n";

In den Sterbeschrei solltest Du noch $! einbauen, damit Du den Grund erkennst. Hier ist außerdem so ein Fall, wo Singlequotes angebracht werden; und im Gegensatz zu Variablennamen sollten Handler durchgehend groß geschrieben werden.

while(<eingabe>)              # Kommabegrenzte Datei einlesen

Hier wird nicht die Datei, sondern eine Zeile derselben eingelesen => möglicher Ansatzpunkt

{
  if($i == 0)                  # erste Zeile der Datei einlesen

Auch die Klammernsetzung (sowohl geschweifte als auch runde - im Gegensatz zu open() ist if keine Funktion) solltest Du in perldoc perlstyle nachlesen.

$Felder = $_;              # Feldnamen ermitteln

Wenn die Datei einzeilige Datensätze enthält, kannst Du dies ohne if-Prüfung vor der while-Schleife machen. Außerdem empfehle ich perldoc perlvar, speziell "$.".

$Adressen[$i] = $_;        # ab zweiter Zeile in @Adressen einlesen

Schön - viele begehen den Fehler, hier @array[$index] mit "@" zu sagen :-)

$i++;                        # Datensatzzähler erhöhen
$Anzahl = $i - 1;              # Anzahl Datensätze merken

Was mit "+" geht, geht auch mit "-".

chop($Felder);

Veraltet. Siehe perldoc -f chomp

open(OUT, ">ausgabe.txt");   # HTML-Datei zum Schreiben öffnen

Singlequotes mal wieder; außerdem sollte hier unbedingt auch ein "or die" hin.

@Datensatz = split(/,/,$_);         # Aktuellen Datensatz aufdröseln

Nebenbei: $_ ist hier implizit.

print OUT "$Datenfelder[$i]";   # Aktuellen Datensatz schreiben

perldoc perlfaq4
What's wrong with always quoting "$vars"?

print OUT "\n";
    print OUT "$Datensatz[$i]";   # Aktuellen Datensatz schreiben

Die drei Zeilen gehen übrigens auch in eine.

$i++;

Warum minnst Du eigentlich gleich eine "for (my $i=0; ...)"-Schleife?

close(OUT);

Bei Schreibzugriffen solltest Du auch beim abschließenden close() unbedingt Fehler abfangen.

Cheatah