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

Printed on: May 7, 2024 at 13:05 o'clock

Member: NetzwerkDude
NetzwerkDude Jun 19, 2019 at 11:39:45 (UTC)
Goto Top
Sieht mir verdächtig nach Tabs aus, versuch mal folgendes:
Import-Csv -Delimiter "`t"   
Member: emeriks
emeriks Jun 19, 2019 at 11:39:58 (UTC)
Goto Top
Hi,
enthalten die Daten selbst (die Feldinhalte) auch Leerzeichen (potentiell)? Und falls ja, sind die Feldinhalte dann in "" eingeschlossen?

E.
Member: erikro
erikro Jun 19, 2019 at 12:55:24 (UTC)
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
Member: Kraemer
Kraemer Jun 19, 2019 at 13:17:59 (UTC)
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
Member: Pat.bat
Pat.bat Jun 19, 2019 at 13:55:34 (UTC)
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
Member: colinardo
colinardo Jun 19, 2019 updated at 14:58:43 (UTC)
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
Member: erikro
erikro Jun 19, 2019 at 14:39:43 (UTC)
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
Member: colinardo
colinardo Jun 19, 2019 updated at 14:57:08 (UTC)
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.
Member: erikro
erikro Jun 19, 2019 updated at 14:58:39 (UTC)
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
Member: colinardo
colinardo Jun 19, 2019 updated at 15:33:32 (UTC)
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