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