johnny-cgn
Goto Top

Powershell if -eq - or

Liebe Administratoren,

ich hänge gerade an einer simplen CSV-Auswertung via Powershell und scheinbar mache ich etwas falsch, finde aber den Fehler nicht...

Input:
"Artikelnummer";"Durchschn. EK Netto";"Kategorie Level 1";  
"1";"111,11";"Zahnpflege - Elektrische Zahnbürste";  
"2;"222,22";"Rasierer & Haarentferner - Epilierer";  
"3";"333,33";"Rasierer & Haarentferner - Epilierer";  
"4";"444,44";"PC-Games - Rollenspiele & Adventure";  

Skript:
$CSV_Import= "C:\Users\Administrator\Downloads\testdatei.csv"  
$CSV = import-csv $eSagu_CSV_Import -UseCulture -Encoding Default
 
$CSV = $CSV | select-object @{Name="SKU";Expression={$_.Artikelnummer}},@{Name="Kategorie";Expression={$_."Kategorie Level 1"}},@{Name="MIN_PRICE";Expression={1 * $_."Durchschn. EK Netto"}}  

#Kategorieaufschläge
$CSV = $CSV| select-object @{Name="SKU";Expression={$_.SKU}},@{Name="MIN_PRICE";Expression={if($_."Kategorie" -eq "Einbau-Backöfen - Standard, 60 cm hoch" -or "Einbau-Backöfen - Standard, 60 cm hoch" -or "Einbau-Backöfen - Kompakt, 45 cm hoch" -or "Einbau-Backöfen - Sets mit autarken Kochfeldern" -or "Einbau-Backöfen - Standard, 60 cm hoch" -or "Einbaugeschirrspüler - Integrierbare Geschirrspüler" -or "Einbaugeschirrspüler - Unterbaugeschirrspüler" -or "Einbaugeschirrspüler - Vollintegrierbare Geschirrspüler" -or "Einbaugeschirrspüler - Integrierbare Geschirrspüler" -or "Einbaugeschirrspüler - Unterbaugeschirrspüler" -or "Einbaugeschirrspüler - Integrierbare Geschirrspüler" -or "Einbaugeschirrspüler - Unterbaugeschirrspüler" -or "Einbaugeschirrspüler - Vollintegrierbare Geschirrspüler" -or "Einbaugeschirrspüler - vollintegrierbare Kompaktgeschirrspüler" -or "Einbaukühlgeräte - Einbaugefrierschränke" -or "Einbaukühlgeräte - Einbaukühlschränke" -or "Einbaukühlgeräte - Kühl- Gefrierkombinationen" -or "Einbaukühlgeräte - Einbaugefrierschränke" -or "Einbaukühlgeräte - Einbaukühlschränke" -or "Einbaukühlgeräte - Kühl- Gefrierkombinationen" -or "Einbaukühlgeräte - Einbaugefrierschränke" -or "Einbaukühlgeräte - Einbaukühlschränke" -or "Einbaukühlgeräte - Kühl- Gefrierkombinationen" -or "Einbau-Kochstellen - Domino-Kochstelle" -or "Flachbildschirme - 4K TV (Ultra HD)" -or "Flachbildschirme - Curved TV" -or "Flachbildschirme - LED-TV" -or "Freistehende Gefriergeräte - Gefrierschränke" -or "Freistehende Gefriergeräte - Gefrierschränke" -or "Freistehende Gefriergeräte - Gefrierschränke" -or "Freistehende Gefriergeräte - Gefriertruhe" -or "Freistehende Geschirrspüler - Kompaktgeschirrspüler" -or "Freistehende Geschirrspüler - Standgeschirrspüler" -or "Freistehende Geschirrspüler - Kompaktgeschirrspüler" -or "Freistehende Geschirrspüler - Standgeschirrspüler" -or "Freistehende Geschirrspüler - Kompaktgeschirrspüler" -or "Freistehende Geschirrspüler - Standgeschirrspüler" -or "Freistehende Kühlschränke - Standkühlschränke mit Gefrierfach" -or "Freistehende Kühlschränke - Standkühlschränke ohne Gefrierfach" -or "Freistehende Kühlschränke - Standkühlschränke mit Gefrierfach" -or "Freistehende Kühlschränke - Standkühlschränke ohne Gefrierfach" -or "Freistehende Kühlschränke - Standkühlschränke mit Gefrierfach" -or "Freistehende Kühlschränke - Standkühlschränke ohne Gefrierfach" -or "Kühlen & Gefrieren - Unterbaugefrierschränke" -or "Kühlen & Gefrieren - Unterbaukühlschränke" -or "Kühlen & Gefrieren - Unterbaugefrierschränke" -or "Kühlen & Gefrieren - Unterbaukühlschränke" -or "Kühl-Gefrier-Kombination - Gefrierteil oben" -or "Kühl-Gefrier-Kombination - Gefrierteil unten" -or "Kühlen & Gefrieren - Minikühlschränke" -or "Kühlen & Gefrieren - Unterbaugefrierschränke" -or "Kühlen & Gefrieren - Unterbaukühlschränke" -or "Kühl-Gefrier-Kombination - Gefrierteil oben" -or "Kühl-Gefrier-Kombination - Gefrierteil unten" -or "Side-by-Side Kühlschrank - Freistehende Kombinationen" -or "Side-by-Side Kühlschrank - Freistehende Kombinationen" -or "Side-by-Side Kühlschrank - Freistehende Kombinationen" -or "Standherde - Elektro-Standherde" -or "Standherde - Gas-Standherde" -or "Standherde - Holz-Öfen & Landhausöfen" -or "Standherde - Holz-Öfen & Landhausöfen" -or "Standherde - Holz-Öfen & Landhausöfen" -or "Waschen & Trocknen - Wäscheschleuder" -or "Waschmaschinen - Einbauwaschmaschinen" -or "Waschmaschinen - Frontlader" -or "Waschmaschinen - Kompakt Waschmaschinen" -or "Waschmaschinen - Toplader" -or "Waschtrockner - Einbauwaschtrockner" -or "Waschtrockner - Frontlader" -or "Waschtrockner - Toplader" -or "Wäschetrockner - Ablufttrockner" -or "Wäschetrockner - Kondenstrockner" -or "Wäschetrockner - Wärmepumpentrockner"){$_.MIN_PRICE * 1.345} if($_."Kategorie" -eq "Herdset - Elektro-Einbauherdsets" -or "Herdset - Gas-Kombi-Einbauherdsets" -or "Kühlen & Gefrieren - Minikühlschränke" -or "Kühl-Gefrier-Kombination - Gefrierteil oben" -or "Kühl-Gefrier-Kombination - Gefrierteil unten" -or "Kochplatte - Induktions-Doppelkochfeld" -or "Wäschetrockner - Wärmepumpentrockner" -or "Wäschetrockner - Wärmepumpentrockner" -or "Weinkühlschrank - Freistehende Weinkühlschränke" -or "Weinkühlschrank - Weinkühler") {$_.MIN_PRICE * 1.355} else {1.485*$_.MIN_PRICE}}}  

