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

topeg
 2012-06-28 17:15
#159455 #159455
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich verstehe deine Erklärungen nicht ganz. Das ganze ließt sich etwas Konfus.

Als du versuchst hast den Code zu verändern, hast du ihn regelrecht in Stücke gehauen. Klammern sind nicht geschlossen Variablen sind nicht als solche gekennzeichnet, Kommandos sind unvollständig, etc. Perl interpretiert zwar einiges, aber damit kommt es nicht klar.

Sofern ich den Code verstehe, versuchst du eine XML-Datei nach bestimmten Tags zu durchsuchen. Nach 'Measurement' und 'Parameter' um genau zu sein. Ab hier rate ich etwas. In den Tags sind Parameter, unter ihnen kann "nameAsap2" oder "name" vorkommen. Wenn diese auftauchen, dann sollen die Werte zu diesem Parameter 32 Zeichen nicht übersteigen.

Ein Teil der Datei könnte also so aussehen:

Code: (dl )
1
2
3
<Measurement name="nur ein test">
<!-- Weitere Werte die nicht bekannt sind-->
</Measurement>


Ich habe mal auf Grund meiner Vermutungen den Code verändert:
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
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;       # Parameteruebergabe

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

print "$infile1\n";

open ( my $in1_fh, '<', $infile1) || die "\n Datei $infile1 konnte nicht geoeffnet werden ($!)\n";
my @Datafield_List = <$in1_fh>;
close($in1_fh);
chomp(@Datafield_List);

my $i=0;
for my $zeile (@Datafield_List)
{
  if($zeile =~ m/\.datafield$/i)
  {
    # was du hier machen willst weiß ich nicht
    #my $pfad = ... ;
    #open(my $in2_fh,'<', $pfad) || die "Datei $pfad konnte nicht geoeffnet werden($!)\n";
    # ...
    $i++;
  }
}

for my $zeile  (@Datafield_List)
{
  # finde in der Zeile was nach <name ...parameter...> aussieht
  if($zeile =~ m/<(\w+)\s*(.*?)\s*>/i)
  {
    # gefundener Name des XML-Tags
    my $name=$1;
    # parameter in dem XML-Tag
    my $params=$2;

    # 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)
    {
      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' besitzt folgender Strukturmember eine groessere Zeichenkette als 32 Zeichen: '$val'\n"
        print "Der Bezeichnername ist in der folgenden Zeile als $key bezeichnet: '$zeile'\n";
        #system("command", 8) und '$1' für den ersten Treffer
      }
    }
  }
}

print "\nAlle Strukturmember besitzten eine Zeichenkette von weniger als 32 Zeichen.\n";



Ich rate dir an einen XML-Parser zu verwenden. Denn es ist nicht ganz einfach XML Korrekt zu behandeln.

View full thread Dateien einlesen und durchsuchen