Thread Suchen / Ersetzen (25 answers)
Opened by NewtonZ4 at 2010-09-18 19:15

topeg
 2010-09-18 21:47
#141396 #141396
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Hier etwas Code.
Aber vorsicht, sämtliche XML-Tags und formatierungen werden ignoriert, das bedeutet, dass nicht alles gefunden werden könnte und eventuell das XML Zerstört wird.
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
#!/usr/bin/perl
use strict;
use warnings;

my $name_file='names.txt';
my $data_file='data.xml';
my $outp_file='data.out.xml';

# Einlesen der Namenspaare
my %replace;
open(my $nfh, '<', $name_file) or die "error open $name_file $!\n";
while(my $line=<$nfh>)
{
  chomp($line);
  $replace{$1}=$2 if($line=~/^\s*(.+?)\s*=>\s*(.+?)\s*$/);
}
close($nfh);

# erstellen der Suchliste
my $search_str=join('|', map{qr(\Q$_\E)}keys(%replace));
$search_str=qr!($search_str)!;

# daten Datei öffnen
open(my $dfh, '<', $data_file) or die "error open $data_file $!\n";
# Ausgabedatei öffnen
open(my $ofh, '>', $outp_file) or die "error open $outp_file $!\n";
while(<$dfh>)
{
  # Zeile durchsuchen und und Ersetzen
  $_=~s/$search_str/$replace{$1}/g;
  # Zeile ausgeben
  print $ofh $_;
}
close($ofh);
close($dfh);


besser ist es das XML zu parsen und dann zu ersetzen (ungetestet):
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
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;

my $name_file='names.txt';
my $data_file='data.xml';
my $outp_file='data.out.xml';

my %replace;
open(my $nfh, '<', $name_file) or die "error open $name_file $!\n";
while(my $line=<$nfh>)
{
  chomp($line);
  $replace{$1}=$2 if($line=~/^\s*(.+?)\s*=>\s*(.+?)\s*$/);
}
close($nfh);

my $twig=XML::Twig->new(
    pretty_print  => 'cvs',
    twig_handlers => {
      _all_ => sub { $_->set_text($replace{$_->text}) if(exists($replace{$_->text})) }
    }
);

$twig->parsefile($data_file);

open(my $ofh, '>', $outp_file) or die "error open $outp_file $!\n";
$twig->print($ofh);
close($ofh);


names.txt
Code: (dl )
F_100005.DACA.PV => F_100005.PV


data.xml
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
            <ContextItem Type="Trace">
<Name>F_100005.DACA.PV</Name>
<ItemDetails xmlns:q4="http://honeywell.context.org/trace" xsi:type="q4:TraceItemDetails" version="1.0">
<Extensions />
<q4:TagID>F_100005.DACA.PV</q4:TagID>
<q4:Color>#0000A0</q4:Color>
<q4:Marker>square</q4:Marker>
<q4:Style>Solid</q4:Style>
<q4:Visible>true</q4:Visible>
<q4:Selected>false</q4:Selected>
<q4:TimeOffset>0S</q4:TimeOffset>
<q4:XAxis>false</q4:XAxis>
<q4:YAxis>false</q4:YAxis>
<q4:Minimum>0</q4:Minimum>
<q4:Maximum>100</q4:Maximum>
<q4:YRange>Auto</q4:YRange>
<q4:YCustomMaximum>0</q4:YCustomMaximum>
<q4:YCustomMinimum>0</q4:YCustomMinimum>
<q4:HistogramPlot>false</q4:HistogramPlot>
<q4:UseSecondaryXAxes>false</q4:UseSecondaryXAxes>
<q4:Interpolation>Default</q4:Interpolation>
</ItemDetails>
<ItemCollection>
<ContextItem Type="Tag">
<Name>F_100005.DACA.PV</Name>
<ItemDetails xmlns:q5="http://honeywell.context.org/tag" xsi:type="q5:TagItemDetails" version="1.0">
<Extensions />
<q5:ItemName>F_100005.DACA.PV</q5:ItemName>
<q5:Enumerated>false</q5:Enumerated>
<q5:MinimumConfidence>0</q5:MinimumConfidence>
<q5:NullValueReplacement>######</q5:NullValueReplacement>
<q5:Units />
</ItemDetails>
<ItemCollection>
<ContextItem Type="DataSource">
<Name>DefaultPHD</Name>
<ItemDetails xmlns:q6="http://honeywell.context.org/datasource" xsi:type="q6:DataSourceItemDetails" version="1.0">
<Extensions />
<q6:Name>DefaultPHD</q6:Name>
<q6:Type>PHD</q6:Type>
<q6:ServerName>PHD_HOST</q6:ServerName>
<q6:ServerPort>-1</q6:ServerPort>
<q6:BrowseServerName>PHD_HOST</q6:BrowseServerName>
<q6:BrowseServerPort>-1</q6:BrowseServerPort>
</ItemDetails>
<ItemCollection />
</ContextItem>
</ItemCollection>
</ContextItem>
</ItemCollection>
</ContextItem>


EDIT:
Fehler im Code Zeile 23,25 ',' vergessen

EDIT2:
Fehler im Erstellen des regulären Ausdrucks Zeile 20f

EDIT3:
Beispiel mit XML::Twig Funktionstüchtig gemacht.
Last edited: 2010-09-18 22:53:33 +0200 (CEST)

View full thread Suchen / Ersetzen