Font
[thread]8418[/thread]

Werte an der 6-ten Tab-stelle auslesen



<< |< 1 2 >| >> 18 entries, 2 pages
guest Gast
 2006-10-16 02:04
#70781 #70781
Hallo!
Ich bin leider noch Perl-Anfänger und habe folgendes Problem.
Ich habe eine Datei, die pro zeile Werte hat, die durch Tab getrennt sind.
Nun möchte ich den Wert an der 6ten Tab-stelle jeder Zeile auslesen bzw. später in eine Datei kopieren, wenn dieser Wert 1 ist .
Es sieht in etwa so aus:
120 0 1 1 0 1 0.5 12
130 1 0 0 0 0 0.4 8
etc.
Kann mir jemand weiterhelfen bzw. einen Tipp geben, wo ich mich da einarbeiten kann.
Wäre echt prima
Susanne
topeg
 2006-10-16 02:34
#70782 #70782
User since
2006-07-10
2611 articles
BenutzerIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;

my $datei=shift(@ARGV) or die "$0 dateiname";

open(DATEI,'<',$datei) or die "Konnte $datei nicht lesen ($!)\n";
while (my $line=<DATEI>)
{
@elemete=split(/\t/,$line);
if($elemente[6] == 1)
{
print "Die Zeile: |$line| enthält ander sechsten Stelle eine 1\n";
}
}
close(DATEI);
betterworld
 2006-10-16 05:09
#70783 #70783
User since
2003-08-21
2613 articles
ModeratorIn

user image
Im Code von topeg muesste man kurz vor der while-Schleife noch so etwas wie "my @elemente;" schreiben, ansonsten muesste es funktionieren.

Die betreffenden Zeilen dann in eine andere Datei zu schreiben, sollte auch verhaeltnismäßig leicht sein. Wenn Du noch damit Probleme hast, zeig uns bitte mal Deinen Ansatz. Dann koennen wir sehen, womit wir helfen koennen, und muessen nicht den ganzen Code selbst schreiben. Dabei wuerdest Du ja auch nichts lernen.
Wiki:Wie Frage Ich bei PerlCommunity?\n\n

<!--EDIT|betterworld|1160961088-->
topeg
 2006-10-16 09:29
#70784 #70784
User since
2006-07-10
2611 articles
BenutzerIn

user image
Ach komm schon, Code ohne Fehler ist doch langweilig. :-) Da braucht er dann doch nicht mehr nach zu denken. Ein kleiner Fehler muß immer drin sein. ;-)
bloonix
 2006-10-16 10:20
#70785 #70785
User since
2005-12-17
1615 articles
HausmeisterIn
[Homepage]
user image
Code: (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;

my @treffer;
my $suche  = 1;
my $spalte = 5;
my @zeilen = (
  "120\t0\t1\t1\t0\t1\t0.5\t12",
  "130\t1\t0\t0\t0\t0\t0.4\t8",
  "130\t1\t0\t0\t0\tD\t0.4\t8",
);

while (defined (my $line = shift @zeilen)) {
  my $wert = (split/\t/, $line)[$spalte];
  push @treffer, $wert
     if $wert =~ /^$suche$/;
  # hier verwende ich mit Absicht nicht $wert == $suche,
  # denn falls $wert keine Zahl ist, wuerde '==' einen
  # Fehler ausloesen
}
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
topeg
 2006-10-16 12:35
#70786 #70786
User since
2006-07-10
2611 articles
BenutzerIn

user image
du kannst auch mit "eq" testen das gäbe dann auch keine Warnung.
Allso so:
Code: (dl )
if $wert eq "$suche"

das ist auch schneller als über einen Regexp
vayu
 2006-10-16 13:32
#70787 #70787
User since
2005-01-13
782 articles
BenutzerIn
[default_avatar]
erstens topeg hat n tippfehler in seinem array :D

@elemete

zweitens sollte der gesuchte wert an $elemente[5] zu finden sein, wir fangen doch bei 0 an zu zählen hm? :D

aber dafür hat opi es ja richtig gemacht\n\n

<!--EDIT|vayu|1160991225-->
docsnyder
 2006-10-16 15:56
#70788 #70788
User since
2005-09-08
300 articles
BenutzerIn
[Homepage] [default_avatar]
@topeg

Deine Zeile

Code: (dl )
  if($elemente[6] == 1) ...


ist problematisch, denn hier wird eine Spalte ($elemente[6]) in einen Integer konvertiert (weil Integer-Vergleich! ) und d.h., daß die Bedingung auch für Spalten der Form '1<irgendetwas ungleich Zahl>' wahr ist.

Böse, böse!

Ein Beispiel:

Code: (dl )
1
2
3
4
5
$str = "42xxx";

if ( $str == 42 ) {
print "BINGO !\n";
}


Gruß, Doc\n\n

<!--EDIT|docsnyder|1160999886-->
topeg
 2006-10-16 21:58
#70789 #70789
User since
2006-07-10
2611 articles
BenutzerIn

user image
@docsnyder

Sicher ein Zahlenvergleich kann problematisch sein, wenn man nicht sicher ist, ob es sich beim zu prüfenden Wert immer um einen echten Zahlenwert handelt. Jedoch ist es unproblematisch wenn es sich immer um eine Zahl handelt und das ist hier der Fall, sofern ich den Erstbeitrag richtig gelesen habe.
Alternativ habe ich später ja auch den vergleich über "eq" vorgeschlagen.

@vayu
Allso ganz vorsichtig. Er sprach von der sechsten Tabstelle was für mich heißt, der siebte Eintrag ist gemeint und damit ist der sechste Index richtig. ;-)
Und wie ich schon sagte, ohne Fehler ist es ja langweilig. :-)\n\n

<!--EDIT|topeg|1161023097-->
bloonix
 2006-10-16 22:28
#70790 #70790
User since
2005-12-17
1615 articles
HausmeisterIn
[Homepage]
user image
[quote=topeg,16.10.2006, 10:35]das ist auch schneller als über einen Regexp[/quote]
Ein gutes Argument!
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 >| >> 18 entries, 2 pages



View all threads created 2006-10-16 02:04.