Tabelle einlesen und wieder ausgeben

26/12/2012 - 23:12 von Andre Tann | Report spam
Hallo zusammen,

ich möchte folgende Tabelle einlesen und wieder ausgeben:

a1 \t b1 \t c1
a2 \t b2 \t c2
...

Der Feld-Separator ist also Tab, der Zeilen-Separator ist Newline.

So lese ich ein:

open ($fh,"<","tabelle");
for (<$fh>) {
chomp;
@line = split ("\t");
push @table, [@line];

}



Wie ist denn nun der eleganteste Weg, die Tabelle exakt im
Ursprungsformat wieder auszugeben?

Muß man wirklich zwei Schleifen in dieser Art bauen:

for $row (@table) {
for ($col=0;$col<=$#{$row};$col++) {
print ${$row}[$col];
if ($col<$#{$row}) { print "\t"; } else { print ""; }
}
}

Oder geht das auch eleganter?

Ich habe da AWK mit seinen Variablen FS bzw. OFS und RS bzw. ORS vor
Augen, die das Einlesen und Ausgeben von Tabellen sehr einfach machen.


Danke für's mitdenken und einen Tip!
Andre Tann
 

Lesen sie die antworten

#1 Peter J. Holzer
26/12/2012 - 23:26 | Warnen spam
On 2012-12-26 22:12, Andre Tann wrote:
Hallo zusammen,

ich möchte folgende Tabelle einlesen und wieder ausgeben:

a1 \t b1 \t c1
a2 \t b2 \t c2
...

Der Feld-Separator ist also Tab, der Zeilen-Separator ist Newline.

So lese ich ein:

open ($fh,"<","tabelle");
for (<$fh>) {
chomp;
@line = split ("\t");
push @table, [@line];

}



Besser:

for (<$fh>) {
chomp;
my @line = split ("\t");
push @table, \@line;

}


Wie ist denn nun der eleganteste Weg, die Tabelle exakt im
Ursprungsformat wieder auszugeben?

Muß man wirklich zwei Schleifen in dieser Art bauen:

for $row (@table) {
for ($col=0;$col<=$#{$row};$col++) {
print ${$row}[$col];
if ($col<$#{$row}) { print "\t"; } else { print ""; }
}
}

Oder geht das auch eleganter?



Ja, wesentlich:

for my $row (@table) {
say join("\t", @$row);
}

Das làsst sich noch weiter vereinfachen:

say join("\t", @$_) for (@table);


hp

PS: Ist sicher ausgeschlossen, dass ein Tab oder Newline in einer Zelle
vorkommt? Wenn nein, wie wird das dargestellt? CSV-Formate sind in der
Praxis oft komplizierter, als es den Anschein hat, und der Einsatz von
Text::CSV (bzw. _XS) lohnt sich.

_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | Sysadmin WSR | Man feilt solange an seinen Text um, bis
| | | | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel

Ähnliche fragen