teholbeddict
Goto Top

Dateinamen auslesen und in einer Schleife benutzen

Hallo Experten,

ich kämpfe derzeit mit folgender Aufgabenstellung, welche ich per Batchskript lösen möchte:
In einem Ordner sind 1 bis n csv-Dateien. Die erste Spalte der Dateiinhalte möchte ich absteigend sortieren und dann die ersten drei Zeilen in eine separate Datei schreiben.

Bei meinem Fall geht es um Messwerte in diesen Dateien und ich möchte immer nur die drei höchsten Messwerte aus einer Datei in eine zentrale Datei schreiben.

Teile der o.g. Aufgabe konnte ich schon lösen bzw. habe abgeschrieben face-smile , aber ich bekomme die Variable mit den Dateinamen nicht in eine Schleife eingebaut.

1. Teil Dateinamen auslesen
for /f "delims==" %%f in ('dir /b "Pfad\*.csv"') do set Dateiname=%%~nxf  
2. Teil Sortieren
sort /R Pfad\%Dateiname% /o Pfad\tmp.txt
3. Teil Erste Zeile auslesen (die Zeilennummer kann angepasst warden)
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "Pfad\tmp.txt"') do ((if "%%a"=="1" set line=%%b)  
echo.%line% > Messwerte.txt
Für einen Durchlauf funktioniert es, aber ich bekomme es nicht in einer Gesamtscheife mit mehreren Quelldateien hin. Für ein paar Tipps wäre ich sehr dankbar.

Viele Grüße
TB

Content-Key: 334144

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

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: 132895
Lösung 132895 05.04.2017, aktualisiert am 06.04.2017 um 17:53:28 Uhr
Goto Top
Hallo, geht viel effektiver mit etwas PS in deiner Batch:
@echo off
set "csvordner=D:\Daten"  
set "spaltenname=NameSpalte1"  
set "zieldatei=D:\result.csv"  
powershell -Executionpolicy Bypass -Command "dir '%csvordner%' -Filter *.csv | %%{Import-CSV $_.Fullname -Delimiter ';' | sort {[decimal]$_.'%spaltenname%'.trim()} -Descending | select -First 3} | export-csv '%zieldatei%' -Delimiter ';' -NoType -Encoding UTF8"  
hauruck
Mitglied: Apophis
Apophis 05.04.2017 um 13:09:35 Uhr
Goto Top
Hallo,

so spontan würde ich sagen, daß dir einfach nur ein Klammerpaar fehlt:

for /f "delims==" %%f in ('dir /b "Pfad\*.csv"') do (
set Dateiname=%%~nxf
sort /R Pfad\%Dateiname% /o Pfad\tmp.txt
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "Pfad\tmp.txt"') do (if "%%a"=="1" set line=%%b)
echo.%line% > Messwerte.txt
)

(Ungetestet)

Alles, was nach do in Klammern steht, wird als zur betreffenden Zeile gehörig betrachtet. So kann man nach do auch mehrere Befehle ausführen lassen. Die öffnende Klammer muss dabei in der gleichen Zeile wie der For-Befehl stehen.

Gruß
Apophis
Mitglied: TeholBeddict
TeholBeddict 06.04.2017 um 07:20:01 Uhr
Goto Top
Erst einmal vielen Dank für die schnellen Antworten!

@hauruck: Das Skript muss ich mir erst einmal etwas genauer anschauen und verstehen. Es funktioniert aber, nur erfolgt die Sortierung nicht numerisch. Wahrscheinlich muss noch ein entsprechender Parameter mitgegeben werden, da kann ich mich aber einlesen.

@Apophis: Das hatte ich auch schon ausprobiert, aber warum auch immer wird dann nicht der Dateiname an die Variable übergeben.

Vielen Dank noch einmal, ihr habt mir sehr geholfen.
Beste Grüße
TB
Mitglied: Apophis
Apophis 06.04.2017 um 08:13:09 Uhr
Goto Top
Hallo,

der Dateiname wird wahrscheinlich nicht übergeben, weil erst zur Laufzeit bekannt und nicht zum Zeitpunkt der Interpretation der Zeile. Dann probiere mal den Befehl

Setlocal EnableDelayedExpansion

vor der ersten FOR-Schleife. Der sorgt dafür, das jede Variable erst dann expandiert wird, wenn sie angesprochen wird.

Gruß
Apophis
Mitglied: TeholBeddict
TeholBeddict 06.04.2017 um 09:05:32 Uhr
Goto Top
Hatte ich auch schon ausprobiert, leider ohne Erfolg.

Ich habe zwar eine Lösung für mein Problem, aber warum es nicht mit dieser Variante funktioniert, würde mich schon interessieren.

Abgespeckte Testversion
@echo off
Setlocal EnableDelayedExpansion
for /f "delims==" %%f in ('dir /b "Pfad\*.csv"') do (  
set Dateiname=%%~nxf
echo %Dateiname%
Pause
)
endlocal
Mitglied: 132895
132895 06.04.2017 aktualisiert um 09:28:47 Uhr
Goto Top
Es funktioniert aber, nur erfolgt die Sortierung nicht numerisch.
Es weis ja niemand hier wie die Daten aussehen, habe es oben entsprechend ergänzt wenn es Zahlen im Format 99,99 sind.
Mitglied: TeholBeddict
TeholBeddict 06.04.2017 um 10:28:17 Uhr
Goto Top
Das war auch kein Vorwurf oder so von mir. Dein Skript ist super!
Mitglied: Apophis
Lösung Apophis 06.04.2017 aktualisiert um 11:28:51 Uhr
Goto Top
Böses Foul vom Batch-Prozessor. Eine Variable, die expandiert werden soll, muss in ! geklammert werden, nicht in %.

Das hier listet

@echo off 

Setlocal EnableDelayedExpansion 

for /f "delims==" %%f in ('dir /b "*.csv"') do (   
set Dateiname=%%f
echo Dateiname ist !Dateiname!
) 

Gruß
Apophis
Mitglied: TeholBeddict
TeholBeddict 06.04.2017 um 13:25:37 Uhr
Goto Top
Kaum macht man's richtig schon funktioniert es face-smile Ihr seid spitze, vielen Dank!
Mitglied: TeholBeddict
TeholBeddict 06.04.2017 um 14:53:31 Uhr
Goto Top
Natürlich ist noch ein Problem aufgetaucht: Die Messwerte in den csv-Dateien enthalten am Anfang Leerzeichen (das kommt leider so aus dem Quellsystem heraus) und das Skript bzw. die Importfunktion bricht anscheinend deshalb ab. Kann man diese Leerzeichen am Anfang der Messwerte über das Skript irgendwie eliminieren (z.B. mit TRIM)?

Viele Grüße
TB
Mitglied: Apophis
Apophis 06.04.2017 um 15:34:02 Uhr
Goto Top
Mitglied: 132895
132895 06.04.2017 um 17:53:48 Uhr
Goto Top
s. Anpassung oben.