Thread Dateien einlesen und durchsuchen (17 answers)
Opened by INIING at 2012-06-28 15:05

topeg
 2012-06-30 00:29
#159479 #159479
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
2012-06-29T12:23:57 INIING
Im make File wird das Compilertool angewiesen eine Liste mit Dateien auszugeben. Im make übergebe ich diese meinem Perl-Skript und lese die gesamte Liste ein, da ich diese nach mehrfach vorkommenden namen und asap2-namen durchsuchen möchte. Weiterhin wird nach den oben genannten Bedingungen gesucht.

Ich versuche mal zu formulieren was ich verstanden habe:
Du hast eine Reihe von XML Dateien. In diesen befinden sich Werte, die In allen XML-Dateien nur einmal vorkommen sollen. Um die Bisher gefundenen Werte zu speichern nutzt du die Datei "Complete_List.datafield".
Wenn nun ein Wert gefunden wurde, der noch nicht in dieser Liste ist, dann soll er hinzugefügt werden. Wenn in der XML-Datei Ein wert ist, der schon in der Liste ist, dann soll eine Warnung ausgegeben werden.
Zudem soll geprüft werden, ob die Länge dieser Werte 32 Zeichen nicht überschreitet.

Der überarbeitete Code
more (19.8kb):
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;       # Parameteruebergabe

my $infile1;
my $outfile='C:\Complete_List.datafield';

# Uebergabeparameter einlesen
GetOptions ('i=s' , \$infile1);

print "$infile1\n";

my %Datafield_List;

# wenn die Datei existiert,
# den Inhalt einlesen
if(-f $outfile)
{
  open( my $out_fh, '<', $outfile ) || die "\n Die Datei $outfile konnte nicht gelesen werden ($!)\n";
  my @DataList = <$out_fh>;
  close($out_fh);

  chomp(@DataList);

  # den Inhalt von $outfile Lesen
  # und die Einträge in einen Hash wandeln.
  # Das besondere an einem Hash ist,
  # das ein Schüssel nur einmal vorkommen darf
  # schreibt man allso alle einträge als Schlüssel in einen hash
  # bleibt eine Liste übrig, in der Jeder Wert nur einmal vorkommt.

  for $my eintrag (@DataList)
  {
    $Datafield_List{$eintrag}++;
  }

}

# die XML Datei einlesen
open ( my $FILE1, '<', $infile1) || die "\n Die Datei $infile1 konnte nicht geoeffnet werden ($!)\n";
my $line_nr=0;
while(my $zeile=<$FILE1>)
{
  chomp($zeile);
  $line_nr++;

  # finde in der Zeile was nach <name ...parameter...> aussieht
  if($zeile =~ m/<(\w+)\s+(.*?)\s*>/i)
  ## ich suche nach < gefolgt (direkt?) nach irgendeiner Zeichenfolge,
  ## die ein Steuerzeichen und Steuerzeichen bestehen,
  ## gefolt von belieben Zeichen?
  ## Kann ich da eine kleine Erklärung haben?
  #
  # \w repräsentiert "Wort-Zeichen". Das sind "A" bis "Z", "a" bis "z", "0" bis "9" und "_"
  # \w+ ist also eine Zeichenkette, aus "Wort-Zeichen"
  # die Runde klammer besagt, das der gefundene String zurück geben werden soll
  # \s+ besagt mindestens ein Leezeichen, oder biebig viele
  # (.*?) heißt finde irgendwelche Zeichen, gib dich mit der kleinsten Stringlänge zufrieden die passt.
  # \s* kein oder beliebig viele Leezeichen
  # wie ich schon schreib findet diese RegExp XML-Tags.
  # Ein XML-Tag beginnt mit einem "<" Dann folgt eine Zeichenkette die nur aus A-Za-z0-9_ bestehen darf,
  # dann kommen optionale Optionen der Form " key="value" " abgeschlossen wird der Tag mit ">"
  {
    # gefundener Name des XML-Tags
    my $name=$1; #aus der 1. Klammer??
    # in $name steht das was "(\w+)" gefunden hat

    # parameter in dem XML-Tag
    my $params=$2; #aus der 2. Klammer?? bräuchte hierzu eine kleine Erklärung von der oberen Suche
    # in $parameter steht was mit "(.*?)" gefunden wurde

    # weiter wenn nicht der gesuchte Tag
    next unless($name eq 'Measurement' or $name eq 'Parameter');

    # finde in $params alles was nach key="wert" aussieht:
    while($params =~ /(\w+)\s*=\s*"([^"]+)"\s*/gc) #kannst du mir dazu etwas erklären
    {
      my $key=$1;
      my $val=$2;

      # weiter wenn $key nicht "nameAsap2" oder "name"
      next unless( $key eq 'nameAsap2' or $key eq 'name' );

      # wenn Länge des Inhalts größer als 32 Zeichen
      if(length($val) > 32)
      {
        my $File = $infile1;
        print "\n   !!! FEHLER !!!  \n";
        print "In der Datei '$File' Zeile $line_nr besitzt folgender Strukturmember eine groessere Zeichenkette als 32 Zeichen: '$val'\n"
        print "Der Bezeichnername ist in der folgenden Zeile als $key bezeichnet: '$zeile'\n";
      }

      # nun wird geprüft ob der Wert in $val noch unbekannt ist
      if($Datafield_List{$val})
      {
        print "\n   !!! FEHLER !!!  \n";
        print "In der Datei '$File' Zeile $line_nr besitzt folgender Strukturmember eine schon verwendetete Zeichenkette: '$val'\n"
        print "Der Bezeichnername ist in der folgenden Zeile als $key bezeichnet: '$zeile'\n";
      }

      # den Wert in $val zur Liste der Werte hinzufügen
      $Datafield_List{$val}++;
    }
  }
}

close($FILE1);

# jetzt noch die erweiterte Liste in %Datafield_List speichern
# damit sie beim nächsten Durchlauf bekannt ist.
{
  open( my $out_fh, '>', $outfile ) || die "\n Die Datei $outfile konnte nicht geöffnet werden ($!)\n";
  print "$_\n" for(keys(%Datafield_List));
  close($out_fh);
}



Bitte verwechsle | nicht mit ||. das erste macht ein Binäres oder, es nimmt Zwei Zeichenkette und verbindet es auf binärer Ebene mit oder. Das zweite Macht ein Logisches oder. Es wird geprüft ob der Inhalt "wahr" oder "falsch" ist.

Hau nicht einfach irgendwelche Zeichenketten in den Code. so was: length($val | $ $key) ist Unsinn. Ich kann nicht mal erraten was du da machen wolltest.

Bevor du anfängst zu programmieren werde dir erst mal ganz genau klar was du machen willst. Mache Stichpunkte über das was du passieren soll. Wenn du so was hast, kannst du hier im Forum auch besser formulieren was du willst. Wir wissen nicht was du dir bei dem Text gedacht hast wir haben nur den Text. Wenn dieser nicht klar ist, wird es schwer zu helfen. Ich habe Übung darin zu erraten was jemand will. Jedoch liege ich nicht immer richtig. Zudem kostet es zeit mir darüber Gedanken zu machen was du willst. In der Zeit kann ich dir nicht helfen.

View full thread Dateien einlesen und durchsuchen