freshman2017
Goto Top

Daten in CSV kumulieren

Guten Tag liebe Gemeinde,

ich brauche mal wieder euer Schwarmwissen bei Batch. Ich habe eine Ausgangsdatei:

10000000;ARTIKELA;1;3,9;4,64;INFOTEXT;
10000000;ARTIKELB;3;6,45;7,68;INFOTEXT;
10000000;ARTIKELA;1;0;0;INFOTEXT;
10000000;ARTIKELC;2;10,06;11,97;INFOTEXT;
10000000;ARTIKELC;2;10,06;11,97;INFOTEXT;
10000000;ARTIKELD;2;3,62;4,31;INFOTEXT;
10000000;ARTIKELA;1;3,28;3,9;INFOTEXT;

Aus dieser Datei sollen Spalten C, D, E kumuliert werden. wenn der Wert in Spalte B gleich ist;

10000000;ARTIKELA;3;7,18;8,54;INFOTEXT;
10000000;ARTIKELB;3;6,45;7,68;INFOTEXT;
10000000;ARTIKELC;4;20,12;23,94;INFOTEXT;
10000000;ARTIKELD;2;3,62;4,31;INFOTEXT;

Hat jemand von Euch ein Code-Schnippsel in der Tasche, den er teilen kann?

Content-ID: 4903648420

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

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

em-pie
em-pie 09.12.2022 aktualisiert um 11:39:03 Uhr
Goto Top
Moin,

machs mit der Powershell face-wink
Powershell: Gruppieren von Objekten mit mehreren Parametern

Vorher die CSV laden:
$myObject = Import-CSV -Path 'C:\test\content.csv' -Delimiter ';' -Encodeing UTF8 -  
Ab dann wie in meinem Post grundsätzlich weitermachen
freshman2017
freshman2017 09.12.2022 um 11:38:46 Uhr
Goto Top
Moin,

wie würde es denn mit der Batch aussehen?
freshman2017
freshman2017 09.12.2022 um 12:05:27 Uhr
Goto Top
Ich habe jetzt folgendes, was aber nicht so richtig funktionieren will;

@echo off
set "quelle=Z:\Dropbox\*.csv"  
powershell -EP Bypass -C "(Import-CSV '%quelle%' -Delimiter ';' -Header (1..6) | Group '2' | foreach{$_.Group.6 = ($_.Group.6 | foreach{[decimal]::Parse($_,[cultureinfo]'de')} | measure -Sum).Sum;$_.Group} | Convertto-CSV -Delimiter ';' -NoTypeInformation | select -skip 1) -replace '\"' ^| set-content '%quelle%'"  
PAUSE
freshman2017
freshman2017 09.12.2022 um 13:59:19 Uhr
Goto Top
Zitat von @em-pie:

Moin,

machs mit der Powershell face-wink
Powershell: Gruppieren von Objekten mit mehreren Parametern

Vorher die CSV laden:
$myObject = Import-CSV -Path 'C:\test\content.csv' -Delimiter ';' -Encodeing UTF8 -  
Ab dann wie in meinem Post grundsätzlich weitermachen

Habe es mal kopiert;

 $myObject = Import-CSV -Path 'C:\Users\Administrator\Desktop\test.csv' -Delimiter ';' -Encoding UTF8  
$myObject | 
        Group-Object -Property Adressnummer, Artikelnummer, Info| 
        Select-Object  @{Name='Adressnummer'; Expression={$_.Group.Adressnummer}},  
            @{Name='Artikelnummer'; Expression={$_.Group.Artikelnummer}},  
            @{Name='Info'; Expression={$_.Group.Info}},  
            @{Name='Menge'; Expression={($_.Group.Menge | Measure-Object -Sum).Sum }},  
            @{Name='PreisNetto'; Expression={($_.Group.PreisNetto | Measure-Object -Sum).Sum }},  
            @{Name='PreisBrutto'; Expression={($_.Group.PreisBrutto | Measure-Object -Sum).Sum }}   

