svenyo
Goto Top

Bestimmte Spalte einer CSV-Datei bearbeiten und in neuer CSV-Datei speichern

Hallo zusammen,

In einer CSV-Datei sind Artikelnummern und Lagerbestände gespeichert. Die Datei hat folgenden Aufbau:

Artikelnummer; Lagerbestand;
123456-0001;10000
123457-0001;5

Nun soll diese CSV-Datei automatisiert bearbeitet werden, sodass die neue Datei den gleichen Aufbau hat, aber dass lediglich der Lagerbestand nur 10% des vorherigen Lagerbestands beträgt.
Eventuelle Dezimalzahlen sollen dabei stets auf die nächste volle Zahl aufgerundet werden. Mein Ansatz ist folgender:


$IMPORT = Import-Csv "C:\Users\Benutzer\desktop\testcsv.csv" -Delimiter ";"
ForEach-Object
{
[math]::Ceiling(0.1 * ($CsvObject.'Lagerbestand')).replace(',','.')
}
Export-CSV -path "C:\Users\Benutzer\desktop\testcsv2.csv" -Delimiter ";" -InputObject "$IMPORT"

Leider funktioniert das nicht. Kann mir jemand weiterhelfen?

Content-Key: 568112

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

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

Member: erikro
erikro Apr 29, 2020 at 06:28:36 (UTC)
Goto Top
Moin,

erstmal: Bitte mache um Deinen Quellcode < code> und </ code> (ohne Leerzeichen).

 $IMPORT = Import-Csv "C:\Users\Benutzer\desktop\testcsv.csv" -Delimiter ";"  
 ForEach($csvObject in $IMPORT) {
     $csvObject.Lagerbstand =  [math]::Ceiling(0.1 * ($CsvObject.'Lagerbestand')).replace(',','.')  
 }
 Export-CSV -path "C:\Users\Benutzer\desktop\testcsv2.csv" -Delimiter ";" -InputObject "$IMPORT"  
 

Leider funktioniert das nicht. Kann mir jemand weiterhelfen?

So sollte es gehen. Ich habe es nicht getestet. Zur Erläuterung:

Du importierst nach $IMPORT das CSV und benutzt es dann in der ForEach-Schleife nicht. Entweder pipest Du gleich Import-CSV auf foreach-object oder Du speicherst das in einem Array und verarbeitest dieses in einer ForEach-Schleife.

Außerdem musst Du auch noch angeben, dass das Ergebnis Deiner Berechnung auch wieder in der entsprechenden Eigenschaft des Objekts gespeichert wird.

hth

Erik
Member: svenyo
svenyo Apr 29, 2020 at 06:39:25 (UTC)
Goto Top
Hallo Erik,

Erstmal Dankeschön.
Könntest du mir zeigen wie der Code dann aussehen muss? Bin noch Anfänger was Powershell angeht.

Grüße
Sven
Member: erikro
erikro Apr 29, 2020 at 06:57:55 (UTC)
Goto Top
Steht doch da. face-wink Der Code, den ich korrigiert habe, sollte gehen. Wobei ich nicht getestet habe, ob das mit math klappt.
Member: svenyo
svenyo Apr 29, 2020 at 08:46:25 (UTC)
Goto Top
Leider bekomme ich folgende Fehlermeldung:

