Per Batch Zeile Nr. xy einer txt-Datei auslesen
Hallo,
ihr seid mal wieder meine letzte Hoffnung. Vorabinfo: An den Umständen zu folgendem Problem (Dateitypen, Ablauf etc.) kann ich nichts ändern.
Ich habe unter WinXP eine txt-Datei mit gut 40000 Zeilen, in jeder Zeile steht ein Wort. Und ich habe ein Programm, das bei einem Ereignis eine Batch in Gang setzt und ihr einen Zahlenwert übergibt. Der Zahlenwert ist praktischerweise die Nummer der Zeile, in der in der txt-Datei das gesuchte Wort steht, und über diese Zuordnung soll das Wort der Batch übergeben werden. Folgendes habe ich schon probiert:
Mit FOR /F "skip=xy... zur entsprechenden Zeile springen, ab da alles in eine temporäre txt-Datei schreiben und aus dieser wiederum nur die erste Zeile einlesen.
Bei 40000 Zeilen ist das aber in meinem Fall nicht praktikabel. Deshalb meine Frage:
Gibt es eine einfachere Möglichkeit, das mit Batch zu lösen? Und wenn nein, hat jemand eine Idee, wie es sonst gehen könnte? VBS vielleicht?
Vielen Dank im Voraus und viele Grüße
Martin
ihr seid mal wieder meine letzte Hoffnung. Vorabinfo: An den Umständen zu folgendem Problem (Dateitypen, Ablauf etc.) kann ich nichts ändern.
Ich habe unter WinXP eine txt-Datei mit gut 40000 Zeilen, in jeder Zeile steht ein Wort. Und ich habe ein Programm, das bei einem Ereignis eine Batch in Gang setzt und ihr einen Zahlenwert übergibt. Der Zahlenwert ist praktischerweise die Nummer der Zeile, in der in der txt-Datei das gesuchte Wort steht, und über diese Zuordnung soll das Wort der Batch übergeben werden. Folgendes habe ich schon probiert:
Mit FOR /F "skip=xy... zur entsprechenden Zeile springen, ab da alles in eine temporäre txt-Datei schreiben und aus dieser wiederum nur die erste Zeile einlesen.
Bei 40000 Zeilen ist das aber in meinem Fall nicht praktikabel. Deshalb meine Frage:
Gibt es eine einfachere Möglichkeit, das mit Batch zu lösen? Und wenn nein, hat jemand eine Idee, wie es sonst gehen könnte? VBS vielleicht?
Vielen Dank im Voraus und viele Grüße
Martin
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 162624
Url: https://administrator.de/contentid/162624
Ausgedruckt am: 24.11.2024 um 01:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo Martin!
Versuchs mal so:
Mathe172
PS: Bei mir braucht es für die 27744225. Zeile 14Sekunden
Versuchs mal so:
@echo off
set "Datei=%~dp0\test.txt"
set /a "ZeileNr=%~1-1"
>%Temp%\Zeile.txt more +%ZeileNr% "%Datei%"
set /p Zeile=<"%Temp%\Zeile.txt"
del %Temp%\Zeile.txt
echo Nun steht in der Variable Zeile: %Zeile%
pause>nul
Mathe172
PS: Bei mir braucht es für die 27744225. Zeile 14Sekunden
Moin bastla,
[OT]
Wenn ich so als Laie Vermutungen über die vermutlichen cw-Werte der beiden Schnipsel anstellen sollte...
Hmm......nehm ich jetzt das Kompakte oer eher das Windschnittige vom Kompakten...? <*grybel*> ...
Grüße
Biber
[/OT]
[OT]
Wenn ich so als Laie Vermutungen über die vermutlichen cw-Werte der beiden Schnipsel anstellen sollte...
Hmm......nehm ich jetzt das Kompakte oer eher das Windschnittige vom Kompakten...? <*grybel*> ...
Grüße
Biber
[/OT]
Hallo,
@bastla: Respekt, deine Batch ist noch schneller.
Tests für die 27'744'225.Zeile:
Meine Batch (ich weiss nicht wie schnell meine wäre, würden noch viele viele Zeilen danach kommen...):
Von: 21:21:24.49
Bis: 21:21:31.98
Deine (sind 2 findstr so schnell!?):
Von: 21:32:05.32
Bis: 21:32:16.72
Mathe172
PS:@Martin: Ich glaube nicht dass es bei deinen "nur" 40000 Zeilen wirklich lange geht
@bastla: Respekt, deine Batch ist noch schneller.
Tests für die 27'744'225.Zeile:
Meine Batch (ich weiss nicht wie schnell meine wäre, würden noch viele viele Zeilen danach kommen...):
Von: 21:21:24.49
Bis: 21:21:31.98
Deine (sind 2 findstr so schnell!?):
Von: 21:32:05.32
Bis: 21:32:16.72
Mathe172
PS:@Martin: Ich glaube nicht dass es bei deinen "nur" 40000 Zeilen wirklich lange geht
@mathe
(Zu berücksichtigen wäre, dass bei "
... ansonsten sähe ich das allerdings auch so: bei 40000 Zeilen dürfte es ziemlich egal sein ...
Grüße
bastla
P.S.:
sind 2 findstr so schnell!?
Wusste ich auch nicht - aber Da Du gerade eine passende Testdatei hattest, dachte ich, ich frage mal ... (Zu berücksichtigen wäre, dass bei "
findstr
" in den Speicher und nicht auf einen Datenträger geschrieben wird.)... ansonsten sähe ich das allerdings auch so: bei 40000 Zeilen dürfte es ziemlich egal sein ...
Grüße
bastla
P.S.:
ich weiss nicht wie schnell meine wäre, würden noch viele viele Zeilen danach kommen...
Versuch es doch einfach einmal für die Zeile 20'000'000 ...
Hallo @all
und mit VBS (SkipLine) dauerts:
40.000 Zeilen = 1 Sekunde
27.744.225 Zeilen = 58 Sekunden
Gruß Dieter
und mit VBS (SkipLine) dauerts:
40.000 Zeilen = 1 Sekunde
27.744.225 Zeilen = 58 Sekunden
Gruß Dieter
moin,
[OT]
Normal geht das sst und fertsch.
wie Testest Du die Laufzeit Deiner Batches?
Ich machs immer damit:
etwas genauer
[/OT]
Gruß Phil
[OT]
Deine (sind 2 findstr so schnell!?):
Von: 21:32:05.32
Bis: 21:32:16.72
wieso eigentlich so lange? das sind ja ääähm über 11 sekunden. hast Du ne Bremse Eingebaut.Von: 21:32:05.32
Bis: 21:32:16.72
Normal geht das sst und fertsch.
wie Testest Du die Laufzeit Deiner Batches?
Ich machs immer damit:
:: ---- schnipp ---- stopme.cmd
:: usage: stopme.cmd Batchfile
@echo off
setlocal
if not "%~1" == "" goto :start
set "startzeit=1"
set "stopzeit=1"
set /p startzeit=Bitte Enter druecken um den Timer zu starten!
:start
set "startzeit=%time%"
if not "%~1" == "" (call %*
goto :stop
)
set /p "stopzeit=Bitte Enter druecken um den Timer zu stoppen!
:stop
set "stopzeit=%time%
if "%startzeit:~0,1%" == " " set "startzeit=%startzeit:~1%"
if "%stopzeit:~0,1%" == " " set "stopzeit=%stopzeit:~1%"
for %%i in ("%startzeit%" "%stopzeit%") do for /f "tokens=1-4 delims=:," %%j in (%%i) do (
if defined sec set /a sec1=sec
set /a sec=10%%l%%m %%10000,sec+=10%%k00 %%10000 * 60,sec+=10%%j00 %%10000 *3600
if defined sec1 set /a sec-=sec1
)
set /a HH =sec / 360000,sec%%=360000,min=100+sec/6000,sec%%=6000,sec+=10000
echo %HH%:%min:~-2%:%sec:~-4,2%,%sec:~-2% >&3
if "%~1" == "" echo.Drueck mich!&pause>nul
:: ---- schnapp ---- stopme.cmd
[/OT]
Gruß Phil
Hallo Phil!
Eventuell so:
Kann aber ein wenig dauern!
Gruß Dieter
Eventuell so:
for /L %%i in (1,1,27744225) do @echo "Textzeile: %%i">>"%temp%\Test.txt"
Gruß Dieter
hallo Didi,
ich wollt es bissel realitätsnäher machen. ich hab den Dir paarmal übern Kompletten Rechner gejagt
ich musste dann aber bei 18.Dir (komisch der 1. war der langsamste) abbrechen weil E:\Test schon 1,09 GB groß war.
findstr /n "^" E:\test | find /c ":" in E:\test.cmd ergab bei "stopme e:\test.cmd"
der Abzählreim liess ertmal die CPU überstunden machen...ist aber noch nix angebrannt!
nun Gut bei 8 mio Zeilen des kleinen files war ich schon bei über 17 sek (was habt'n Ihr für Rennsemmeln als PC???)
Gruß Phil
ich wollt es bissel realitätsnäher machen. ich hab den Dir paarmal übern Kompletten Rechner gejagt
(for /l %i in (1,1,35) do @echo %i>&3&@for /f %j in ('mountvol^|find ":\"^|sort') do @dir /a/s/b %j)>E:\Test
findstr /n "^" E:\test | find /c ":" in E:\test.cmd ergab bei "stopme e:\test.cmd"
13102885
0:04:33,95
nun Gut bei 8 mio Zeilen des kleinen files war ich schon bei über 17 sek (was habt'n Ihr für Rennsemmeln als PC???)
Gruß Phil
Hallo Phil!
Also, die Datei habe ich mit VBS erzeugt und dauert mit Text "Zeile: ########" ca 3 Minuten.
Der Code von mahte dauert bei mir 17 Sekunden und der Code von bastla dagegen nur 9 Sekunden (SSD-Platte)
Bin auch ziemlich überrascht und auch maßlos enttäuscht, dass das Auslesen mit Batch schneller geht, als mit VBS
Gruß Dieter
Also, die Datei habe ich mit VBS erzeugt und dauert mit Text "Zeile: ########" ca 3 Minuten.
Der Code von mahte dauert bei mir 17 Sekunden und der Code von bastla dagegen nur 9 Sekunden (SSD-Platte)
Bin auch ziemlich überrascht und auch maßlos enttäuscht, dass das Auslesen mit Batch schneller geht, als mit VBS
Gruß Dieter