johnny-cgn
Goto Top

Powershell CSV Auswertung in einer Schleife

Liebe Administratoren,

mein Powershell-Erfahrungsschatz wächst stetig aber langsam.
Ich stehe seit einigen Tagen auf dem Schlauch.
Mir liegt eine CSV eines Lieferanten vor, in welcher Artikel entweder nur eine Hauptartikelnummer haben oder auch eine SubArtikelnummer..
Es soll nun in eine neue Datei nur eine Artikelnummer ausgegeben werden. Wenn eine SubArtNr vorhanden ist, ebenjene sonst nur die Hauptartikelnummer.
Jedoch hänge ich nun am folgenden ...

$Csv_H1_Import = Import-Csv C:\Foo\items_full.csv -UseCulture
$Csv_H1_Import_HerstArtNr = @()

$Csv_H1_Import_HerstArtNrSelect = $Csv_H1_import | select-object product_number, subproduct_number)
$Csv_H1_Import_HerstArtNrSelect | foreach-object {if ($_.subproduct_number) {$Csv_H1_Import_HerstArtNr = $_.subproduct_number} else {$Csv_H1_Import_HerstArtNr = $_.subproduct_number}}
$Csv_H1_Import_HerstArtNr | export-csv c:\foo\artnr.csv -UseCulture -notypeinformation
Invoke-Expression C:\Foo\items_ArtNr.csv

Meine Ausgabe ist bei allen gestarteten Versuchen leer... Kann mir jemand den Fehler aufzeigen?

Content-ID: 304700

Url: https://administrator.de/forum/powershell-csv-auswertung-in-einer-schleife-304700.html

Ausgedruckt am: 23.12.2024 um 18:12 Uhr

colinardo
Lösung colinardo 17.05.2016 aktualisiert um 13:45:36 Uhr
Goto Top
Hallo Johnny-CGN,
erst mal grundsätzlich, welches Trennzeichen besitzt deine CSV? -UseCulture benutzt ja ein Semikolon wenn das OS auf deutsch eingestellt ist und ein Komma wenn auf Englisch. Passt also das Trennzeichen deiner CSV auf das der Spracheinstellung deines OS?

Ich würde das stattdessen besser so mit einer "Calculated Property" machen:
$Csv_H1_Import = Import-Csv 'C:\Foo\items_full.csv' -UseCulture  
$Csv_H1_import | select @{n='ArtNr';e={if($_.subproduct_number -ne ""){$_.subproduct_number}else{$_.product_number}}} | Export-Csv 'C:\Foo\items_ArtNr.csv' -UseCulture -notypeinformation -Encoding UTF8  

Jetzt zu deinem Code:

In deinem Code sind mehrere Fehler. Erstens fügst du dem Array dein Nummern nicht hinzu sondern weißt dem Array immer nur einen neuen Wert zu anstatt anzufügen
$Csv_H1_Import_HerstArtNr = $_.subproduct_number
Hier würde man mit += als Operator arbeiten.
Und zweitens ist der IF-Vergleicj
if ($_.subproduct_number)
unsicher hier sollte man besser auf einen leeren String prüfen. -ne ""

Und was soll das
Invoke-Expression C:\Foo\items_ArtNr.csv
bewirken ... den Aufruf der CSV-Datei? Das ist unüblich und macht man besser mit start-process

Grüße Uwe
Johnny-CGN
Johnny-CGN 17.05.2016 um 14:01:34 Uhr
Goto Top
Hallo Uwe,

lieben Dank für die schnelle Hilfe und die Anmerkungen.
Semikolon als Trenner war via UseCulture schon gewollt.

Invoke-Expression hatte schlicht den zwecke, dass ich den Output direkt parallel im Texteditor angezeigt bekomme.

Grundsätzliche Frage noch zum Output...
Besteht unter Powershell die Chance, in "Windows ANSI" zu exportieren?
Das System in welches die Daten danach sollen, kann nur mit der Codierung umgehen, wegen der Umlaute.
colinardo
Lösung colinardo 17.05.2016 aktualisiert um 14:35:46 Uhr
Goto Top
Zitat von @Johnny-CGN:
Grundsätzliche Frage noch zum Output...
Besteht unter Powershell die Chance, in "Windows ANSI" zu exportieren?
Kannst du mit -Encoding Default (min. PS 3.0) beim Export erreichen Default ist ja ANSI 1252 in Windows.