leax55
Goto Top

Textdatei anhand xy-Koordinaten auslesen

Hallo Gemeinde,

gibt es in Powershell eine Möglichkeit ein Text/Zahl aus einer Textdatei auszulesen anhand xy-Koordinaten?
Als Beispiel habe ich eine Textdatei, aus der ich immer den Inhalt aus der 6. Zeile ab Zeichen 35 haben will. Und zwar bis zum nächsten "|" Symbol. Leerzeichen sollen entfernt werden.
Wir haben im Unternehmen bereits so ein Tool das mit xy-Koordinaten Textdateien ausliest. In dem Fall muss ich dann einfach 35(x) und 6(y) eingeben damit das funktioniert. Leider kann dieses Tool aber keine Dateiaktionen ausführen die ich zwingend machen muss. Deswegen benötige ich ein eigenes Script.

Content-Key: 1114017914

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

Ausgedruckt am: 19.03.2024 um 11:03 Uhr

Mitglied: TK1987
Lösung TK1987 02.08.2021 aktualisiert um 11:44:37 Uhr
Goto Top
Moin,

mit einem bisschen Regex kein Problem
# Dateipfad
$File = 'C:\Test\Datei.txt'  

# Zeile 6 lesen
$Line = ( Get-Content -Path $File -Totalcount 6 )[-1]

# Wert ab Zeichen 35 bis zur nächsten Pipe ohne Leerzeichen
$Value = $Line.Substring(34) -Replace '\|.*| +'  
Regex Tutorial
Regex Legende

Gruß Thomas
Mitglied: LeaX55
LeaX55 02.08.2021 um 13:58:13 Uhr
Goto Top
Super Vielen Dank! genau sowas hab ich gesucht.
Ich habe das nun erweitert damit ein neuer Ordner mit dem Wert $Value angelegt wird und diese Datei in diesen Ordner verschiebt werden soll.
Alles funktioniert bis auf die letzte Zeile mit dem move-item. Was fehlt denn da noch??
Move-Item : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.

# Dateipfade
$archivpfad = 'C:\Test'  
$quellpfad = 'C:\Quelle\*.txt'  

# Zeile 6 lesen
$Line = ( Get-Content -Path $quellpfad -Totalcount 6 )[-1]

# Wert ab Zeichen 35 bis zur nächsten "|" ohne Leerzeichen 
$Value = $Line.Substring(34) -Replace '\|.*| +'  
# neuen Ordnernamen aus dem regex extrahieren und mit dem Quell-Ordner zu einem Pfad zusammensetzen
$subordner = join-path $archivpfad $Value
# neuen Ordner erstellen
md  $subordner -Force | out-null
# und Datei rein kopieren
move-item -Path $Value.Path -Destination $subordner
Mitglied: TK1987
Lösung TK1987 02.08.2021 aktualisiert um 14:54:20 Uhr
Goto Top
Zuerst mal, müsstest du das alles in einer Foreach-Schleife laufen lassen - sonst würde immer nur die erste TXT-Datei verabeitet.
Wenn in der Zeile ein Pfad steht ist der Regex oben falsch, da er auch Leerzeichen innerhalb dieses Pfades löschen würde. Ich gehe mal davon aus, du möchtest nur Leerzeichen, die nach dem Pfad folgen löschen -> ist unten korrigiert.

Darüber hinaus ist $Value eine Zeichenkette und kein Objekt, hat dementsprechend auch keine Path-Eigenschaft.
Wenn Join-Path und md funktionieren, gehe ich mal davon aus, in $Value steht ein Ordnername?!
Sofern dieser Ordner im Quellpfad liegt, sähe das ganze so aus:
# Dateipfade
$archivpfad = 'C:\Test'  
$quellpfad = 'C:\Quelle'  

Foreach ($File in Get-ChildItem -Path "$quellpfad\*.txt" -File) {  

  # Zeile 6 lesen
  $Line = ( Get-Content -Path $File -Totalcount 6 )[-1]
  
  # Wert ab Zeichen 35 bis zur nächsten "|" ohne Leerzeichen 
  $Value = $Line.Substring(34) -Replace ' *\|.*'  

  # neuen Ordnernamen aus dem regex extrahieren und mit dem Quell-Ordner zu einem Pfad zusammensetzen
  $subordner = join-path $archivpfad $Value

  # neuen Ordner erstellen
  md  $subordner -Force | out-null

  # und Datei rein kopieren
  move-item -Path "$quellpfad\$Value" -Destination $subordner  

} # Ende Foreach
Mitglied: LeaX55
LeaX55 02.08.2021 aktualisiert um 16:28:16 Uhr
Goto Top
Musste aus der 34 eine 35 machen weil er nachdem Du das geändert hast, 1 Zeichen vorher angefangen hat zu lesen.

