Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8789[/thread]

Newbie: Tabelle einlesen mit regulären Ausdrücken: Tabelle einlesen mit regulären Ausdrück



<< >> 6 Einträge, 1 Seite
Gast Gast
 2007-02-25 23:16
#74585 #74585
Hallo zusammen,

ich habe am WE mit der Perl-Programmierung begonnen und schon recht viel zustande gebracht. Jetzt habe ich aber gerade zwei Probleme beim Einlesen einer Datei, bei denen ich nicht weiterkomme:
1.) Ich will eine Datei mit 11 Spalten einlesen, die rechtsbündig formatiert sind. Als Trennzeichen dienen Leerzeichen. Die Werte der elf Spalten sollen in Variablen $vi abgelegt werden (i=1..11)
Ein Split der Art:
Code: (dl )
($v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10, $v11)) = split (/\s+/, $i);

tut mit Ausnahme der ersten Spalte. Da die Tabelle rechtsbündig formatiert ist und insgesamt 5 Zeichen eine Spalte bilden kommt es vor, dass eine Zeile mit einem Leerzeichen oder einem anderen Zeichen beginnt. Wenn die Zeile mit einem Leerzeichen beginnt (wenn der Inhalt der ersten Spalte weniger als 5 Zeichen groß ist), dann ist $v1 leer und $v2 enthält den Wert, der eigentlich in $v1 stehen sollte. Der elfte Wert der Tabelle verschwindet dann :(.
Mein Versuch mit regulären Ausdrücken:
Code: (dl )
($Zellnr, $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $ctab, $mate)= $i =~/(\S+)\s+(S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/;

läuft nicht: Use of uninitialized value in concatenation (.) or string
Warum verstehe ich nicht ganz, wie kann ich einen solchen Typ Tabelle korrekt einlesen? Gibt es so etwas wie formatiertes Lesen ähnlich wie bein Schreiben mit write?

2.) Die Variable $v10 brauche ich eigentlich nicht, $v11 aber schon. Ich bekomme immer eine Warnung: Name "main::v10" used only once: possible typo. Wi eläde ich das?

Danke
BastiL
Ronnie
 2007-02-25 23:54
#74586 #74586
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Verwende ein Array, anstatt einzelne Variablen:
Code: (dl )
1
2
3
4
use Data::Dumper;

my @line = split (/\s+/, $i);
print Dumper \@line;

Zeige ein paar Beispiel-Zeilen der Daten, die dein Problem veranschaulichen.
betterworld
 2007-02-26 01:49
#74587 #74587
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
BastiL wurde im IRC zu einer Loesung verholfen.  Daher macht Euch keine Muehe, hier viel zu antworten.\n\n

<!--EDIT|betterworld|1172447445-->
renee
 2007-02-26 09:02
#74588 #74588
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wäre nett, wenn die Lösung auch hier erscheinen würde...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Dubu
 2007-03-10 02:22
#74589 #74589
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Die einfachste Lösung ist, split " ", $i statt split /\s+/, $i zu benutzen. Das "magisch gequotete" Leerzeichen sorgt dafür, dass wie bei awk(1) gesplittet wird, d.h. führender Whitespace wird ignoriert.

Ich weiß aber nicht, ob das die Lösung im IRC war.
Linuxer
 2007-03-10 13:16
#74590 #74590
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Hi,

wenn die Spaltenbreite bekannt ist und es keine Abweichungen davon gibt, dann kann man das auch mit unpack machen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;

while ( <DATA> ) {
# 5 Zeichen breite Spalten; davon insgesamt 11
# entferne aus jeder Spalte die Leerzeichen
# (setzt natuerlich voraus, dass Leerzeichen nur "Füllzeichen" sind
# und nicht in den eigentlichen Werten enthalten sind)
# speichere die 11 Spalten in @data
my @data = map { tr/ //d; $_ } unpack( "A5"x11, $_ );

# tu was mit den 11 Werten
print join($/, @data), $/;

}


__DATA__
1 2 3 4 5 6 7 8 9 10 11
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< >> 6 Einträge, 1 Seite



View all threads created 2007-02-25 23:16.