Fehler beim Aufrufen der Methode, da [System.Double] keine Methode mit dem Namen "replace" enthält.  
In Zeile:3 Zeichen:6
+      $csvObject.Lagerbstand =  [math]::Ceiling(0.1 * ($CsvObject.'Lag ...  
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Fehler beim Aufrufen der Methode, da [System.Double] keine Methode mit dem Namen "replace" enthält.  
In Zeile:3 Zeichen:6
+      $csvObject.Lagerbstand =  [math]::Ceiling(0.1 * ($CsvObject.'Lag ...  
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
Member: Kraemer
Kraemer Apr 29, 2020 at 09:04:16 (UTC)
Goto Top
>  $IMPORT = Import-Csv "C:\Users\Benutzer\desktop\testcsv.csv" -Delimiter ";"  
>  ForEach($csvObject in $IMPORT) {
>      $csvObject.Lagerbstand =   [math]::Ceiling(([Double]$CsvObject.'Lagerbestand')/10)  
>  }
>  Export-CSV -path "C:\Users\Benutzer\desktop\testcsv2.csv" -Delimiter ";" -InputObject "$IMPORT"  
>  
Member: svenyo
svenyo Apr 29, 2020 at 09:41:09 (UTC)
Goto Top
Danke für die Hilfe. Der obige Code läuft ohne Fehler durch. Aber leider erhalte ich eine CSV-Datei mit dem folgenden Inhalt:

#TYPE System.String
"Length"
"1"
Mitglied: 143728
Solution 143728 Apr 29, 2020 updated at 10:28:03 (UTC)
Goto Top
Import-CSV "C:\Users\Benutzer\desktop\testcsv.csv" -delimiter ";" | %{  
    $_.Lagerbestand = [math]::Ceiling([decimal]$_.Lagerbestand / 10)
    $_
} | export-csv "C:\Users\Benutzer\desktop\testcsv_out.csv" -Delimiter ";" -NoType -Encoding UTF8  
Feddich, Affe dod ....
https://tio.run/##XY5LSwNBEITP6V/RBCV6mDgbTdQsQiQ@EMSLMZcQwrrbJoPzWGY7ao ...
Member: svenyo
svenyo May 05, 2020 updated at 19:20:10 (UTC)
Goto Top
Hat super geklappt. Vielen Dank. Jetzt habe ich aber noch ein zweites Problem. In einer CSV-Datei sind 11 Spalten, wie folgt:

Artikelnummer;Bild1;Bild2;Bild3;[.......];Bild10
12345-0001;12345-0001-1.jpg;12345-0001-2.jpg;12345-0001-3.jpg;[.....];12345-0001-10.jpg
12345-0002;12345-0002-1.jpg;12345-0002-2.jpg;12345-0002-3.jpg;[.....];12345-0002-10.jpg

Nun soll in jedem Feld entweder -0001- oder -0002- durch einen Unterstrich _ ersetzt werden.
Folgender Code funktioniert schon super:

$sourceFile = 'C:\Ordner\Unterordner\pictures\*.csv'  
$destinationFile = 'C:\Ordner\Unterordner\pictures\Bilder1neu.csv'  

(Get-Content $sourceFile) | ForEach-Object {
    $_.replace('-0002-', '_').replace('-0001-', '_')  
} | Set-Content $destinationFile

Und als Ergebnis erhalte ich wie gewollt:

Artikelnummer;Bild1;Bild2;Bild3;[.......];Bild10
12345-0001;12345_1.jpg;12345_2.jpg;12345_3.jpg;[.....];12345_10.jpg
12345-0002;12345_1.jpg;12345_2.jpg;12345_3.jpg;[.....];12345_10.jpg

Als Nächstes benötige ich aber noch eine zusätzliche Spalte Bild0, welche als Wert jeweils den Inhalt von Bild1 ABER ohne _1 enthält. Die fertige Datei sollte so aussehen:

Artikelnummer;Bild1;Bild2;Bild3;[.......];Bild10;Bild0
12345-0001;12345_1.jpg;12345_2.jpg;12345_3.jpg;[.....];12345_10.jpg;12345.jpg
12345-0002;12345_1.jpg;12345_2.jpg;12345_3.jpg;[.....];12345_10.jpg;12345.jpg

Ich habe es mit folgendem Code versucht, aber das klappt nicht:

$sourceFile = 'C:\Ordner\Unterordner\pictures\*.csv'  
$destinationFile = 'C:\Ordner\Unterordner\pictures\Bilder1neu.csv'  

(Get-Content $sourceFile) | ForEach-Object {
    $_.replace('-0002-', '_').replace('-0001-', '_')  
} | Set-Content $destinationFile

$csv = Import-CSV 'C:\Ordner\Unterordner\pictures\Bilder1neu.csv' -delimiter ';'  
$csv | add-member -MemberType NoteProperty -Name 'Bild' -Value $_.Bild1.replace('_1.jpg','.jpg') -Force  
$csv | Export-CSV 'C:\Ordner\Unterordner\pictures\Bilder1neu.csv' -NoType -delimiter ';' -Encoding Default  

Kann mir jemand helfen?
Mitglied: 143728
143728 May 05, 2020 updated at 19:54:21 (UTC)
Goto Top
(Import-CSV 'C:\Ordner\Unterordner\pictures\Bilder1neu.csv' -delimiter ';') | select *,@{n='Bild0';e={$_.Bild1 -replace '_\d+(?=\.jpg$)',''}} | Export-CSV 'C:\Ordner\Unterordner\pictures\Bilder1neu.csv' -NoType -delimiter ';' -Encoding Default  
Member: svenyo
svenyo May 05, 2020 updated at 20:06:31 (UTC)
Goto Top
Hallo, danke fpr die Antwort. Hat leider nocht nicht geklappt.

Habe jetzt folgenden Code:

$sourceFile = 'C:\Ordner\Unterordner\pictures\*.csv'  
$destinationFile = 'C:\Ordner\Unterordner\pictures\Bilder1neu.csv'  

(Get-Content $sourceFile) | ForEach-Object {
    $_.replace('-0002-', '_').replace('-0001-', '_')  
} | Set-Content $destinationFile


(Import-CSV $destinationFile -delimiter ';') | select *,@{n='Bild0';e={$_.Bild1 -replace '_\d+(?=\.jpg$)',''}} | Export-CSV $destinationFile -NoType -delimiter ';' -Encoding Default  

Aber leider erhalte ich diese Fehlermeldung:

Import-Csv : Das Argument kann nicht verarbeitet werden, da der Wert des Arguments "name" ungültig ist. Ändern Sie den Wert des Arguments "name", und führen Sie  
 den Vorgang erneut aus.
Bei Zeile:9 Zeichen:12
+ (Import-CSV <<<<  $destinationFile -delimiter ';') | select *,@{n='Bild0';e={$_.Bild1 -replace '_\d+(?=\.jpg$)',''}} | Export-CSV $destinationFile -NoType -de  
limiter ';' -Encoding Default  
    + CategoryInfo          : InvalidArgument: (:) [Import-Csv], PSArgumentException
    + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.ImportCsvCommand


Was ist denn falsch?
Mitglied: 143728
143728 May 05, 2020 updated at 20:50:22 (UTC)
Goto Top
Member: svenyo
svenyo May 05, 2020 at 20:51:23 (UTC)
Goto Top
Das verstehe ich nicht. Der Inhalt:

"Artikelnummer";"Bild 1";"Bild 2";"Bild 3";"Bild 4";"Bild 5";"Bild 6";"Bild 7";"Bild 8";"Bild 9";"Bild 10";  
"S6393130001-0002";"S6393130001_1.jpg";"S6393130001_2.jpg";"S6393130001_3.jpg";;;;;;;;  
"S6393130002-0002";"S6393130002_1.jpg";"S6393130002_2.jpg";"S6393130002_3.jpg";"S6393130002_4.jpg";"S6393130002_5.jpg";;;;;;  
"S6393130003-0002";"S6393130003_1.jpg";"S6393130003_2.jpg";"S6393130003_3.jpg";"S6393130003_4.jpg";"S6393130003_5.jpg";"S6393130003_6.jpg";;;;;  
"S6393130004-0002";"S6393130004_1.jpg";"S6393130004_2.jpg";"S6393130004_3.jpg";"S6393130004_4.jpg";"S6393130004_5.jpg";;;;;;  
"S6393130005-0002";"S6393130005_1.jpg";"S6393130005_2.jpg";"S6393130005_3.jpg";"S6393130005_4.jpg";"S6393130005_5.jpg";"S6393130005_6.jpg";;;;;  
"S6393130006-0002";"S6393130006_1.jpg";"S6393130006_2.jpg";"S6393130006_3.jpg";;;;;;;;  
"S6393130009-0002";"S6393130009_1.jpg";"S6393130009_2.jpg";"S6393130009_3.jpg";;;;;;;;  
"S6393130010-0002";"S6393130010_1.jpg";"S6393130010_2.jpg";"S6393130010_3.jpg";"S6393130010_4.jpg";;;;;;;  
"S6393130011-0002";"S6393130011_1.jpg";"S6393130011_2.jpg";"S6393130011_3.jpg";;;;;;;;  
"S6373130008-0002";"S6373130008_1.jpg";"S6373130008_2.jpg";"S6373130008_3.jpg";"S6373130008_4.jpg";;;;;;;  
"S6373130014-0002";"S6373130014_1.jpg";"S6373130014_2.jpg";"S6373130014_3.jpg";"S6373130014_4.jpg";;;;;;;  
"S6373130015-0002";"S6373130015_1.jpg";"S6373130015_2.jpg";"S6373130015_3.jpg";"S6373130015_4.jpg";"S6373130015_5.jpg";;;;;;  
"S6373130016-0002";"S6373130016_1.jpg";"S6373130016_2.jpg";"S6373130016_3.jpg";"S6373130016_4.jpg";"S6373130016_5.jpg";"S6373130016_6.jpg";;;;;  
"S6373130017-0002";"S6373130017_1.jpg";"S6373130017_2.jpg";"S6373130017_3.jpg";"S6373130017_4.jpg";;;;;;;  
"S6373130018-0002";"S6373130018_1.jpg";"S6373130018_2.jpg";"S6373130018_3.jpg";"S6373130018_4.jpg";;;;;;;  
"S6393130012-0002";"S6393130012_1.jpg";"S6393130012_2.jpg";"S6393130012_3.jpg";;;;;;;;  
"S6393130013-0002";"S6393130013_1.jpg";"S6393130013_2.jpg";"S6393130013_3.jpg";;;;;;;;  
"S6393130014-0002";"S6393130014_1.jpg";"S6393130014_2.jpg";"S6393130014_3.jpg";;;;;;;;  
"S6393130017-0002";"S6393130017_1.jpg";"S6393130017_2.jpg";"S6393130017_3.jpg";;;;;;;;  
"S6393130018-0002";"S6393130018_1.jpg";"S6393130018_2.jpg";"S6393130018_3.jpg";"S6393130018_4.jpg";"S6393130018_5.jpg";"S6393130018_6.jpg";;;;;  
"S6393130019-0002";"S6393130019_1.jpg";"S6393130019_2.jpg";"S6393130019_3.jpg";"S6393130019_4.jpg";;;;;;;  
"S6393130020-0002";"S6393130020_1.jpg";"S6393130020_2.jpg";"S6393130020_3.jpg";;;;;;;;  
"S6393130021-0002";"S6393130021_1.jpg";"S6393130021_2.jpg";"S6393130021_3.jpg";"S6393130021_4.jpg";;;;;;;  
"S6393130022-0002";"S6393130022_1.jpg";"S6393130022_2.jpg";"S6393130022_3.jpg";"S6393130022_4.jpg";;;;;;;  
"S6393130023-0002";"S6393130023_1.jpg";"S6393130023_2.jpg";"S6393130023_3.jpg";"S6393130023_4.jpg";;;;;;;  
"S6393130024-0002";"S6393130024_1.jpg";"S6393130024_2.jpg";"S6393130024_3.jpg";;;;;;;;  
"S6393130025-0002";"S6393130025_1.jpg";"S6393130025_2.jpg";"S6393130025_3.jpg";"S6393130025_4.jpg";"S6393130025_5.jpg";;;;;;  
"S6393130026-0002";"S6393130026_1.jpg";"S6393130026_2.jpg";"S6393130026_3.jpg";;;;;;;;  
"S6313130001-0002";"S6313130001_1.jpg";;;;;;;;;;  
"S6313130002-0002";"S6313130002_1.jpg";;;;;;;;;;  
"S6313130010-0002";"S6313130010_1.jpg";;;;;;;;;;  
"S6293120001-0002";"S6293120001_1.jpg";"S6293120001_2.jpg";"S6293120001_3.jpg";"S6293120001_4.jpg";;;;;;;  
"S6293130001-0002";"S6293130001_1.jpg";"S6293130001_2.jpg";"S6293130001_3.jpg";;;;;;;;  
"S6293130002-0002";"S6293130002_1.jpg";;;;;;;;;;  
"S6293130003-0002";"S6293130003_1.jpg";"S6293130003_2.jpg";"S6293130003_3.jpg";"S6293130003_4.jpg";"S6293130003_5.jpg";"S6293130003_6.jpg";;;;;  
"S6293130006-0002";"S6293130006_1.jpg";"S6293130006_2.jpg";"S6293130006_3.jpg";"S6293130006_4.jpg";;;;;;;  
"S6293130008-0002";"S6293130008_1.jpg";"S6293130008_2.jpg";"S6293130008_3.jpg";"S6293130008_4.jpg";;;;;;;  
"S6293130009-0002";"S6293130009_1.jpg";"S6293130009_2.jpg";"S6293130009_3.jpg";;;;;;;;  
"S6293130010-0002";"S6293130010_1.jpg";"S6293130010_2.jpg";"S6293130010_3.jpg";"S6293130010_4.jpg";"S6293130010_5.jpg";"S6293130010_6.jpg";;;;;  
"S6293130011-0002";"S6293130011_1.jpg";"S6293130011_2.jpg";"S6293130011_3.jpg";"S6293130011_4.jpg";;;;;;;  
"S6293130012-0002";"S6293130012_1.jpg";"S6293130012_2.jpg";"S6293130012_3.jpg";"S6293130012_4.jpg";"S6293130012_5.jpg";"S6293130012_6.jpg";;;;;  
"S6263140005-0002";"S6263140005_1.jpg";;;;;;;;;;  
"08ALEMOH000001-0002";"08ALEMOH000001_1.jpg";"08ALEMOH000001_2.jpg";"08ALEMOH000001_3.jpg";"08ALEMOH000001_4.jpg";"08ALEMOH000001_5.jpg";"08ALEMOH000001_6.jpg";;;;;  
"08ALEMOH000002-0002";"08ALEMOH000002_1.jpg";"08ALEMOH000002_2.jpg";"08ALEMOH000002_3.jpg";"08ALEMOH000002_4.jpg";"08ALEMOH000002_5.jpg";"08ALEMOH000002_6.jpg";;;;;  
"S6393130027-0002";"S6393130027_1.jpg";"S6393130027_2.jpg";"S6393130027_3.jpg";"S6393130027_4.jpg";"S6393130027_5.jpg";;;;;;  
"S6393130028-0002";"S6393130028_1.jpg";"S6393130028_2.jpg";"S6393130028_3.jpg";"S6393130028_4.jpg";"S6393130028_5.jpg";"S6393130028_6.jpg";;;;;  
"S6313130012-0002";"S6313130012_1.jpg";"S6313130012_2.jpg";"S6313130012_3.jpg";"S6313130012_4.jpg";"S6313130012_5.jpg";;;;;;  
Mitglied: 143728
Solution 143728 May 05, 2020 at 20:52:58 (UTC)
Goto Top
Ja Jung deine Spalte heißt ja nicht "Bild1" sondern "Bild 1" !
Mitglied: 143728
Solution 143728 May 05, 2020 updated at 20:59:03 (UTC)
Goto Top
Einfach mal den Kopp benutzen statt immer nur zu schreien " jeht ned " logisch jeht dat wenn man denn der Brill aufsetz und de rischtije Spalten-Namen benutz.

https://tio.run/##fVjbattAEH33VwgTUNrGQXN2VxdMaNI20EIvDyl9CoRgK6lb@YLj9E ...
Member: svenyo
svenyo May 05, 2020 at 20:58:47 (UTC)
Goto Top
Jetzt klappt's hervorragend. face-big-smile

Ich schieb's jetzt einfach mal auf die Uhrzeit

Herzlichen Dank und schönen Abend
Member: svenyo
svenyo May 05, 2020 at 21:09:09 (UTC)
Goto Top
Zu früh gefreut. Es funktioniert doch noch nicht.
Die CSV-Datei hat als Texttrenner Quotes " " und die stören.
gibt es so eine Art -Delimiter auch für den Texttrenner?
Member: svenyo
svenyo May 05, 2020 at 21:27:38 (UTC)
Goto Top
Ist es möglich das ganze auch mit GetContent zu machen?
Falls ja, wie?
Mitglied: 143728
143728 May 06, 2020 updated at 06:12:59 (UTC)
Goto Top
Zitat von @svenyo:

Zu früh gefreut. Es funktioniert doch noch nicht.
Die CSV-Datei hat als Texttrenner Quotes " " und die stören.
Du mit deinem "funktioniert nicht", kanns nicht mehr hören ..., es geht alles wenn man nur will und mal bereit ist etwas zu lernen...
Dafür gibt es ConvertTo-Csv und -replace, guckst du ...
https://tio.run/##fVhda9tAEHzPrxAmoKSNg3buTh@Y0KSh0EI/HhL6FAjFUVO3cmxsNa ...

So jetzt bin ich raus, das Handwerkszeug hast du nun, der Rest ist Fleiß und Übung!
Member: lithov
lithov Jul 07, 2022 at 11:10:55 (UTC)
Goto Top
Import-CSV "C:\Users\Benutzer\desktop\testcsv.csv" -delimiter ";" | %{  
    $_.Lagerbestand = [math]::Ceiling([decimal]$_.Lagerbestand / 10)
    $_
} | export-csv "C:\Users\Benutzer\desktop\testcsv_out.csv" -Delimiter ";" -NoType -Encoding UTF8  

ich bin über diesen Code gestolpert und kann ihn leider nicht coden...
Die Ausgangslage ist identisch
meine Lagebestand soll nur umgewandelt werden in 3 Werte (wie eine Lagerampel also in dieser Zeile
$_.Lagerbestand = [math]::Ceiling([decimal]$_.Lagerbestand / 10)
müssten die Werte der Spalte geändert werden in Wert>XX =10, Wert<XX =5 und Wert =0 oder minus =0
Kann mir jemand sagen wie diese Zeile dann aussehen müsste?
Danke!