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.
Please also mark the comments that contributed to the solution of the article
Content-Key: 360739
Url: https://administrator.de/contentid/360739
Printed on: April 23, 2024 at 20:04 o'clock
6 Comments
Latest comment
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.