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-ID: 291602

Url: https://administrator.de/forum/csv-kleinerer-wert-batch-291602.html

Ausgedruckt am: 23.12.2024 um 12:12 Uhr

114757
114757 23.12.2015 aktualisiert um 19:05:42 Uhr
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
rubberman
rubberman 24.12.2015 um 12:53:13 Uhr
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
pieh-ejdsch
pieh-ejdsch 27.12.2015 um 15:32:37 Uhr
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