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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
6 Kommentare
Neuester Kommentar

$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
}
}
Moin,
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.
hth
Erik
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

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.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.
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.

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.
Ich meinte damit ja richtig große files, nicht solche Winzlinge 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.