Powershell - durchsuche TXT Datei und füge mehrfach gleiche Werte in eine Zeile zusammenfassen
Ich habe folgende Datei und muss diese umstrukturieren. Hier komme ich nicht weiter.
Ich habe eine Datei a.txt mit folgendem Inhalt:
die Namen kenne ich leider nicht. Diese sind unbekannte Variablen. Ich möchte das die Datei am Ende wie folgt aussieht.
Irgendwie finde ich hierzu nichts passendes und selbst komm ich leider auch nicht weiter.
Vielen Dank schon mal für die Mithilfe.
Ich habe eine Datei a.txt mit folgendem Inhalt:
maier;3
maier;4
maier;9
müller;1
müller;2
müller5
müller8
müller6
usw.
die Namen kenne ich leider nicht. Diese sind unbekannte Variablen. Ich möchte das die Datei am Ende wie folgt aussieht.
maier;3;4;9
müller;1;2;5;8;6
usw.
Irgendwie finde ich hierzu nichts passendes und selbst komm ich leider auch nicht weiter.
Vielen Dank schon mal für die Mithilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 360739
Url: https://administrator.de/forum/powershell-durchsuche-txt-datei-und-fuege-mehrfach-gleiche-werte-in-eine-zeile-zusammenfassen-360739.html
Ausgedruckt am: 09.04.2025 um 18:04 Uhr
6 Kommentare
Neuester Kommentar
Da gibt's mehrere Varianten, hier mal schnell zwei mit der Zuhilfenahme von Group-Object das für solche Dinge prädestiniert ist.
oder
Alternativ kannst du auch die Textdatei manuell mit einer For-Each-Schleife durchlaufen Namen und Wert splitten und in eine Hashtable schreiben bei der du die Werte immer anhängst.
Das wäre die alte Methode, aber warum so wenn es Group-object gibt, was das für dich schon erledigt
.
Nun darfst du dich bedienen
.
Schönen Abend
Uwe
$file = 'c:\a.txt'
(Import-CSV $file -delimiter ";" -Header 'Name','Wert' -Encoding Default) | group Name | %{"$($_.Name);$($_.Group.Wert -join ';')"} | sc $file
$file = 'c:\a.txt'
(gc $file) | group {$_.split(';')} | %{
$werte = ($_.Group | %{$cols = $_.split(';');if ($cols.Count -gt 1){$cols[1]}}) -join ';'
"$($_.Name);$werte"
} | sc $file
$file = "C:\a.txt"
$werte = [ordered]@{}
(gc $file) | %{
$cols = $_.split(';')
$name = $cols
if ($cols.Count -gt 1){
[string[]]$werte.$name += $cols[1]
}else{
$werte.$name = ""
}
}
$werte.GetEnumerator() | %{"$($_.Key);$($_.Value -join ';')"} | sc $file
Das wäre die alte Methode, aber warum so wenn es Group-object gibt, was das für dich schon erledigt
Nun darfst du dich bedienen
Schönen Abend
Uwe
Hier müsste ich doch theoretisch auch eine maximallänge für Werte pro Zeile festlegen können oder?
Bzw. sagen können das es immer Bsp. 10 Werte sind und den rest einfach mit "" getrennt durch ein ";" auffüllen.
Hmm. verstehe nicht ganz was du meinst. Meinst du so?Bzw. sagen können das es immer Bsp. 10 Werte sind und den rest einfach mit "" getrennt durch ein ";" auffüllen.
"Müller";"1;2;3;4"
Habe mich nämlich schon gewundert das du zum Trennen beides mal sowohl den Namen von den Werten also auch die Werte das Semikolon haben wolltest ...
Export
Import
In der Schleife dann die Werte ansprechbar mit Nummern 1-X
$_.1, $_.2 usw.
$file = 'A:\a.txt'
(Import-CSV $file -delimiter ";" -Header 'Name','Wert') | group Name | %{
$obj = [pscustomobject]@{Name=$_.Name}
$cnt = 1
$_.Group.Wert | %{$obj | Add-Member -MemberType NoteProperty -Name $cnt -Value $_ -Force; $cnt++}
$obj
} | export-csv $file -NoType -Delimiter ";" -Encoding UTF8
$file = 'A:\datei.csv'
$csv = Import-CSV $file -delimiter ";"
$csv
$_.1, $_.2 usw.