kraemer
Goto Top

Powershell Verständnisproblem

Moin zusammen,

ich habe mir ein kleines Powershell-Script gebastelt, welches soweit einwandfrei funktioniert. Mein Problem ist, das ich an einem Punkt nicht weiß, warum dieser funktioniert, und an einem anderen meine, das es eine andere Lösung geben müsste. Vielleicht kann mir jemand meine Fragen erklären.

Das Script:
$path='C:\Temp\'  
$culture = new-object system.globalization.cultureinfo("de-DE")  

$csv=Get-Content -path $path'Export.csv' -Encoding String  
$csv=ConvertFrom-csv -InputObject $csv -Delimiter ";"  
$csv=$csv | Select-Object -Property 'Eins', 'Zwei', 'Drei' ,'Vier', 'Fünf', 'Summe', 'Gesamt'  
$csv | %{$_.Summe=($_.Vier.ToDecimal($culture)*$_.'Fünf'.ToDecimal($culture))}  
$csv = $csv | sort Summe -Descending
$csv.Gesamt='=summe(F:F)'  
$csv | Export-Csv  -Delimiter ";" -path $path'Neu.csv' -NoTypeInformation -Encoding Default  
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
cls
[System.Windows.Forms.MessageBox]::Show("Die Konvertierung wurde abgeschlossen","Fertig",0)  

Meine erste Frage:
Hier
$csv=$csv | Select-Object -Property 'Eins', 'Zwei', 'Drei' ,'Vier', 'Fünf', 'Summe', 'Gesamt'  
wird mittels csv$= der Variable csv das Ergebnis zugewiesen. Soweit so klar. Warum aber funktioniert das hier
$csv | %{$_.Summe=($_.Vier.ToDecimal($culture)*$_.'Fünf'.ToDecimal($culture))}  
anders? Hier pipe ich ja nur $csv an wie auch immer man das nennt (im Internet gefunden). Es gibt keine Zuweisung $csv= und trotzdem funktioniert das nur so. Warum ist das so?

Zweite Frage:
Die Quell-CSV liegt mir im Ansi-Format vor. Nun habe ich gelesen, das Import-CSV nur mit UTF-8 klar kommt. Deswegen dieses Konstrukt:
$csv=Get-Content -path $path'Export.csv' -Encoding String  
$csv=ConvertFrom-csv -InputObject $csv -Delimiter ";"  
Ich habe es versucht mit Import-CSV umzusetzen - dann passen tatsächlich die Umlaute nicht mehr. Da Export-CSV aber durchaus ANSI erstellen kann, gehe ich davon aus, dass das, was ich gelesen habe nicht stimmen kann, und ich in der Hilfe was überlesen habe. Gibt es also doch einen Weg eine ANSI-csv mittels Import-CSV zu öffnen?

Dritte Frage:
Ich bin nicht Firm in dem Thema. Wäre nett wenn mir der eine oder andere evtl. Verbesserungsvorschläge zum meinem Code machen könnte. Der Code funktioniert zwar - nur evtl. ziehe ich ja das Pferd von der falschen Seite auf, und weis es nur nicht.

Gruß Krämer

Content-Key: 308664

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

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

Mitglied: 129813
Solution 129813 Jul 01, 2016 updated at 09:27:13 (UTC)
Goto Top
Hi.
Zitat von @Kraemer:
Meine erste Frage:
Hier
$csv=$csv | Select-Object -Property 'Eins', 'Zwei', 'Drei' ,'Vier', 'Fünf', 'Summe', 'Gesamt'  
wird mittels csv$= der Variable csv das Ergebnis zugewiesen. Soweit so klar.
No, here only the selected properties(columns) from the CSV are again stored in the variable.
Warum aber funktioniert das hier
$csv | %{$_.Summe=($_.Vier.ToDecimal($culture)*$_.'Fünf'.ToDecimal($culture))}  
anders? Hier pipe ich ja nur $csv an wie auch immer man das nennt (im Internet gefunden). Es gibt keine Zuweisung $csv= und trotzdem funktioniert das nur so. Warum ist das so?
Because $csv is an array of objects and in the foreach loop you are changing the property for each object by assigning it a new value.
Zweite Frage:
Die Quell-CSV liegt mir im Ansi-Format vor. Nun habe ich gelesen, das Import-CSV nur mit UTF-8 klar kommt. Deswegen dieses Konstrukt:
$csv=Get-Content -path $path'Export.csv' -Encoding String  
> $csv=ConvertFrom-csv -InputObject $csv -Delimiter ";"  
Ich habe es versucht mit Import-CSV umzusetzen - dann passen tatsächlich die Umlaute nicht mehr. Da Export-CSV aber durchaus ANSI erstellen kann, gehe ich davon aus, dass das, was ich gelesen habe nicht stimmen kann, und ich in der Hilfe was überlesen habe. Gibt es also doch einen Weg eine ANSI-csv mittels Import-CSV zu öffnen?
Yes there is:
Import-CSV 'c:\temp\Export.csv' -Delimiter ";" -Encoding Default  
Default is ANSI encoding in Windows. This parameter is first available on powershell version 3.0 and greater.

$path='C:\temp'  
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null  
$culture = [cultureinfo]::GetCultureInfo('de-DE')  

$csv = Import-CSV "$path\Export.csv" -Delimiter ";" -Encoding Default  
$csv | %{$_.Summe = ($_.Vier.ToDecimal($culture) * $_.Fünf.ToDecimal($culture))}
$csv.Gesamt = '=summe(F:F)'  
$csv | sort Summe -Descending | Select 'Eins','Zwei','Drei','Vier','Fünf','Summe','Gesamt' | Export-Csv  -Delimiter ";" -path "$path\Neu.csv" -NoTypeInformation -Encoding Default  
cls
[System.Windows.Forms.MessageBox]::Show("Die Konvertierung wurde abgeschlossen","Fertig",0)  
Regards
Member: Kraemer
Kraemer Jul 01, 2016 at 12:48:13 (UTC)
Goto Top
$csv | %{$_.Summe=($_.Vier.ToDecimal($culture)*$_.'Fünf'.ToDecimal($culture))}  
Because $csv is an array of objects and in the foreach loop you are changing the property for each object by assigning it a new value.
[EN] Let me see if I have understood you correctly: In this case not a value is transfered but a pointer?
[DE] Wenn ich dich richtig verstanden habe, wird in diesem Fall kein Wert, sondern ein Pointer übergeben?

Krämer
Mitglied: 129813
129813 Jul 01, 2016 updated at 13:07:52 (UTC)
Goto Top
Nothing ist transfered.
$_ is the current object in the foreach pipeline whose properties you modify in the loop. So afterwards the all the custom objects are modified.
Member: Kraemer
Kraemer Jul 01, 2016 at 13:07:53 (UTC)
Goto Top
Tanks a lot