Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7226[/thread]

Strings ersetzen in Datei: .. mit Werten aus einer anderen Datei



<< >> 3 Einträge, 1 Seite
plutos
 2005-08-23 18:09
#57356 #57356
User since
2005-08-23
1 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bin Anfänger in Sachen Perl und habe folgendes Problem.
Ich möchte aus einer XML-Template-Datei eine neue XML-Datei erzeugen,
indem bestimmte Strings (NAME,TITEL,AUFRUF) ersetzt werden; die Werte
dazu befinden sich sich in einer anderen Datei (CSV-Format).

Datei template.xml:
...
Code: (dl )
1
2
3
4
5
6
<JOBS ... name="NAME">
...
     <Title>TITEL</Title>
...
     <MSCRI><![CDATA[AUFRUF
...


Datei jobs.csv:
Job A;Backup-Job;backup.sh
Job B;Loesch-Job;delete.sh
Job C;Kopier-Job;copy.sh


Hier mein letzter Skript-Versuch:
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
#!/bin/perl -w
use strict;
my $XML = 'template.xml';
my $CSV = 'jobs.csv';
my $OUT = 'neudatei.xml';

open(READ1, "$XML")
open(READ2, "$CSV")
open(WRITE1, "> $OUT")

my @datei = <READ1>;

while (my $i = <READ2>)
{
 my @a = split(/;/,$i);  # CSV-Zeilen splitten
   my $name = "$a[0]";
   my $titel = "$a[1]";
   my $aufruf = "$a[2]";
   chomp $aufruf;
   foreach(@datei)
   {
     $_ =~ s/NAME/$name/;
     $_ =~ s/TITEL/$titel/;
     $_ =~ s/AUFRUF/$aufruf/;
     print WRITE1; }
}
close(READ1);
close(READ2);
close(WRITE1)
 or die "Fehler beim Schliessen von '$OUT': $! \n";


so sieht die generierte Datei neudatei.xml aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
<JOBS ... name="Job A">
...
     <Title>Backup-Job</Title>
...
     <MSCRI><![CDATA[backup.sh
...
...
<JOBS ... name="Job A">
...
     <Title>Backup-Job</Title>
...
     <MSCRI><![CDATA[backup.sh
...
...
<JOBS ... name="Job A">
...
     <Title>Backup-Job</Title>
...
     <MSCRI><![CDATA[backup.sh
...


und so sollte sie aussehen:
...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<JOBS ... name="Job A">
...
     <Title>Backup-Job</Title>
...
     <MSCRI><![CDATA[backup.sh
...
...
<JOBS ... name="Job B">
...
     <Title>Loesch-Job</Title>
...
     <MSCRI><![CDATA[delete.sh
...
...
<JOBS ... name="Job C">
...
     <Title>Kopier-Job</Title>
...
     <MSCRI><![CDATA[copy.sh
...



Irgendwie kriege ich das nicht hin.
Wäre super wenn ihr mir weiterhelfen könnt.

Klaus

edit pq: code-tags hinzugefügt\n\n

<!--EDIT|pq|1124822107-->
Taulmarill
 2005-08-23 19:12
#57357 #57357
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
das liegt daran, dass wenn du mit einem foreach über einen array iterierst, der wert in $_ am ende der schleife wieder zurück in den array geschrieben wird. das ist toll, wenn man den array verändern will, hier aber eher hinderlich.
am einfachsten währs, wenn du am anfang der for(each) schleife so etwas wie my $line = $_; einzufügen würdest, und dann $line veränderst.\n\n

<!--EDIT|Taulmarill|1124809963-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
ptk
 2005-08-25 20:15
#57358 #57358
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Weil ich so viel schlechtes XML bekomme: du solltest vielleicht ueberlegen, XSLT einzusetzen, oder DOM-Manipulation mit XML::LibXML. Oder wenigstens auf korrektes Escaping von Sonderzeichen und auf das Encoding zu achten.
<< >> 3 Einträge, 1 Seite



View all threads created 2005-08-23 18:09.