martinstein
Goto Top

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

Content-Key: 162624

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

Printed on: April 25, 2024 at 01:04 o'clock

Member: mathe172
mathe172 Mar 14, 2011 at 18:42:33 (UTC)
Goto Top
Hallo Martin!

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 face-smile
Member: bastla
bastla Mar 14, 2011 at 19:30:59 (UTC)
Goto Top
Hallo mathe!

Und wie lange dauert's mit
@echo off & setlocal
set "Datei=%~dp0test.txt"  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"^|findstr /b "%~1:"') do set "Zeile=%%j"  
echo %Zeile%

Grüße
bastla
Member: Biber
Biber Mar 14, 2011 at 19:53:19 (UTC)
Goto Top
Moin bastla,

[OT]
Zitat von @bastla:
Und wie lange dauert's mit...
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]
Member: mathe172
mathe172 Mar 14, 2011 at 20:34:53 (UTC)
Goto Top
Hallo,

@bastla: Respekt, deine Batch ist noch schneller. face-smile
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 face-wink
Member: bastla
bastla Mar 14, 2011 at 20:40:32 (UTC)
Goto Top
@mathe
sind 2 findstr so schnell!?
Wusste ich auch nicht - aber Da Du gerade eine passende Testdatei hattest, dachte ich, ich frage mal ... face-wink
(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 ...
Mitglied: 76109
76109 Mar 14, 2011 at 21:16:11 (UTC)
Goto Top
Hallo @all

und mit VBS (SkipLine) dauerts:
40.000 Zeilen = 1 Sekunde
27.744.225 Zeilen = 58 Sekunden

Gruß Dieter
Member: pieh-ejdsch
pieh-ejdsch Mar 14, 2011 at 21:21:32 (UTC)
Goto Top
moin,
[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.
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
etwas genauer
[/OT]

Gruß Phil
Member: bastla
bastla Mar 14, 2011 at 21:38:53 (UTC)
Goto Top
@ph
Normal geht das sst und fertsch.
Für eine Textdatei mit mindestens 27.744.225 Zeilen?

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Mar 14, 2011 at 21:53:38 (UTC)
Goto Top
woher soll ich denn jetzt so eine lange Datei hernehmen? Mal gucken ob eine lange Webseite gibt.

Gruß Phil
Mitglied: 76109
76109 Mar 14, 2011 at 22:21:39 (UTC)
Goto Top
Hallo Phil!

Eventuell so:
for /L %%i in (1,1,27744225) do @echo "Textzeile: %%i">>"%temp%\Test.txt"  
Kann aber ein wenig dauern!

Gruß Dieter
Member: pieh-ejdsch
pieh-ejdsch Mar 15, 2011 at 00:14:49 (UTC)
Goto Top
hallo Didi,

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  
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"
13102885
0:04:33,95
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
Mitglied: 76109
76109 Mar 15, 2011 at 07:58:14 (UTC)
Goto Top
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) face-wink

Bin auch ziemlich überrascht und auch maßlos enttäuscht, dass das Auslesen mit Batch schneller geht, als mit VBSface-sad

Gruß Dieter
Member: martinstein
martinstein Mar 21, 2011 at 22:50:29 (UTC)
Goto Top
Hallo,

konnte bastlas Lösungsansatz gerade mal live testen, und es hat wun-der-bar geklappt. Die Ausführungszit ist quasi komplett zu vernachlässigen :D

Danke nochmal für eure großartige Hilfe!

Viele Grüße

Martin