2017-12-05 3 views
0

Ich versuche, ein Skript, das eine XML-Datei, sucht nach einer übereinstimmenden Bedingung, wenn es findet, fügt eine neue Zeile von Sternchen, dann wenn Sie durch die Datei gehen, um es von allen seinen XML-Tags strip und verlassen die Daten in einer Nur-Text-Datei.Wie kann ich dieses PowerShell-Skript effizienter machen?

Das Skript wurde auf eine kleine Eingabe-XML-Datei getestet und funktioniert gut, aber wenn ich eine große XML-Datei zu übergeben es dauert ewig (nicht wirklich sicher, wie lange ich es für über eine Stunde lief und immer noch kein Ergebnis Ich habe es gerade gestoppt).

Ich schätze, ich muss die Arbeit in einer äußerst ineffizienten Art und Weise durchführen, in der Hoffnung, dass Sie mir helfen können, es schnell und effizient zu machen. Hier

ist das Skript unter:

# Takes input XML File, cleans up XML elements, outputs plain text file 

$FileName = "C:\Users\someguy\Desktop\input.xml" 
$Pattern = "ProcessSpecifier = ""true""" 
$FileOriginal = Get-Content $FileName 

[String[]] $FileModified = @() 
Foreach ($Line in $FileOriginal) 
{ 
    $FileModified += $Line 
    if ($Line -match $Pattern) 
    { 
     #Add Lines after the selected pattern 
     $FileModified += "*************isActive=true*****************"  
    } 
} 


$FileModified -replace "<[^>]+>", "" | Out-File C:\Users\someguy\Desktop\Output.txt 
+0

'+ = $ Line' erstellt jedes Mal ein neues Array, wenn Sie es aufrufen. versuchen Sie ArrayList. –

+1

Auf welche Version von PowerShell zielen Sie? –

+0

Können Sie eine grobe Schätzung der Größe der Dateien geben, über die wir sprechen? – whatever

Antwort

3

Beginnen wir mit einem Blick hinter gehen und eine Reihe von regex Dinge zu beschleunigen hier oben. Außerdem werde ich das Ganze nicht in Erinnerung behalten, ich werde es nur durch die Pipeline leiten, was helfen sollte. Ich entferne Leerzeichen am Anfang und am Ende von Zeilen und filtere Leerzeilen heraus, aber du kannst dieses Bit entfernen, wenn du willst.

# Takes input XML File, cleans up XML elements, outputs plain text file 

$FileName = "C:\Users\someguy\Desktop\input.xml" 
$Pattern = '(?<=^.*ProcessSpecifier = "true".*$)' 
(Get-Content $FileName) -replace $Pattern, "`n*************isActive=true*****************" -replace '<[^>]+?>' -replace '^\s*|\s$' | ?{$_} | Set-Content C:\Users\someguy\Desktop\Output.txt 

So, hier die Hauptsache ist, dass ich einen Blick hinter benutzen, um Ihre Mustern Text, zu finden und dann zu dieser Zeile eine neue Zeile und das Sternchen Zeile hinzufügen. So dass die Linie

<SomeTag>ProcessSpecifier = "true"</SomeTag> 

wird:

<SomeTag>ProcessSpecifier = "true"</SomeTag>`n*************isActive=true***************** 

Wenn innerhalb doppelte Anführungszeichen ein Graviszeichen `gefolgt von n erstellt eine neue Linie, so dass die‚*********** verwendet ** isActive = true ***************** 'ist in einer eigenen Zeile, die direkt auf Ihre Suchmusterzeile folgt. Hinterher entferne ich die XML-Tags und dann alle führenden oder nachfolgenden Leerzeichen aus jeder Zeile.

Nach den RegEx Ersatz passiere ich das Ergebnis in eine Where Anweisung, die Leerzeilen entfernt, und dann passieren die verbleibenden Linien Set-Content, die ich eine bessere Leistung aus als Out-File gesehen habe.

+0

Das hat perfekt funktioniert. Danke m8 sehr geschätzt – SirLearnAlot

1

Variation von TheMadTechnician Antwort:

# Takes input XML File, cleans up XML elements, outputs plain text file 

$FileName = "C:\Users\someguy\Desktop\input.xml" 
$Pattern = '(?<=^.*ProcessSpecifier = "true".*$)' 
Set-Content -Path C:\Users\someguy\Desktop\Output.txt -Value (((Get-Content $FileName) -replace $Pattern, "`n*************isActive=true*****************" -replace '<[^>]+?>' -replace '^\s*|\s$').Where{$_}) 

Ich versuche eigentlich die Pipeline zu vermeiden, ist es eher afaik verlangsamen. Wenn die Dateien sehr groß sind, treten natürlich Probleme mit dem Speicherverbrauch auf. Das Konstrukt "() .Where" funktioniert nicht bei allen Powershell-Versionen (Version 4+ iirc).

Das ist eine Vermutung, ich bin mir nicht sicher, ob das tatsächlich schneller als TheMadTechnician ist. Ich wäre gespannt auf das Ergebnis :)

+0

Schätzen Sie die Mühe, danke :) – SirLearnAlot

Verwandte Themen