Erhalte jetzt folgende Ausgabe;

 Adressnummer  : 10000000
Artikelnummer : ARTIKELA
Info          : INFOTEXT
Menge         : 3
PreisNetto    : 367
PreisBrutto   : 503

Adressnummer  : 10000000
Artikelnummer : ARTIKELB
Info          : INFOTEXT
Menge         : 3
PreisNetto    : 645
PreisBrutto   : 768

Adressnummer  : 10000000
Artikelnummer : ARTIKELC
Info          : INFOTEXT
Menge         : 4
PreisNetto    : 2012
PreisBrutto   : 2394

Adressnummer  : 10000000
Artikelnummer : ARTIKELD
Info          : INFOTEXT
Menge         : 2
PreisNetto    : 362
PreisBrutto   : 431 

Wie bekomme ich jetzt meine CSV so hin, wie gewünscht?

 
10000000;ARTIKELA;3;7,18;8,54;INFOTEXT;
10000000;ARTIKELB;3;6,45;7,68;INFOTEXT;
10000000;ARTIKELC;4;20,12;23,94;INFOTEXT;
10000000;ARTIKELD;2;3,62;4,31;INFOTEXT;
micneu
micneu 09.12.2022 um 14:16:36 Uhr
Goto Top
@freshman2017 frage: warum wolltest du es in batch und nicht in powershell lösen (ich persönlich habe bestimmt schon 10 jahre nichts mehr mit batch gemacht). powershell ist doch viel mächtiger und nach meinem empfinden nicht so kryptisch (bin fro das ich mit batch nichts mehr machen muss, wir machen die meisten sachen mit powershell wenn es um Windows geht)?
freshman2017
freshman2017 09.12.2022 um 14:20:13 Uhr
Goto Top
Powershell ist eine gute Alternative. Müsste nur den passenden Code haben...
4863114660
Lösung 4863114660 09.12.2022 um 14:20:54 Uhr
Goto Top
(@'  
Adressnummer;Artikelnummer;Menge;PreisNetto;PreisBrutto;Info
10000000;ARTIKELA;1;3,9;4,64;INFOTEXT
10000000;ARTIKELB;3;6,45;7,68;INFOTEXT
10000000;ARTIKELA;1;0;0;INFOTEXT
10000000;ARTIKELC;2;10,06;11,97;INFOTEXT
10000000;ARTIKELC;2;10,06;11,97;INFOTEXT
10000000;ARTIKELD;2;3,62;4,31;INFOTEXT
10000000;ARTIKELA;1;3,28;3,9;INFOTEXT
'@ | ConvertFrom-CSV -Delimiter ";" | group Adressnummer,Artikelnummer |   
    select `
        @{n='Adressnummer';e={$_.Group.Adressnummer}},  
        @{n='Artikelnummer';e={$_.Group.Artikelnummer}},  
        @{n='Menge';e={($_.Group.Menge | measure -Sum).Sum}},  
        @{n='PreisNetto';e={($_.Group.PreisNetto -replace ',','.' | measure -Sum).Sum}},  
        @{n='PreisBrutto';e={($_.Group.PreisBrutto -replace ',','.' | measure -Sum).Sum}},  
        @{n='Info';e={$_.Group.Info}} |   
    ConvertTo-CSV -Delimiter ";" -NoTypeInformation | select -Skip 1) -replace '"'  
freshman2017
freshman2017 09.12.2022 um 14:26:11 Uhr
Goto Top
Zitat von @4863114660:

(@'  
Adressnummer;Artikelnummer;Menge;PreisNetto;PreisBrutto;Info
10000000;ARTIKELA;1;3,9;4,64;INFOTEXT
10000000;ARTIKELB;3;6,45;7,68;INFOTEXT
10000000;ARTIKELA;1;0;0;INFOTEXT
10000000;ARTIKELC;2;10,06;11,97;INFOTEXT
10000000;ARTIKELC;2;10,06;11,97;INFOTEXT
10000000;ARTIKELD;2;3,62;4,31;INFOTEXT
10000000;ARTIKELA;1;3,28;3,9;INFOTEXT
'@ | ConvertFrom-CSV -Delimiter ";" | group Adressnummer,Artikelnummer |   
    select `
        @{n='Adressnummer';e={$_.Group.Adressnummer}},  
        @{n='Artikelnummer';e={$_.Group.Artikelnummer}},  
        @{n='Menge';e={($_.Group.Menge | measure -Sum).Sum}},  
        @{n='PreisNetto';e={($_.Group.PreisNetto -replace ',','.' | measure -Sum).Sum}},  
        @{n='PreisBrutto';e={($_.Group.PreisBrutto -replace ',','.' | measure -Sum).Sum}},  
        @{n='Info';e={$_.Group.Info}} |   
    ConvertTo-CSV -Delimiter ";" -NoTypeInformation | select -Skip 1) -replace '"'  

