pat.bat
Goto Top

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:

$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:

beispiel_zahlliste


Ich danke euch schonmal für eure Hilfe.

Content-Key: 463875

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

Ausgedruckt am: 28.03.2024 um 18:03 Uhr

Mitglied: NetzwerkDude
NetzwerkDude 19.06.2019 um 13:39:45 Uhr
Goto Top
Sieht mir verdächtig nach Tabs aus, versuch mal folgendes:
Import-Csv -Delimiter "`t"   
Mitglied: emeriks
emeriks 19.06.2019 um 13:39:58 Uhr
Goto Top
Hi,
enthalten die Daten selbst (die Feldinhalte) auch Leerzeichen (potentiell)? Und falls ja, sind die Feldinhalte dann in "" eingeschlossen?

E.
Mitglied: erikro
erikro 19.06.2019 um 14:55:24 Uhr
Goto Top
Moin,


Zitat von @emeriks:
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
Mitglied: Kraemer
Kraemer 19.06.2019 um 15:17:59 Uhr
Goto Top
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ässt
Mitglied: Pat.bat
Pat.bat 19.06.2019 um 15:55:34 Uhr
Goto Top
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).

Zwischen dem Aktenzeichen und der Buchungsnummer befindet sich 4 Leerzeichen und zwischen Betrag und Aktenzeichen ein TAB.

Vll gibt es die Möglichkeit, das wenn mehr als ein Leerzeichen, dann lösche alle leerzeichen und TABs bzw Trenne es danach. :S

Danke schomal für den tollen Input hier face-smile
Mitglied: colinardo
colinardo 19.06.2019 aktualisiert um 16:58:43 Uhr
Goto Top
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.

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
Grüße Uwe
Mitglied: erikro
erikro 19.06.2019 um 16:39:43 Uhr
Goto Top
Moin,

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.

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
Mitglied: colinardo
colinardo 19.06.2019 aktualisiert um 16:57:08 Uhr
Goto Top
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.
Mitglied: erikro
erikro 19.06.2019 aktualisiert um 16:58:39 Uhr
Goto Top
Moin,

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
Mitglied: colinardo
colinardo 19.06.2019 aktualisiert um 17:33:32 Uhr
Goto Top
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. :
$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  
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:
((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