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

Printed on: April 27, 2024 at 09:04 o'clock

Mitglied: 133883
133883 Jul 28, 2017 updated at 10:19:34 (UTC)
Goto Top
Member: mIsSteR
mIsSteR Jul 28, 2017 at 11:10:48 (UTC)
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 Jul 28, 2017 updated at 12:15:15 (UTC)
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 Aug 07, 2017 at 15:42:14 (UTC)
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