misster
Goto Top

String aus Spalte in csv auslesen und ersetzen

Hallo,
meine aktuelle Frage bezieht sich auf diese Frage von Dienstag.

Ich muss nun eine csv auslesen und dort in der Spalte Name alle Werte ersetzen. Ob dann ein Name(z.B. "Test1") oder einfache Werte(z.B. "AA11") rauskommen ist dabei egal. Mit Hilfe von exguru konnte ich folgenden Code basteln:
$file = 'C:\tmpcache\DWH_DIM_ORGUNIT.csv'  
$colname = "NAME"  
$csv = Import-CSV $file -Delimiter ";"  

$csv | %{
    $num = $_.$colname; $row = $_
	$random = [regex]::replace($num,'.',{param($m) if ($m.Value -match '[A-Z]'){get-random -input "A","B","C","D" -setseed $m}elseif($row.Value -match '[1-4]'){get-random -input $m}})  
	$_ | gm -MemberType NoteProperty | ?{$row.($_.Name) -like "*$num*"} | %{$row.($_.Name) = $row.($_.Name) -replace $num,$random}  
    $row
} | export-csv $file -Delimiter ";" -NoType -Encoding UTF8  

Die Schwierigkeit vor der ich stehe ist aktuell, zum Einen, dass die ersten drei Zeilen nach der Überschrift nicht randomized werden dürfen (daher meine esleif-Versuch) und zum Anderen, dass Characterweise eingelesen wird und ich nicht drauf komme wie ich stringweise Werte aus eine Spalte einlesen und replacen kann. Ich hatte die Idee mit regex '[A-Z]\|[a-z]\|" "\|"("\| ")"' zu arbeiten um das mit Characterweise auslesen trotzdem umzusetzen, klappt aber nicht.

Vielen Dank schonmal für eure Hilfe! face-smile

Grüße
mIsSteR

EDIT:
So sieht die CSV aus:
"ID";"PARENT";"NAME";"SHORT_NAME";"SPALTE5";"SPALTE6"  
"Alle Orgunits";;"Alle Orgunits"  
"Keine Konsolidierung";"Alle Orgunits";"Keine Gruppe";"Keine Gruppe"  
"Keine Gruppe";"Keine Konsolidierung";"Keine Konsolidierung";"Keine Konsolidierung"  
"0200001";"Keine Gruppe";"Firma A";"Firma A";"020";"0001";;  
"0200002";"Keine Gruppe";"Firma A (alt)";"Firma A (alt)";"020";"0002";;  
"0200003";"Keine Gruppe";"Firma B";"Firma B";"020";"0003"  

Content-Key: 344758

Url: https://administrator.de/contentid/344758

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: 133883
133883 28.07.2017 aktualisiert um 12:19:34 Uhr
Goto Top
Mitglied: mIsSteR
mIsSteR 28.07.2017 um 13:10:48 Uhr
Goto Top
Hi exguru,

das habe ich schon gelesen.
Ich bekomme es jedoch nicht hin die ersten Spalten in Ruhe zu lassen und bekomme Leerzeichen, Klammern, usw. nicht eingefangen. Mit meinem aktullem Code verändert sich leider nichts:
$file = 'C:\tmpcache\Datei.csv'  
$colname = "NAME"  
$csv = Import-CSV $file -Delimiter ";"  

$csv | %{
    $num = $_.$colname; $row = $_
	$random = [regex]::replace($num,'\+',{param($m) get-random -input "A","B","C","D"})  
	$_ | gm -MemberType NoteProperty | ?{$row.($_.Name) -like "*$num*"} | %{$row.($_.Name) = $row.($_.Name) -replace $num,$random}  
    $row
} | export-csv $file -Delimiter ";" -NoType -Encoding UTF8   
Mitglied: 133883
133883 28.07.2017 aktualisiert um 14:15:15 Uhr
Goto Top
Dann empfehle ich dir erst mal einen Powershell Grundkurs.
\+
Du willst + Zeichen ersetzen durch ABC oder D???
?{$row.($_.Name) -like "*$num*"}
Und du suchst ja nicht nach Spalten die "Name" im Spaltennamen haben ...
Also werde dir selbst erst mal über die Funktionsweise der Zeilen klar.
Doku gibt's genug im Netz.
Also nicht verzagen sondern erst mal selbst sich die Funktionen erarbeiten und wenn dann noch was unklar ist fragen.
Mitglied: 77559
77559 07.08.2017 um 17:42:14 Uhr
Goto Top
Wenn der Random string egal ist, geht das alles doch viel einfacher:

$fileIn  = '.\DWH_DIM_ORGUNIT.csv'  
$fileOut = '.\DWH_DIM_ORGUNIT_new.csv'  

$colname = "NAME"  

Function RandomString {
    $chars = [char[]]"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"  
    Return ([string](($chars[0..25]|Get-Random)+(($chars|Get-Random -Count 9) -join "")))  
}

$Csv = Import-Csv $fileIn -Delimiter ";"  

ForEach ($Row in $Csv) {
    IF ($Csv.IndexOf($Row) -ge 3) {
        $Row."$colName" = RandomString  
    }
} 

$Csv | Export-Csv $fileOut -Delimiter ";" -NoType -Encoding UTF8  

Der RandomString stammt von Hier

Gruß
LotPings