Schrift
[thread]11777[/thread]

Matching in Datei und Ausgabe



<< >> 4 Einträge, 1 Seite
krusty
 2008-05-07 23:38
#109419 #109419
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Hallo,

habe mal wieder ein kleines Verständnisproblem.
Folgende Situation. In der einen Datei ist folgender Inhalt
xxx12345678irgend ein Text der beliebig lang sein kann
TextTextTextTextTextTextTextTextTextTextText
TextTextTextTextTextTextTextTextTextTextText
TextTextTextTextTextTextTextTextTextTextText
xxx23456789wieder ein Text der beliebig lang sein kann aber in einer Zeile ist
TextTextTextTextTextTextTextTextTextTextText
TextTextTextTextTextTextTextTextTextTextText
TextTextTextTextTextTextTextTextTextTextText
TextTextTextTextTextTextTextTextTextTextText
TextTextTextTextTextTextTextTextTextTextText
xxx34567890neuer Text mit x zeichen in der Zeile
TextTextTextTextTextTextTextTextTextTextText
TextTextTextTextTextTextTextTextTextTextText

Die Datei geht immer so weiter.

In einer zweiten Datei habe ich folgende Inhalt.
23456789
96325874
88554466
77663311
34567890
99999999


Mein Ziel ist es, die einzelnen Nummern z.b. 12345678 in der ersten Datei zu finden. Sollten diese nicht gefunden werden, soll die Zeile mit der Nummer und alle folgenden bis zu der nächsten Zeile in der er die Nummer findet ausgegeben werden.

Um mein Ziel zu erreichen habe ich folgendes Miniscript erstellt.

Code (perl): (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
#!C:\Perl\bin\perl.exe -w

# Benötigte Variablen
my $dep_arc_file = "C:\\Perl\\scripts\\test.csv";
my $dia_ert_file = "C:\\Perl\\scripts\\D925007";
my @arc = ();
my @ert = ();

open(ARC, $dep_arc_file ) || die "Can not open file $dep_arc_file\n";
while (<ARC>) 
{
        # Spaltenueberschrift ignorieren
        if (! /^Zeilenueberschrift/) 
        {
                chomp;
                push (@arc, $_);
        }
}
close(ARC);

open(DIA, $dia_ert_file) || die "Can not open file $dia_ert_file\n";
while (<DIA>)
{
        chomp;
        push (@ert, $_);
}
close(DIA);

foreach my $line (@ert)
{
        my $found = 0;
        my $rest = 1;
        if ( $line =~ /^xxx(\d{8})/ )
        {
                foreach my $tmp (@arc)
                {
                        if ($tmp eq $1)
                        {
                                $found = 1;
                                $rest = 2;
                        }
                }
        }
        if (( $found ne 1 ) && ( $rest eq 1 ))
        {
                print $line."\n";
        }
}


Mein Problem ist nun, das ich entweder einige Zeilen doppelt ausgegeben bekomme oder aber das ich die folgende Zeilen nach der Zeile mit dem Suchmuster nicht ausgegeben bekomme.

Könnte mir evtl. jemand eine Tipp geben, was ich falsch mache.
renee
 2008-05-08 11:23
#109432 #109432
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
krusty+2008-05-07 21:38:04--
Mein Ziel ist es, die einzelnen Nummern z.b. 12345678 in der ersten Datei zu finden. Sollten diese nicht gefunden werden, soll die Zeile mit der Nummer und alle folgenden bis zu der nächsten Zeile in der er die Nummer findet ausgegeben werden.


Widerspricht sich da nicht etwas?

Kannst Du für oben genanntes Beispiel mal die gewünschte Ausgabe zeigen?
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
 2008-05-08 22:57
#109468 #109468
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Hi,

also die Ausgabe wäre dann in dem oben genannten Beispiel

xxx12345678irgend ein Text der beliebig lang sein kann
TextTextTextTextTextTextTextTextTextTextText
TextTextTextTextTextTextTextTextTextTextText
TextTextTextTextTextTextTextTextTextTextText

Denn die 8stellige Zahl in der ersten Zeile ist nicht in der zweiten Datei vorhanden.
murphy
 2008-05-09 19:52
#109496 #109496
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Wie wäre es hiermit:
Code (perl): (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
#!/opt/local/bin/perl5.10.0
use 5.010;
use strict;
use warnings;

use constant {
  EXCLUDE_TXT => '2.txt',
  DATA_TXT => '1.txt'
};

my %exclude = do {
  open my $in, '<', EXCLUDE_TXT or die "Cannot open exclusion list: $!";
  my $_; map { chomp; $_ => 1 } <$in>;
};

do {
  open my $in, '<', DATA_TXT or die "Cannot open data file: $!";
  while (my $_ = <$in>) {
    my $flop;
    print if (
      (/^xxx(\d{8})/ && !$exclude{$1})
      ...
      ($flop = (/^xxx(\d{8})/ && $exclude{$1}))
      and !$flop
    );
  }
}


edit: Ich sollte noch der Vollständigkeit halber dazu sagen, dass ich für dieses Skript die auszuschließenden Ziffernfolgen in 2.txt und die Testdaten in 1.txt gespeichert hatte.
When C++ is your hammer, every problem looks like your thumb.
<< >> 4 Einträge, 1 Seite



View all threads created 2008-05-07 23:38.