PowerShell Merkmale auslesen, in eine eigene Datei verschieben und aus dem orginal löschen
Hallo zusammen,
ich als absoluter PowerShell Neuling verbringe den Vormittag damit mich einigermaßen einzulesen und versuchen, mit Hilfe von Google ein kleines Minitool zu basteln.
Die Daten bzw die Inhalte der Datenbank sind durch Semikolon getrennt sodass unsere Programme auf der Arbeit dies automatisch erkennen.
Als Beispiel:
Info1;Info2;Info3;Info4;Info5;Info6
Bildschirm;Defekt;Blau;Bezahlt;EDV;Neu
PC;Defekt;Schwarz;Ratenzahlung;EDV;Gebraucht
Tastatur;Nicht Defekt;Schwarz;Bezahlt;Support;Neu
Stift;Nicht Defekt;Blau;Bezahlt;Hotline;Neu
Telefon;Defekt;Silber;Ratenzahlung;Chef;Neu
Ziel des Tools soll es sein, die Datensätze nach bestimmten Worten in einer bestimmten Spalte zu suchen ( " Defekt" in Feld Info2 oder "Bezahlt" in Feld Info5) , diese in eine eigene Datei zu schreiben ( Defekt.txt bzw. Bezahlt.txt ) und aus der Orginaldatei zu löschen. Möglich sein soll aber auch das nach " Defekt " und " Chef " gesucht werden kann und dementsprechend eine Defekt.txt und eine Chef.txt mit den jewaligen Zeilen bzw anderen Infos gespeichert wird.
Ich habe folgende Schnipsel gefunden und einzeln geschafft sie zum laufen zu bekommen:
Dieser Teil durchsucht allerdings den kompletten String ohne auf die Begrenzer zu achten und löscht ..
Die vorhergige Auszählung die wenn möglich auch in einer eigenen .txt Datei diese Speichert:
Und zu guter letzt der Schnipsel der die gefundenen Datensätze in eigene Dateien speichert ohne allerdings diese Zeilen aus der Orginaldatei zu löschen :
Jetzt die Frage wo ich mir von euch Hilfe erhoffe. Wie kann ich diese Code's so ineinander verschachteln das es läuft ?
Ich hoffe, die Fragestellung ist nicht zu verwirrend.
Vielen dank im Vorraus und ein schönes Wochenende aus Köln
ich als absoluter PowerShell Neuling verbringe den Vormittag damit mich einigermaßen einzulesen und versuchen, mit Hilfe von Google ein kleines Minitool zu basteln.
Die Daten bzw die Inhalte der Datenbank sind durch Semikolon getrennt sodass unsere Programme auf der Arbeit dies automatisch erkennen.
Als Beispiel:
Info1;Info2;Info3;Info4;Info5;Info6
Bildschirm;Defekt;Blau;Bezahlt;EDV;Neu
PC;Defekt;Schwarz;Ratenzahlung;EDV;Gebraucht
Tastatur;Nicht Defekt;Schwarz;Bezahlt;Support;Neu
Stift;Nicht Defekt;Blau;Bezahlt;Hotline;Neu
Telefon;Defekt;Silber;Ratenzahlung;Chef;Neu
Ziel des Tools soll es sein, die Datensätze nach bestimmten Worten in einer bestimmten Spalte zu suchen ( " Defekt" in Feld Info2 oder "Bezahlt" in Feld Info5) , diese in eine eigene Datei zu schreiben ( Defekt.txt bzw. Bezahlt.txt ) und aus der Orginaldatei zu löschen. Möglich sein soll aber auch das nach " Defekt " und " Chef " gesucht werden kann und dementsprechend eine Defekt.txt und eine Chef.txt mit den jewaligen Zeilen bzw anderen Infos gespeichert wird.
Ich habe folgende Schnipsel gefunden und einzeln geschafft sie zum laufen zu bekommen:
Dieser Teil durchsucht allerdings den kompletten String ohne auf die Begrenzer zu achten und löscht ..
clear-Host
$file = Get-Content "C:\temp\test.txt"
$str | out-file C:\temp\test3.txt
foreach ($str in $file)
{
if ($str -like '*Hotline*') {
} else {
$str | out-file C:\temp\test2.txt -append
}
}
Die vorhergige Auszählung die wenn möglich auch in einer eigenen .txt Datei diese Speichert:
$Path="C:\temp\test2.txt"
$words="Defekt","Silber","EDV"
foreach($word in $words){
$anzahl = (select-string -path $path -pattern "$word").count
"$word $anzahl"
}
Und zu guter letzt der Schnipsel der die gefundenen Datensätze in eigene Dateien speichert ohne allerdings diese Zeilen aus der Orginaldatei zu löschen :
$Patterns = @("Peter "," uni ")
$Path = "c:\temp\test2.txt"
$OutPath="c:\temp\errors"
Foreach($Pattern in $Patterns){
$OutPath="c:\temp\Sel"
$OutPath = "$OutPath\$Pattern.log"
$PatternLines = Select-String -path $Path -pattern $Pattern | ft LineNumber, Line -auto
$PatternLines | Out-File -filepath $OutPath -encoding Default
Jetzt die Frage wo ich mir von euch Hilfe erhoffe. Wie kann ich diese Code's so ineinander verschachteln das es läuft ?
Ich hoffe, die Fragestellung ist nicht zu verwirrend.
Vielen dank im Vorraus und ein schönes Wochenende aus Köln
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-Key: 236446
Url: https://administrator.de/contentid/236446
Ausgedruckt am: 29.03.2024 um 05:03 Uhr
7 Kommentare
Neuester Kommentar
Hallo Haven205, Willkommen im Forum.
Das ist kein Problem wenn man mit dem CMDLet Import-CSV und Export-CSV und Compare-Object arbeitet. Da du noch Powershell-Anfänger bist, ist das vermutlich erst mal starker Tobak für dich, habe dir deswegen Kommentare in den Code eingesetzt.
Den Aufruf der Funktion siehst du in der letzten Zeile.
D.h. du übergibst der Funktion das File mit den Original-Daten, dem Pfad für das Ausgabe-File und dann noch ein Array mit den Bedingungen, wobei in diesen Bedingungen das Gleichheitszeichen = als Trenner zwischen Spaltenname und gesuchtem Wert fungiert. Die Bedingungen müssen alle erfüllt sein damit eine Zeile ausgewählt wird (UND-Verknüpft).
Grüße Uwe
Das ist kein Problem wenn man mit dem CMDLet Import-CSV und Export-CSV und Compare-Object arbeitet. Da du noch Powershell-Anfänger bist, ist das vermutlich erst mal starker Tobak für dich, habe dir deswegen Kommentare in den Code eingesetzt.
Beispiel-Funktion
function myFilterTool{
# Parameter der Funktion deklarieren
param(
[parameter(mandatory=$true)][string]$inputFile,
[parameter(mandatory=$true)][string]$outputFile,
[parameter(mandatory=$true)][ValidatePattern("[^=]+=[^=]+")][string[]]$Bedingungen
)
# CSV-Datei importieren
$csv = import-csv $inputFile -Delimiter ";"
$gefunden = $csv
# Bedingungen verarbeiten
foreach($Bedingung in $Bedingungen){
$spalte = $Bedingung.Split("=")
$suchwort = $Bedingung.Split("=")[1]
$gefunden = $gefunden | ?{$_."$spalte" -like "$suchwort"}
}
if ($gefunden){
# Exportieren der gefundenen Einträge
$gefunden | export-csv $outputFile -Delimiter ";" -NoTypeInformation
# gefundene Einträge aus Original-Datei eliminieren indem wir das Original-Objekt mit den gefundenen Einträgen vergleichen
$diff = Compare -ReferenceObject $csv -DifferenceObject $gefunden | Select -ExpandProperty InputObject
if ($diff){
$diff | export-csv $inputFile -Delimiter ";" -NoTypeInformation
}
}
}
# Funktion aufrufen
myFilterTool -inputFile "C:\original.csv" -outputFile "C:\ausgabe.csv" -Bedingungen @("Info2=Defekt","Info4=Bezahlt")
myFilterTool -inputFile "C:\original.csv" -outputFile "C:\ausgabe.csv" -Bedingungen @("Info2=Defekt","Info4=Bezahlt")
Grüße Uwe
Zitat von @Haven205:
Wir haben es mal getestet, allerdings löscht er den gefundenen Datensatz nicht aus dem Orginal sondern er wird nur in eine Ausgabe.csv kopiert
Bei mir geht's hier einwandfrei ...Wir haben es mal getestet, allerdings löscht er den gefundenen Datensatz nicht aus dem Orginal sondern er wird nur in eine Ausgabe.csv kopiert
Ist es auch möglich, da wird mit einem festen Satzaufbau ( d.h. die Abstände sind durch Leerzeichen getrennt ) von
Stelle X über eine Länge von Y zu suchen?
alles ist möglich ...Stelle X über eine Länge von Y zu suchen?
ohne konkrete Beispieldaten ein Raten mit der Glaskugel..
Grüße Uwe
Läuft die Abfrage dann über Array's oder gibt es spezielle Befehle die von links anfangen zu lesen über eine
Länge von z.B. 20 Zeichen oder von Stelle 12 bis Stelle 19?
dafür gibt es mehrere Möglichkeiten, kannst du z.B. mit der Funktion Substring $deinString.Substring(0,20) machen oder mit Regular Expressions.Länge von z.B. 20 Zeichen oder von Stelle 12 bis Stelle 19?
Grüße Uwe
Zitat von @Haven205:
Ok, dank dir erstmal.
Ich werde mal versuchen wie bzw wo ich den Schnipsel in den Code integriere.
Ok, dank dir erstmal.
Ich werde mal versuchen wie bzw wo ich den Schnipsel in den Code integriere.
ohne jetzt deine Quelldaten zu kennen, z.B. nach diesem Schema als Anregung (die Position Substring an der gesucht wird musst du natürlich an deine Bedürfnisse anpassen).
Das einbauen mehrerer Bedingungen habe ich dir mal als Hausaufgabe gelassen.
function myFilterTool{
# Parameter der Funktion deklarieren
param(
[parameter(mandatory=$true)][string]$inputFile,
[parameter(mandatory=$true)][string]$outputFile,
[parameter(mandatory=$true)][string]$suchwort
)
$lines = gc $inputFile
$foundlines = $lines | ?{($_.Substring(0,10).Trim()) -Like $suchwort}
if($foundlines){
$foundlines | set-content $outputFile
write-host "Folgende Zeilen wurden gefunden und exportiert:" -ForegroundColor Green
$foundlines
$diff = Compare $lines $foundlines | Select -ExpandProperty InputObject
if ($diff){
$diff | Set-Content $inputFile
}
}else{
write-host "Für das Suchwort wurde kein Eintrag gefunden!" -ForegroundColor Red
}
}
myFilterTool -inputFile "C:\temp\demo.csv" -outputFile "C:\temp\demo2.csv" -suchwort "Tastatur"