Schrift
[thread]8797[/thread]

Kleines Problem beim auslesen einer Datei: Stehe gerade auf dem Schlau :(



<< >> 10 Einträge, 1 Seite
krusty
 2007-02-28 12:56
#74674 #74674
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Hallo,

brauch mal wieder nen kleinen Anhaltspunkt damit ich weiter komme.
Problem: Ich habe eine Datei die ich Zeilenweise auslese. In der Datei gibt es Zeilen die mit # beginnen. Sobald eine solche Zeile kommt, muss das Script wissen das es sich um einen neuen Artikel handelt. Nach dieser Zeile kommen noch x beliebig viel andere Zeilen. Von einigen Zeilen brauche ich dann verschiedene Informationen die ich mittels if Anweisung suche und dann in Variablen zwischenspeichere.
Bevor jetzt eine neue Zeile mit einem # kommt, sollen alle Variablen mittels ; getrennt in einem Array gespeichert werden.

Da das Perlscript ja von oben nach unten ausgeführt wird habe ich entsprechend die Reihenfolge der if Anweisungen geschrieben. Das ganze funktioniert auch soweit. Lediglich der erst Suchstring findet er zwar, speichert diese aber in einer seperaten Zeile.

Um das ganze zu verdeutlichen hier mal nen bissel Code.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/perl

use warnings;
use strict;

my $path = "/ist/egal";
my $infile = "input.txt";
my $outfile = "output.csv";
my $found = "";
my $count = "";
my @Dealer = ();
my $firstNR = "";
my $secNR = "";
my $thirdNR = "";

open(IN, "<$path/$infile") || die "Cannot open file $infile!\n";
while(<IN>) {
chomp;
my $line = $_;

if($line =~ /^(# suchmuster1)(\d+)(suchmuster2)/)
{
$firstNR = $2;
$found = 2;
}
elsif($line =~ /^(suchmuster3)(.+)/)
{
$secNR = $2;
}
elsif($line =~ /^(suchmuster4)(test)/i)
{
$thirdNR = $2;
}
if($found eq "2")
{
my $new_line = $firstNR.";".$secNR.";".$thirdNR.";";
push(@Dealer, $new_line);
$found = "";
$firstNR = "";
$secNR = "";
}
}
close(IN);

open(OUT, ">>$path/$outfile") || die "Cannot open and write file $outfile!\n";
foreach my $zeile (@Dealer)
{
print OUT $zeile."\n";
$count++;
}
close(OUT);

print "Habe $count Datensaetze gefunden\n";


Vielleicht habt ihr ja nen Verbesserungsvorschlag.

Gruß
renee
 2007-02-28 13:12
#74675 #74675
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum setzt Du $/ nicht auf einen anderen Wert??

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;

my $file = '/path/to/file.txt';
my @array;

{
local $/ = "\n#";
open my $fh,'<',$file or die $!;
while( my $article = <$fh> ){
my @info = $article =~ /^suchmuster1 (\d+) suchmuster2.*?suchmuster3([^\n]+).*suchmuster4(test)/i;
push @array,join(";",@info);
}
}

print $_,"\n" for @array;


Evtl. den RegEx nochmal aufteilen... Ist ungetestet...
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/
krusty
 2007-02-28 14:54
#74676 #74676
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Hi renee,

sorry wenn ich frage, aber wieso sind um den filehandle die geschweiften Klammern?

Was mir auch noch nicht ganz klar geworden ist, wie kann denn das matching funktionieren, wenn die einzelnen suchmuster in verschiedenen zeilen stehen. Oder bewirkt das anhängen der gesamten suchmuster das nur das was in den klammern steht in das Array gespeichert wird???
renee
 2007-02-28 15:01
#74677 #74677
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie gesagt, ist ungetestet. Bei dem Regulären Ausdruck musst Du noch den "s"-Modifier hinzufügen.

Um das Einlesen der Datei mache ich eine geschweifte Klammer, weil $/ nach dem Einlesen der Datei wieder auf dem "normalen" Wert \n stehen soll. Und das Filehandle wird automatisch geschlossen wenn der Block verlassen wird. Ohne den Block kann man böse Überraschungen erleben wenn man eine weitere Datei - dann aber Zeilenweise - einlesen will...
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/
krusty
 2007-02-28 15:21
#74678 #74678
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Also ich habe das jetzt mal so geschrieben, aber das kann so noch nicht funktionieren, da ich die Werte nicht in dem Array @info speichern kann. Wie kann ich das denn anstellen?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl

use strict;
use warnings;

my $file = "/root/Desktop/export_28-02-07.txt";
my @array;

{
local $/ = "\n#";
open my $fh, '<',$file or die $!;
while( my $line = <$fh> ){
my @info = $line =~ /^suchmuster1 =(\d+)/;
@info = $line =~ /^suchmuster2 (.+)/;
@info = $line =~ /^suchmuster3 (Hallo)/i;
@info = $line =~ /^suchmuster4 (Hello)/i;
push @array, join(";", @info);
}
}

foreach my $zeile (@array) {
print $zeile."\n";
}


Was ich noch gerne wissen würde, wird automatisch der inhalt der Klammer in das Array gespeichert? Bsp:
Code: (dl )
 my @info = $line =~ /^suchmuster1 =(\d+)/;
\n\n

<!--EDIT|krusty|1172668963-->
renee
 2007-02-28 15:26
#74679 #74679
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Aus:
Code: (dl )
1
2
3
4
               my @info = $line =~ /^suchmuster1 =(\d+)/;
@info = $line =~ /^suchmuster2 (.+)/;
@info = $line =~ /^suchmuster3 (Hallo)/i;
@info = $line =~ /^suchmuster4 (Hello)/i;


Das hier:
Code: (dl )
1
2
3
4
               my @info = $line =~ /^suchmuster1 =(\d+)/;
push @info, $line =~ /^suchmuster2 (.+)/;
push @info, $line =~ /^suchmuster3 (Hallo)/i;
push @info, $line =~ /^suchmuster4 (Hello)/i;
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/
krusty
 2007-02-28 16:02
#74680 #74680
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Ich habe jetzt mal folgendes gemacht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
open my $fh, '<',$file or die $!;
while( my $line = <$fh> ){
chomp($line);
my @info = $line =~ /^suchmuster1=(\d+)/;
push @info, $line =~ /^suchmuster2: (.+)/;
push @info, $line =~ /^suchmuster3: (test1)/i;
push @info, $line =~ /^suchmuster4: (test2)/i;
push @info, $line =~ /^suchmuster5: (test3)/i;
push @info, $line =~ /^suchmuster6: (test4)/i;
my $new_line = join(";",@info);
print $new_line."\n";
}


Leider bekomme ich als ausgabe immer jeden Suchtreffer in einer neuen Zeile. Außerdem sind noch viele Leerzeilen in der ausgabe enthalten. Das "join" scheint nicht zu funktionieren. Nur warum???
pktm
 2007-02-28 16:12
#74681 #74681
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Gib dir mal zwischendurch @info mit Data::Dumper aus, eventuell wird einfach nichts in @info geschrieben. Außerdem suchst du ohne m//g, hälst also beim ersten Treffer an.
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2007-02-28 16:14
#74682 #74682
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zeig mal was Du bekommst und was Du bekommen möchtest! So pauschal ist es schwer zu antworten...
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/
krusty
 2007-02-28 16:21
#74683 #74683
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
ich bekomme

Quote



9876542
123BCA9

test3





0123455
ABC123A

test4











ich hätte gerne
Quote
9876542;123BCA9;;test3;


Dann eben die nächste zeile. :blush:
<< >> 10 Einträge, 1 Seite



View all threads created 2007-02-28 12:56.