jocheng
Goto Top

CSV kleinerer Wert (Batch)

Ich habe eine CSV Datei mit folgendem Inhalt:

29664;24,95
29664;12,95
29645;9,95
29645;9,95
29655;12,95
29655;24,95
29664;24,95
29655,12,95
29655,24,95
29664;12,95
29664;24,95
29664;24,95
29664;24,95

Jetzt brauche ich eine .batch die daraus macht:

29664;12,95
29645;9,95
29655;12,95

Also jeder Wert der 1.Spalte (1x) mit dem dazugehörigen kleinsten Wert der 2. Spalte. Kann mir jemand das Weihnachstgeschenk ;) machen und helfen? (Datei ist ca 15.000 Zeilen)

Content-Key: 291602

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

Printed on: April 18, 2024 at 18:04 o'clock

Mitglied: 114757
114757 Dec 23, 2015 updated at 18:05:42 (UTC)
Goto Top
N'Abend,
kleines Powershell-Skript genügt face-wink
$fileIN = 'C:\datei.csv'  
$fileOUT = 'C:\datei_out.csv'  
$csv = Import-csv $fileIN -Delimiter ";" -Header 1,2   
$csv | %{$_.2 = [convert]::ToDouble($_.2)}
($csv | sort "2" | group "1" | %{$_.Group} | convertto-csv -Delimiter ";" -NoType | select -skip 1).replace('"','') | set-content $fileOUT  
Gruß und frohes Fest.
jodel32
Member: rubberman
rubberman Dec 24, 2015 at 11:53:13 (UTC)
Goto Top
Hallo jocheng,

da Batch keine Fließkommazahlen kennt und somit auch nicht numerisch vergleichen kann, ist Batch für dein Vorhaben ungeeignet. Nutze ein Sprache, die die entsprechenden Typen unterstützt. Sinnvollerweise eine, die auch die Verarbeitung von CSV Daten unterstützt, wie die von jodel32 vorgeschlagene PowerShell.

Grüße
rubberman
Member: pieh-ejdsch
pieh-ejdsch Dec 27, 2015 at 14:32:37 (UTC)
Goto Top
moin jocheng,

in der Kommandozeile ein kurzer Einzeiler
hier als Batch
setlocal
set  "Infile=D:\A_test\CSVorg.csv"  
set "Outfile=D:\A_test\CSV-neu.csv"  
set     "Tok=;"  

 rem lege Ausgabedatei vorher an
4>"%outfile%" call :sort  
exit /b

:sort 2nd token leq
for /f "usebackdelims=%tok%" %%a in ("%Infile%") do (  
  <"%outfile%" find "%%a%tok%" >nul 2>nul ||(  
  for /f %%c in (' ^<"%infile%" find /c "%%a%tok%" ') do (  
    cd& <"%infile%" find "%%a" |sort /r )|more +%%c |find "%tok%" >&4  
) )
exit /b

:cmdline
for %F in ("csvorg.csv") do for /f "usebackqtokens=1,2delims=;" %a in (%F) do <"%~nF-neu%~xF" find "%a;" >nul 2>&1 ||for /f %c in ('^<%F find /c "%a;"') do (echo(A& <%F find "%a") |sort /r |more +%c |find  ";" >>"%~nF-neu%~xF"  

Gruß Phil