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)
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)
3 Antworten
- LÖSUNG 114757 schreibt am 23.12.2015 um 19:04:52 Uhr
- LÖSUNG rubberman schreibt am 24.12.2015 um 12:53:13 Uhr
- LÖSUNG pieh-ejdsch schreibt am 27.12.2015 um 15:32:37 Uhr
- LÖSUNG rubberman schreibt am 24.12.2015 um 12:53:13 Uhr
LÖSUNG 23.12.2015, aktualisiert um 19:05 Uhr
N'Abend,
kleines Powershell-Skript genügt
Gruß und frohes Fest.
jodel32
kleines Powershell-Skript genügt
$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[0]} | convertto-csv -Delimiter ";" -NoType | select -skip 1).replace('"','') | set-content $fileOUT
jodel32
LÖSUNG 24.12.2015 um 12:53 Uhr
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
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
LÖSUNG 27.12.2015 um 15:32 Uhr
moin jocheng,
in der Kommandozeile ein kurzer Einzeiler
hier als Batch
Gruß Phil
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