micneu
Goto Top

Awk, perl, vbs - xml datei bearbeiten

moin, habe hier eine log datei im xml format, und in der sind manchmal fehler (tags fehlern oder sind doppelt)

Also hier schonmal die grobe strucktur der xml-datei
<transcript>
  <messages>
    <message>
      <to>ziel</to>
      <from>von</from>
      <body>text</body>
      <date>datum</date>
    </message>
    <message>
      <to>ziel</to>
      <from>von</from>
      <body>text</body>
      <date>datum</date>
    </message>
  </messages>
</transcript>

jetzt habe ich es das manchmal dieser block
<transcript>
  <messages>
....
  </messages>
</transcript>
in einer datei wiederholt, oder das das "<to>" fehlt aber das "ziel</to>" wurde geschrieben.

die dateien werden vom "Spark" erstellt.

jetzt war mein gedanke, das ich nach <transcript> <messages> suchen lasse, ist es mehr als einmal sollen alle gelöscht werden ausser das am anfang der datei, das gleiche mit dem ende der datei.

wie formuliere ich ein regex nach dem motto, suche mir alles was ".*</to>" und wo *"<to>"** nicht enthalten ist.

gruß michael

Content-Key: 184024

Url: https://administrator.de/contentid/184024

Printed on: April 19, 2024 at 23:04 o'clock

Mitglied: 64748
64748 Apr 24, 2012 at 13:43:48 (UTC)
Goto Top
Hallo Michael,

Du kannst einfach nach dem Ausdruck "ziel</to>" am Zeilenanfang suchen.
 m/^ziel<\/to>/

Markus
Member: micneu
micneu May 08, 2012 at 15:37:52 (UTC)
Goto Top
habe jetzt ein script in perl geschrieben, es behebt die fehler in den spark transcript dateien.

#!/usr/bin/perl
## ----------------------------------------------------------------------------
## Script Name: 	suchen_ersetzen_spark.pl
## CreationDate: 	04.2012
## Last Modified: 	08.05.2012
## Copyright: 		MN (c)2012
## Purpose: 		ersetzt in defekten spark transcript dateien doppelte tags 
## ----------------------------------------------------------------------------
use strict;
use warnings;

# variablen deklarieren
our($SPARK,$string,$text,$Zaehler,@array,$GELAUFEN, $STDMINSEC, $SEKUNDEN_REST, $SEKUNDEN, $MINUTEN, $ZAHL);
my $st = time();
## datei abfragen

$SPARK = $ARGV;

if (!$ARGV) {
	print "z. B.: $0 dateiname.xml > neuedatei.xml\n";  
	print "original datei löschen und neue datei den namen der original datei geben\n";  
        print "welche spark-datei bearbeiten: "; # datei abfragen  
        $SPARK = <STDIN>;
        chop($SPARK);
}
### prüft ob verzeichnis angelegt ist
if (-e "BAK"){  
} else { system("mkdir BAK"); }  

system("cp $SPARK BAK/$SPARK.bak"); ### bakup erstellen  
open(INFILE,"BAK/$SPARK.bak") or die "Fehler beim Öffnen von $SPARK.bak: $!"; # datei öffnen  

open(OUTFILE,">","$SPARK") or die "Fehler beim Öffnen von Ausgabe Datei $SPARK: $!"; # datei öffnen  


$string = do { local $/; <INFILE> }; # zeilenweise einlesen
$text = $string; 


#### suchen und ersetzen start
## die regular expression müssen warscheinlich noch überarbeitet werden, es wird nicht alles gefunden was probleme macht in den transcript dateien

$text =~ tr/\r//d;
$text =~ s/\n//g;
$text =~ s/>\s*</></g;
$text =~ s/<transcript>/<transcript>\n/g;
$text =~ s/<messages>/ <messages>\n/g;
$text =~ s/<message>/  <message>\n/g;
$text =~ s/<\/message>/  <\/message>\n/g;
$text =~ s/<to>/   <to>/g;
$text =~ s/<\/to>/<\/to>\n/g;
$text =~ s/<from>/   <from>/g;
$text =~ s/<\/from>/<\/from>\n/g;
$text =~ s/<body>/   <body>/g;
$text =~ s/<\/body>/<\/body>\n/g;
$text =~ s/<date>/   <date>/g;
$text =~ s/<\/date>/<\/date>\n/g;
$text =~ s/<\/messages>/ <\/messages>\n/g;
$text =~ s/<\/transcript>/<\/transcript>/g;
#### suchen und ersetzen ende
### array erstellen
@array = split(/\n/, $text);
for ($Zaehler=0; $Zaehler<@array; $Zaehler++){
##### fehlendes <to> einfügen
	if ( $array[$Zaehler] =~ /<\/to[^>]*>/ ) {
		if ($array[$Zaehler] !~ /<to[^>]*>/ ){			
			print "fehlendes <to>: $Zaehler, $array[$Zaehler]\n";  
			$array[$Zaehler] = "   <to>$array[$Zaehler]";  
		}
	}
##### alle überzähligen <transcript> entfernen	
	if ( $array[$Zaehler] =~ /<transcript>/ ) {
		if ($Zaehler gt 0){
			print "<transcript>: $Zaehler,$array[$Zaehler]\n";  
			$array[$Zaehler] = splice(@array,$Zaehler);
		}
	}
##### alle überzähligen <messages> entfernen
	if ( $array[$Zaehler] =~ /<messages>/ ) {
		if ($Zaehler gt 1){
			print "<messages>: $Zaehler,$array[$Zaehler]\n";			  
			$array[$Zaehler] = splice(@array,$Zaehler);
		}
	}
##### alle überzähligen </messages> entfernen
	if ( $array[$Zaehler] =~ /<\/messages>/ ) {
		if ($Zaehler lt $#array-1){
			print "</messages>: $Zaehler,$array[$Zaehler]\n";  
			$array[$Zaehler] = splice(@array,$Zaehler);
		}
	}

##### alle überzähligen <\transcript> entfernen
	if ( $array[$Zaehler] =~ /<\/transcript>/ ) {
		if ($Zaehler lt $#array){
			print "</transcript>: $Zaehler,$array[$Zaehler]\n";  
			$array[$Zaehler] = splice(@array,$Zaehler);
		}
	}
#### ausgabe des inhalts in eine datei
	print OUTFILE "$array[$Zaehler]\n";  
}
close OUTFILE; # datei schließen
close INFILE; # datei schließen
### stopuhr
$GELAUFEN = (time() - $st);
if ($GELAUFEN >= 3600) {

	$GELAUFEN = ($GELAUFEN / 3600);

	$STDMINSEC = "Stunden";  

	} elsif ($GELAUFEN >= 60) {
		$GELAUFEN = ($GELAUFEN / 60);			
		$STDMINSEC = "Minuten";  
	} else {		
		$STDMINSEC = "Sekunden";  
	}
print "Benoetigte Zeit: $GELAUFEN $STDMINSEC\n";  
print "ist erledigt\n";