derhoeppi
Goto Top

Powershell Get-Content Zeilenumbrüche und leere Elemente entfernen

Hallo,

mein Ziel ist es aus einer Textdatei eine Zeile auszulesen und diese zu zerlegen, so dass ich jedes Element der Textdateizeile ansprechen kann.

Meine Textzeile sieht folgendermaßen aus:
Nummern:1 2 3 4 5 6 7 8 9 10
Die Nummern gehen in meinem Fall über die hundert hinaus. Wenn ich die Zeile über
 $nummern = get-content Textdatei.txt | select-string "Nummern:" | Out-String   
einlese, habe ich das Problem das Powershell der langen Textzeile Umbrüche verpasst. Dies führt bei mir zu dem Fehler das mein Array nach dem Split() leere Elemente enthält. Ein einfaches
 $nummern | ? {$_} 
entfernt leider nicht diese Elemente. Wie kann ich das realisieren?

Gruß
derhoeppi

Content-Key: 278128

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

Printed on: April 16, 2024 at 06:04 o'clock

Mitglied: 114757
114757 Jul 23, 2015 updated at 09:04:47 (UTC)
Goto Top
$nummern = [regex]::match((get-content Textdatei.txt |out-string),'(?im)^Nummern:(.*)').Groups[1].Value -split '\s+'  
Gruß jodel32
Member: derhoeppi
derhoeppi Jul 23, 2015 at 09:54:41 (UTC)
Goto Top
Hallo Jodel32,

vielen Dank für die Antwort. Dein Code verfolgt leider nicht mein Ziel. Ich möchte aus der Textdatei, die Zeile mit den Nummern in ein Array schreiben, dann den im Array enthaltenen String "Nummern:" entfernen und dann lediglich die Zahlen im Array zu behalten. Ich bin bereits soweit gekommen, dass ich den String "Nummern:" entfernt habe und den übrigen String mit Split zerlegt habe. Leider habe ich bei der Ausgabe des Arrays (mit Hilfe von foreach) noch Leerzeilen. Diese Leerzeilen kommen vom Einlesen der Textdatei ins Array. In der Textdatei ist die Zeile sehr lang, wenn sie ins Array eingelesen ist, erhalte ich Zeilenumbrüche. Genau diese muss ich noch entfernen.

Gruß
derhoeppi
Mitglied: 114757
114757 Jul 23, 2015 updated at 10:18:34 (UTC)
Goto Top
Dein Code verfolgt leider nicht mein Ziel
Doch, genau das was du beschreibst tut er (alles in Einem)... Nur weil du es vielleicht nicht verstehst ist er nicht falsch face-wink

Wenn man will kann man das auch so schreiben:
$nummern = (((get-content 'C:\data.txt') | ?{$_ -match '^Nummern:'}) -split ':')[1] -split '\s+'  
Es gibt halt immer 1001 Wege nach Kanossa face-smile
Member: derhoeppi
derhoeppi Jul 23, 2015 at 10:20:31 (UTC)
Goto Top
Hallo Jodel32,
okay ich habe aus deinem ersten Post, den ersten Code genommen, den du inzwischen entfernt hast. Mit dem zweiten bin ich jetzt ein Stück weiter. Folgendes mache ich nun:

$nummern = [regex]::match((get-content Textdatei.txt |out-string),'(?im)^Nummern:(.*)').Groups[1].Value -split '\s+'  
$nummern = $nummern.Replace("Nummern:","")  
$nummern = $nummern.trim()
Wenn ich das ganze nun ausgebe, habe ich vor der ersten und nach der letzten Zahl einen leeren Array Wert.

Gruß
derhoeppi
Mitglied: 114757
Solution 114757 Jul 23, 2015 updated at 11:49:48 (UTC)
Goto Top
Zitat von @derhoeppi:
$nummern = $nummern.Replace("Nummern:","")
$nummern = $nummern.trim()
Erstens ist die zweite Zeile überflüssig weil das "Nummern" durch ein Regex Group Matching schon wegradiert wird, und zweitens trimmt der Befehl trim() kein Array sondern nur Leerzeichen bei Strings.
Wenn ich das ganze nun ausgebe, habe ich vor der ersten und nach der letzten Zahl einen leeren Array Wert.
Kenne leider deine "genaue" Textdatei nicht (Sonderzeichen etc. pp), aber wenn der Array-Wert wirklich leer sein sollte lässt sich das schnell ausfiltern, damit das Array nur aus Zahlen und sonst nichts besteht
$nummern = $nummern | ?{$_ -match "\d+"}  

Aber ich glaube du siehst die Ausgabe auf der Konsole einfach falsch, da sieht es manchmal so aus als wäre vor und danach ein leeres Element aber dem ist nicht so , das meint man nur wenn man in der ISE arbeitet und eine Leerzeile nach seinem Code hat face-wink
Ein $nummern.length sollte einem die genaue Array-Länge anzeigen.
Member: derhoeppi
derhoeppi Jul 23, 2015 at 11:49:11 (UTC)
Goto Top
Hallo Jodel32,

so ich habe das ganze nun noch einmal anders versucht. Nun sieht es so aus und funktioniert wie gewünscht.
$nummern = (((get-content 'C:\data.txt') | ?{$_ -match '^Nummern:'}) -split ':')[1] -split '\s+'  
$nummern = $nummern | ?{$_ -match "\d+"}  

Vielen Dank.

Gruß derhoeppi