Wie würde ich hier die CSV Datei einbinden?
Kann ich als letztes Zeichen noch ein Semikolon hinzufügen?
4863114660
Lösung 4863114660 09.12.2022 aktualisiert um 17:14:09 Uhr
Goto Top
Wie würde ich hier die CSV Datei einbinden?
Au möhr siehst du doch oben schon ... Freitag mal wieder

CSV Datei Ausgangsformat wie du gepostet hast ohne Header
10000000;ARTIKELA;1;3,9;4,64;INFOTEXT;
10000000;ARTIKELB;3;6,45;7,68;INFOTEXT;
10000000;ARTIKELA;1;0;0;INFOTEXT;
10000000;ARTIKELC;2;10,06;11,97;INFOTEXT;
10000000;ARTIKELC;2;10,06;11,97;INFOTEXT;
10000000;ARTIKELD;2;3,62;4,31;INFOTEXT;
10000000;ARTIKELA;1;3,28;3,9;INFOTEXT;
Script:
$csv = 'C:\Users\Administrator\Desktop\test.csv'  
$csv_neu = 'C:\Users\Administrator\Desktop\test_neu.csv'  
((Import-CSV -Path $csv -Delimiter ';' -Encoding UTF8 -Header 'Adressnummer','Artikelnummer','Menge','PreisNetto','PreisBrutto','Info','Dummy') | group Adressnummer,Artikelnummer |   
    select `
        @{n='Adressnummer';e={$_.Group.Adressnummer}},  
        @{n='Artikelnummer';e={$_.Group.Artikelnummer}},  
        @{n='Menge';e={($_.Group.Menge | measure -Sum).Sum}},  
        @{n='PreisNetto';e={($_.Group.PreisNetto -replace ',','.' | measure -Sum).Sum}},  
        @{n='PreisBrutto';e={($_.Group.PreisBrutto -replace ',','.' | measure -Sum).Sum}},  
        @{n='Info';e={$_.Group.Info}},  
        Dummy | 
    ConvertTo-CSV -Delimiter ";" -NoTypeInformation | select -Skip 1) -replace '"' | set-content $csv_neu  
Ergebnis
10000000;ARTIKELA;3;7,18;8,54;INFOTEXT;
10000000;ARTIKELB;3;6,45;7,68;INFOTEXT;
10000000;ARTIKELC;4;20,12;23,94;INFOTEXT;
10000000;ARTIKELD;2;3,62;4,31;INFOTEXT;

Tschö.
em-pie
em-pie 09.12.2022 um 14:34:24 Uhr
Goto Top
Moin,

Wie würde ich hier die CSV Datei einbinden?
soll das Ergebnis wieder in eine CSV geschrieben werden?
micneu
micneu 09.12.2022 um 14:46:55 Uhr
Goto Top
Zitat von @freshman2017:

Powershell ist eine gute Alternative. Müsste nur den passenden Code haben...

das ist keine Antwort auf meine frage