Schrift
[thread]12907[/thread]

String Matching einer Zeile



<< >> 4 Einträge, 1 Seite
MatthiasW
 2008-12-14 13:48
#117214 #117214
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Hast du den Code irgendwo im Internet zusammengesucht?

1. Du solltest deinem Programm eine Shebang-Zeile hinzufügen.

2. $out1 hieße besser $in, da ja eingelesen und nicht - wie bei $out - geschrieben werden soll.

3. In deinem if-Statement versuchst du auf das Dateihandle $out1 einen RegEx zu matchen. Eigentlich möchtest du aber auf die jeweilige Zeile einen RegEx matchen, dazu musst du $out1 durch $_ ersetzen, oder $out1 und das =~ weglassen.

4. Einen RegEx definiert man durch m// (das / kannst du auch mit einem anderen Zeichen ersetzen, Klammern gehen auch). Benutzt man / als Trenner braucht man allerdings das m vorweg nicht mehr.

Innerhalb deines RegEx:
1. Anstelle von Leerzeichen, solltest du \s+ verwenden, weil du dir nicht sicher sein kannst wie viel Platz zwischen den Einträgen ist.

2. Die \d{1,3} sollten lieber \d+ heißen, schließlich kann es ja auch mal längere Zahlen geben.

3. \.\d* prüft auf einen Punkt, gefolgt von beliebig vielen Ziffern, das ist aber nicht was du möchtest. Du brauchst folgendes: (?:\.\d+)?

4. Wieso setzt du Slashes vor die runden Klammern?

edit: 5. Du solltest am Anfang und am Ende des RegEx einen Anker setzen: ^...$

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Gast Gast
 2008-12-14 05:25
#117220 #117220
Hallo,

ich habe ein Textdatei indem mehrere Zeilen sind...
Aus diesen Zeilen möchte ich nur bestimmte Zeile auslesen...

Die Zeilen sehen so aus:
Code: (dl )
1
2
3
4
1.0        2        1.27      16.014     37   12.1   4.0
2.0 12.8 1.27 16.014 37 13.4 1.1
3.0 4.0 1.29 7.558 54 15.1 2.1
4.0 2.2 1.41 7.294 31 12.1 3.3


Ich möchte die Spalte mit 12.1, 13.4 usw speichern...

Mein Code momentan ist:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use strict;
use warnings;

open my $out1, '<', 'out1.txt' or die $!;
open my $out, '>', 'out.txt' or die $!;

while(<$out1>)
{
                        
        if($out1 =~  \d{1,3}\.\d*  \d{1,3}\.\d* \d{1,3}\.\d* \d{1,3}\.\d*  \d{1,3}\.\d* /( \d{1,3}\.\d*)/  \d{1,3}\.\d* )  
        {       
                  print "$1\n";         
        }
else{
        print "keine Werte\n";
      }          
}
close($out1);
close($out);

Leider kann ich hiermit die Spalten nicht speichern bzw ausgeben lassen, was mache ich denn hier falsch ?

Kann mir jemand behilflich sein dabei ?
Gast Gast
 2008-12-14 20:53
#117242 #117242
besser so:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use strict;
use warnings;

open my $in, '<', 'out1.txt' or die $!;
open my $out, '>', 'out.txt' or die $!;

while(my $line=<$in>)
{
  my @elemts=split(/\s+/,$line);
  if(@lements > 5)  
  {
    print $elemts[5]."\n";
  }
  else
  {
    print "keine Werte\n";
  }          
}
close($in);
close($out);


oder so:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use strict;
use warnings;

open my $in, '<', 'out1.txt' or die $!;
open my $out, '>', 'out.txt' or die $!;

while(my $line=<$in>)
{
  if($line=~/\A(?:[\d\.]+\s+){5}([\d\.]+)/)
  {
    print "$1\n";
  }
  else
  {
    print "keine Werte\n";
  }          
}
close($in);
close($out);
Gast Gast
 2008-12-16 14:54
#117287 #117287
Super...

Vielen Dank an Euch....
<< >> 4 Einträge, 1 Seite



View all threads created 2008-12-14 05:25.