$CSV |export-csv "C:\Test21.csv" -UseCulture -notypeinformation -Encoding Default  



Output
"SKU";"MIN_PRICE"  
"1";"14944,295 15055,405"  
"2;222,22""";" "  
"3";"44832,885 45166,215"  
"4";"59777,18 60221,62"  

Warum, bekomme ich im Output 2 mal diesen Preis? und auch, wenn die if abfrage nicht zutrifft, sonder eigentlich das else greifen sollte?

Content-Key: 312732

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

Printed on: April 26, 2024 at 14:04 o'clock

Mitglied: 129813
Solution 129813 Aug 16, 2016 updated at 08:40:01 (UTC)
Goto Top
Hi.
To calculate with a field you first have to convert it to a number, you cannot calc with a variable of type string face-wink. If you multiply a string with a number the string is repeated (number) times, that's what you see here.

And some note to these enormous "or" constructs: It would be more efficient to store these values inside a separate array and then use the -in operator to compare if a field contains a value!

Regards
Member: Johnny-CGN
Johnny-CGN Aug 16, 2016 at 08:46:38 (UTC)
Goto Top
Thanks for the idea with the -in operator...
but as u might see, the values are calculated.. but twice... I wanted to change the type of the variable with just multiplying it with 1.
....@{Name="MIN_PRICE";Expression={1 * $_."Durchschn. EK Netto"}}  
Mitglied: 129813
Solution 129813 Aug 16, 2016 updated at 08:56:33 (UTC)
Goto Top
That does not work as I said, you cannot convert a string to a number by simply multiplying it with a number! Convert it by prefixing if with the type
[double]$yourvariable
Or use the convert function of the types like
[decimal]::Parse('10,2')  
Sometimes you must convert the comma into a point before.
Member: AM-SPW
AM-SPW Aug 17, 2016 at 13:21:13 (UTC)
Goto Top
Hey,

so wie ich das sehe geht die Abfrage immer in den IF Zweig.. liegt vermutlich daran weil du nach dem -or einen weiteren vollständigen Vergleich schreiben musst.
bsp:
cls
$hw = "hello World"  
if($hw -eq "hello World" -or $hw -eq "Hallo Welt"){  
    write-host "if"  
}else{
    write-host "else"  
}

in diesem vereinfachtem bsp geht das Script in den Else zweig, falls keine der Bedingungen zutrifft.
Mitglied: 129813
Solution 129813 Aug 17, 2016 updated at 13:29:09 (UTC)
Goto Top
. liegt vermutlich daran weil du nach dem -or einen weiteren vollständigen Vergleich schreiben musst.
Sure that is essential! The operator splits the single conditions, and every condition needs to fully qualified.
That's why i recommend an array for this task, its much easier to handle additions makes your code clean and shortens code.
Member: Johnny-CGN
Johnny-CGN Aug 22, 2016 at 10:27:18 (UTC)
Goto Top
Works now...
But there's still a little encoding-error....
The imported File Windows-1252, so any value to compare including a "ä,ö,ü" is not recognized, even by imprting with -encoding default (german system)
Mitglied: 129813
129813 Aug 22, 2016 updated at 10:32:11 (UTC)
Goto Top
This only happens if your file has wrong source encoding contents ...So recreate your files. Better you work with UTF-8 encoded files.

But this has nothing to do with the title of your original post!