Mit dem move-item kommt er jedoch immer noch nicht klar.
move-item : Der Pfad "C:\Quelle\1234567890" kann nicht gefunden werden, da er nicht vorhanden ist.

Er denkt das ist ein Pfad und keine Datei.

Ansonsten passt alles, die Ordner werden mit richtigen Namen im Archivpfad angelegt.

Ich Anfänger habe noch versucht dem $Value ein .txt anzufügen mit $Value=$Value + ".txt"
Hat er natürlich nicht gefressen :D

Edit: grad gelesen dass du die Problematik angesprochen hast....
$Value soll der Ordnername werden aber im Quellpfad liegt kein Ordner mit dem Namen.
Sonst könnte ich den Ordner ja vom Quellpfad einfach in den Archivpfad verschieben und bräuchte diesen ganzen Script nicht (Es soll ein Archivierungstool werden der anhand einer Bestellnr Ordner anlegt und die Dateien in diese archiviert)
Mitglied: TK1987
TK1987 02.08.2021 aktualisiert um 16:43:27 Uhr
Goto Top
Zitat von @LeaX55:
Musste aus der 34 eine 35 machen weil er nachdem Du das geändert hast, 1 Zeichen vorher angefangen hat zu lesen.
In dem Fall willst du die Zeile dann aber auch erst ab dem 36 Zeichen haben face-wink

Mit dem move-item kommt er jedoch immer noch nicht klar.
move-item : Der Pfad "C:\Quelle\1234567890" kann nicht gefunden werden, da er nicht vorhanden ist.

Er denkt das ist ein Pfad und keine Datei.
move-item ist es grundsätzlich egal, ob das ein Ordner- oder Dateipfad ist. Funktioniert in beiden Fällen. das Problem ist hier, dass die Datei keine Erweiterung hat und der Pfad daher nicht existiert.

Ich Anfänger habe noch versucht dem $Value ein .txt anzufügen mit $Value=$Value + ".txt"
Hat er natürlich nicht gefressen :D
Sollte aber so funktionieren. Welche Fehlermeldung bringt er denn da?

Ansonsten kannst du die Erweiterung natürlich auch erst beim Move-Item-Befehl anhängen, wenn $Value der Dateiname ist.
move-item -Path "$quellpfad\$Value.txt" -Destination $subordner  
Mitglied: LeaX55
LeaX55 02.08.2021 um 16:49:07 Uhr
Goto Top
Es kommt die gleiche Fehlermeldung, nur eben mit .txt am Ende
move-item : Der Pfad "C:\Quelle\1234567890.txt" kann nicht gefunden werden, da er nicht vorhanden ist.

Schon seltsam...
Mitglied: TK1987
TK1987 02.08.2021 um 17:23:02 Uhr
Goto Top
Zitat von @LeaX55:
Es kommt die gleiche Fehlermeldung, nur eben mit .txt am Ende
move-item : Der Pfad "C:\Quelle\1234567890.txt" kann nicht gefunden werden, da er nicht vorhanden ist.
Die Fehlermeldung ist doch eindeutig - die Datei existert unter dem Pfad nicht.
Mitglied: LeaX55
LeaX55 02.08.2021 um 17:38:12 Uhr
Goto Top
ah jetzt versteh ichs. Ja klar die Datei heisst ja auch nicht so.
Hmm ist alles doch etwas komplizierter als ich mir vorgestellt habe... :/
Mitglied: TK1987
Lösung TK1987 02.08.2021 um 18:47:19 Uhr
Goto Top
Welche Datei willst du denn genau verschieben?
Etwa die, aus der Zeile 6 extrahiert wurde? Dann:
move-item -Path $File.fullname -Destination $subordner

Ansonsten musst du die Aufgabenstellung schon etwas genauer definieren.
Mitglied: LeaX55
LeaX55 02.08.2021 aktualisiert um 21:22:15 Uhr
Goto Top
Ja immer jeweils die Datei aus der extrahiert wird.

Aber sieht so als würde das nun funkionieren mit dem $File.Fullname!

Herzlichen Dank!

Eine letzte kleine Frage hätte ich noch. Was ist wenn ich nicht bis zum nächsten Pipe sondern bis zum nächsten Leerzeichen auslesen will? Langt es das Pipe Symbol im regex durch ein Leerzeichen zu ersetzen?
Mitglied: TK1987
TK1987 02.08.2021 aktualisiert um 21:41:38 Uhr
Goto Top
In dem Fall lautet der Regex einfach ' .*'

Der Ordnername selbst darf dann aber natürlich keine Leerzeichen enthalten.