xauiii
Goto Top

PowerShell: mehrere Dateien einlesen, bearbeiten wieder ausgeben

Hi,

vielleicht kann mir jemand weiterhelfen oder mir was empfehlen wo ich mich einlesen kann.
Folgendes Problem ich bekomme mehrere .CSV Dateien die jedesmal unterschiedliche Namen haben. Ich würde gerne die Dateien alle einlesen und die Spalte 1 die ID heißt um den String '-001' ergänzen hinzukommt noch das die letzte Spalte eine Bezeichnung beinhaltet die sollte ausgelesen werden und dann je nach Bezeichnung eine Datei erstellt werden und das immer einmal täglich.

Dateien sehen z.B. so aus.

Datei_1234.CSV
Datei_5578.CSV
Datei_7854.CSV

Inhalt von den Spaltenbezeichnungen ist immer gleich:

Datei_1234.CSV
ID;EX-ID;track;Name
1;34;1234; Name1

Datei_5578.CSV
ID;EX-ID;track;Name
534;3421;1234; Name2

Jetzt müsste mal alle Dateien auslesen und sozusagen dann nur noch 2 Dateien erstellen einmal dann mit Name1 und Name2 und die erste Zeile id müsste ein -001 angehängt werden z.B. 1-001 und 534-001.

Ist das so mit Powershell möglich? Das ich sage hol dir alle CSV Dateien aus dem Ordner bearbeite die erste Spalte und erstelle in Ordner XY eine neue Datei anhand der 4ten Spalte.

Content-ID: 527870

Url: https://administrator.de/forum/powershell-mehrere-dateien-einlesen-bearbeiten-wieder-ausgeben-527870.html

Ausgedruckt am: 21.04.2025 um 11:04 Uhr

142232
Lösung 142232 20.12.2019 aktualisiert um 11:34:37 Uhr
Goto Top
$folder_csv = 'D:\Daten'  
$folder_fileout = 'D:\ausgabe'  

Get-ChildItem $folder_csv -File -Filter *.csv | %{
    Import-csv $_.Fullname -Delimiter ";" | %{  
        $_.ID = $_.ID + "-001"  
        $_ | export-csv "$folder_fileout\$($_.Name).txt" -Delimiter ";" -NoType -Encoding UTF8 -append  
    }
}
erikro
erikro 20.12.2019 aktualisiert um 11:14:42 Uhr
Goto Top
Moin,

Zitat von @142232:

> $folder_csv = 'D:\Daten'  
> $folder_fileout = 'D:\ausgabe'  
> 
> Get-ChildItem $folder_csv -File -Filter *.csv | %{
>     Import-csv $_.Fullname -Delimiter ";" | %{  
>         $_.ID = $_.ID + "-001"  
>         $_ | export-csv "$folder_fileout\$($_.Name).txt" -Delimiter ";" -NoType -Encoding UTF8  
>     }
> }
> 

Vom Prinzip ja. Aber aus Performancegründen sollte man hier nicht die Pipe und foreach-Object nehmen, sondern eine foreach-Schleife. Siehe https://devblogs.microsoft.com/scripting/getting-to-know-foreach-and-for ...

Außerdem fehlt beim export-csv das -append.

$folder_csv = 'D:\Daten'  
$folder_fileout = 'D:\ausgabe'  

$files = Get-ChildItem $folder_csv -File -Filter *.csv 
foreach ($file in $files) {
    $data = Import-csv $($file.Fullname) -Delimiter ";"   
    foreach($dataset in $data {
        $data.ID = $data.ID + "-001"  
        $data | export-csv "$folder_fileout\$($data.Name).txt" -Delimiter ";" -NoType -Encoding UTF8 -append  
    }
}

hth

Erik
142232
142232 20.12.2019 aktualisiert um 11:40:20 Uhr
Goto Top
Aber aus Performancegründen sollte man hier nicht die Pipe und foreach-Object nehmen
Das ist Sache der Abwägung, wenn man es mit einem sehr großen File zu tun spart das foreach-object jede Menge RAM und initial legt es dann sofort los, anstatt warten zu müssen bis das File komplett ins RAM eingelesen ist. Bei kleinen CSV-Dateien richtig ist das schneller.
Außerdem fehlt beim export-csv das -append.
Jipp wenns mehrere Datensätze für den selben Namen gibt.
erikro
erikro 20.12.2019 um 11:43:16 Uhr
Goto Top
Zitat von @142232:

Aber aus Performancegründen sollte man hier nicht die Pipe und foreach-Object nehmen
Das ist Sache der Abwägung, wenn man es mit einem sehr großen File zu tun spart das foreach-object jede Menge RAM und initial legt es dann sofort los, anstatt warten zu müssen bis das File komplett ins RAM eingelesen ist. Bei kleinen CSV-Dateien richtig ist das schneller.

Naja, selbst wenn es 100 Zeichen 16bittig pro Datensatz sind und 1.000.000 Datensätze, ist das file gerade mal knappe 200MB groß. Das sollte für moderne Rechner kein großes Problem darstellen. face-wink

Außerdem fehlt beim export-csv das -append.
Jipp wenns mehrere Datensätze für den selben Namen gibt.

So habe ich die Aufgabe verstanden. face-wink
142232
142232 20.12.2019 aktualisiert um 11:47:44 Uhr
Goto Top
Zitat von @erikro:
Naja, selbst wenn es 100 Zeichen 16bittig pro Datensatz sind und 1.000.000 Datensätze, ist das file gerade mal knappe 200MB groß. Das sollte für moderne Rechner kein großes Problem darstellen. face-wink
Ich meinte damit ja richtig große files, nicht solche Winzlinge face-smile. Wie gesagt immer Abwägungssache, wenn z.B. Speicher knapp ist oder will das die Verarbeitung sofort loslegt ohne das man warten will bis das ganze in den Speicher geladen ist.
xauiii
xauiii 10.01.2020 um 08:47:23 Uhr
Goto Top
funktioniert genauso wie gedacht nur ne kleine Optimierung, was muss noch dazu wenn ich den $folder_csv nachdem einlesen komplett leeren will?

und geht das in der Zeile $_ | export-csv "$folder_fileout\$($_.Name).txt" -Delimiter ";" -NoType -Encoding UTF8 -append das ich anstatt folder_fileout\Name.txt dem ganzen ne Ebene hinzufüge d.h. folder_fileout\Name\Name.txt also zusätzlich für den Name.txt ein Ordner erstelle?