Textdatei mit Powershell auslesen und bestimmte Daten in Excel speichern
Hallo zusammen,
ich habe folgende Schwierigkeit.
Ich hab eine Textdatei, wo pro Zeile ein Datensatz ist. Die erste Zeile sind die Überschriften. geteilt ist das ganze durch mehrere Leerzeichen (immer unterschiedlich lang).
Ich habe mich hier schon durch einige Threads gelesen und unter anderem folgendes ausprobiert:
Resultat:
Allerdings hat bis jetzt nichts funktioniert. Ich denke, das Problem liegt an den vielen Leerzeichen.
Anbei noch ein Screenshot von der Textdatei:
Ich danke euch schonmal für eure Hilfe.
ich habe folgende Schwierigkeit.
Ich hab eine Textdatei, wo pro Zeile ein Datensatz ist. Die erste Zeile sind die Überschriften. geteilt ist das ganze durch mehrere Leerzeichen (immer unterschiedlich lang).
Ich habe mich hier schon durch einige Threads gelesen und unter anderem folgendes ausprobiert:
$csv = Import-Csv "G:\FD_50_Bank\System\Zahllisten\Zahlliste_Einfach.txt" -Delimiter " "
$csv | %{
Write-Host $_.Aktenzeichen
}
Resultat:
WARNUNG: Mindestens ein Header war nicht angegeben. Für jeden fehlenden Header wurde ein mit "H" beginnender Standardname verwendet.
Allerdings hat bis jetzt nichts funktioniert. Ich denke, das Problem liegt an den vielen Leerzeichen.
Anbei noch ein Screenshot von der Textdatei:
Ich danke euch schonmal für eure Hilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 463875
Url: https://administrator.de/forum/textdatei-mit-powershell-auslesen-und-bestimmte-daten-in-excel-speichern-463875.html
Ausgedruckt am: 08.04.2025 um 20:04 Uhr
10 Kommentare
Neuester Kommentar
Moin,
Auf dem Bild sieht das so aus wie ja und nein. Aber das Trennzeichen wird schon ein TAB sein, so wie das aussieht.
Liebe Grüße
Erik
Zitat von @emeriks:
enthalten die Daten selbst (die Feldinhalte) auch Leerzeichen (potentiell)? Und falls ja, sind die Feldinhalte dann in "" eingeschlossen?
enthalten die Daten selbst (die Feldinhalte) auch Leerzeichen (potentiell)? Und falls ja, sind die Feldinhalte dann in "" eingeschlossen?
Auf dem Bild sieht das so aus wie ja und nein. Aber das Trennzeichen wird schon ein TAB sein, so wie das aussieht.
Liebe Grüße
Erik
Zitat von @erikro:
Auf dem Bild sieht das so aus wie ja und nein. Aber das Trennzeichen wird schon ein TAB sein, so wie das aussieht.
oder feste Breite, wie das .txt vermuten lässtAuf dem Bild sieht das so aus wie ja und nein. Aber das Trennzeichen wird schon ein TAB sein, so wie das aussieht.
Zitat von @Pat.bat:
Die Leerzeichen bestehen aus mindestens einem TAB und je nach Abstand zwischen den Spalten aus einer unterschiedlichen Anzahl von Leerzeichen.
Wäre für uns einfacher wenn du einfach einen Originalausschnitt in Codetags posten würdest statt einem Bild, dann hätten wir es exakt hier vorliegen und müssten nicht in der Gegend rum raten.Die Leerzeichen bestehen aus mindestens einem TAB und je nach Abstand zwischen den Spalten aus einer unterschiedlichen Anzahl von Leerzeichen.
Mangels Originalvorlage nach deinen Vorgaben klappt z.B. das hier:
$csv = ((gc 'G:\FD_50_Bank\System\Zahllisten\Zahlliste_Einfach.txt') -replace '^\s+','' ) -replace ' *\t *',';' | convertfrom-csv -Delimiter ";"
$csv
Moin,
Dann lässt sich das relativ einfach lösen:
Datei vorher:
und hinter
Getestet mit Leerzeichen vor, hinter oder vor und hinter dem TAB.
hth
Erik
Zitat von @Pat.bat:
Die Leerzeichen bestehen aus mindestens einem TAB und je nach Abstand zwischen den Spalten aus einer unterschiedlichen Anzahl von Leerzeichen. Fragt mich bitte nicht, mit welcher Logik das Ausgabeprogramm diese Datei erzeugt.
Die Leerzeichen bestehen aus mindestens einem TAB und je nach Abstand zwischen den Spalten aus einer unterschiedlichen Anzahl von Leerzeichen. Fragt mich bitte nicht, mit welcher Logik das Ausgabeprogramm diese Datei erzeugt.
Zum Beispiel haben wir zwischen der "Spalte" zuständiger Sachbearbeiter und der Spalte Verwendungszweck 11 Leerzeichen und ein TAB (Die Anzahl der Leerzeichen unterscheiden sich je nach länge des Namen).
Dann lässt sich das relativ einfach lösen:
$csv = Import-Csv test.csv -delimiter "`t"
foreach($dataset in $csv) {
export-csv -inputObject $dataset -path testneu.csv -delimiter ";" -Encoding utf8 -append -NoTypeInformation
}
Datei vorher:
Überschrift 1 Überschrift 2 Überschrift 3
Inhalt1 Inhalt2 Inhalt3
Inhalt1 Inhalt2 Inhalt3
Inhalt1 Inhalt2 Inhalt3
Inhalt1 Inhalt2 Inhalt3
Inhalt1 Inhalt2 Inhalt3
und hinter
"Überschrift 1";"Überschrift 2";"Überschrift 3"
"Inhalt1";"Inhalt2";"Inhalt3"
"Inhalt1";"Inhalt2";"Inhalt3"
"Inhalt1";"Inhalt2";"Inhalt3"
"Inhalt1";"Inhalt2";"Inhalt3"
"Inhalt1";"Inhalt2";"Inhalt3"
Getestet mit Leerzeichen vor, hinter oder vor und hinter dem TAB.
hth
Erik
Getestet mit Leerzeichen vor, hinter oder vor und hinter dem TAB
Bei einem Tab direkt nach der Spalte und folgenden Leerzeichen OK, stehen aber Leerzeichen vor dem Tab bleibt mindestens 1 Leerzeichen am Ende der Zelle zurück, er müsste also die Daten der Zellen noch mit Trim() bearbeiten wenn das für Ihn relevant ist.
Moin,
Nur wenn die Daten auch ein Leerzeichen enthalten. Das habe ich auch gerade gemerkt. So funktioniert es in allen Fällen:
Liebe Grüße
Erik
Zitat von @colinardo:
Getestet mit Leerzeichen vor, hinter oder vor und hinter dem TAB.
Bei einem Tab direkt nach der Spalte und folgenden Leerzeichen OK, stehen aber Leerzeichen vor dem Tab bleibt mindestens 1 Leerzeichen am Ende der Zelle zurück, er müsste also die Daten noch mit Trim() bearbeiten.Nur wenn die Daten auch ein Leerzeichen enthalten. Das habe ich auch gerade gemerkt. So funktioniert es in allen Fällen:
$csv = Import-Csv test.csv -delimiter "`t"
foreach($dataset in $csv) {
foreach($key in $dataset.keys) {
$dataset[$key] = $dataset[$key].trim()
}
export-csv -inputObject $dataset -path testneu.csv -delimiter ";" -Encoding utf8 -append -NoTypeInformation
}
Liebe Grüße
Erik
Das -append für jede Datenzeile kannst du dir noch sparen wenn du das Objekt als ganzes pipest, macht das ganze nur unnötig langsam und führt zu unnötig vielen Schreibzugriffen.
p.s. Das Datenobjekt hat keine "Keys" Collection und somit führt das nicht zum entsprechenden Ergebnis.
Wenn du es so in der Art machen willst bspw. :
Trotzdem hat das immer noch den Nachteil wenn in den Überschriften vor dem Tab Leerzeichen stehen, dann haben die Membernamen nämlich ebenfalls Leerzeichen in den Bezeichnungen! Das musst du bei dieser Variante bedenken und vor dem Einlesen mit Import-CSV behandeln oder die Objekte ändern, deswegen würde ich es gleich so abfackeln:
p.s. Das Datenobjekt hat keine "Keys" Collection und somit führt das nicht zum entsprechenden Ergebnis.
Wenn du es so in der Art machen willst bspw. :
$csv = Import-Csv test.csv -delimiter "`t"
$members = $csv | gm -MemberType NoteProperty | select -Expand Name
$csv | %{
foreach($m in $members){
$_.$m = $_.$m.trim()
}
}
$csv | export-csv -path testneu.csv -delimiter ";" -NoType -Encoding utf8
((gc 'G:\FD_50_Bank\System\Zahllisten\Zahlliste_Einfach.txt') -replace '^\s+','' ) -replace ' *\t *',';' | convertfrom-csv -Delimiter ";" | export-csv -path 'G:\FD_50_Bank\System\Zahllisten\Zahlliste_Einfach_NEU.csv' -delimiter ";" -Encoding utf8 -NoType