Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Per Batch Zeile Nr. xy einer txt-Datei auslesen

Frage Entwicklung Batch & Shell

Mitglied: martinstein

martinstein (Level 1) - Jetzt verbinden

14.03.2011 um 18:52 Uhr, 6020 Aufrufe, 13 Kommentare

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
Mitglied: mathe172
14.03.2011 um 19:42 Uhr
Hallo Martin!

Versuchs mal so:
01.
@echo off 
02.
set "Datei=%~dp0\test.txt" 
03.
set /a "ZeileNr=%~1-1" 
04.
>%Temp%\Zeile.txt more +%ZeileNr% "%Datei%" 
05.
set /p Zeile=<"%Temp%\Zeile.txt" 
06.
del %Temp%\Zeile.txt 
07.
echo Nun steht in der Variable Zeile: %Zeile% 
08.
pause>nul
Mathe172
PS: Bei mir braucht es für die 27744225. Zeile 14Sekunden
Bitte warten ..
Mitglied: bastla
14.03.2011 um 20:30 Uhr
Hallo mathe!

Und wie lange dauert's mit
01.
@echo off & setlocal 
02.
set "Datei=%~dp0test.txt" 
03.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"^|findstr /b "%~1:"') do set "Zeile=%%j" 
04.
echo %Zeile%
Grüße
bastla
Bitte warten ..
Mitglied: Biber
14.03.2011 um 20:53 Uhr
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]
Bitte warten ..
Mitglied: mathe172
14.03.2011 um 21:34 Uhr
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
Bitte warten ..
Mitglied: bastla
14.03.2011 um 21:40 Uhr
@mathe
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 ...
Bitte warten ..
Mitglied: 76109
14.03.2011 um 22:16 Uhr
Hallo @All

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

Gruß Dieter
Bitte warten ..
Mitglied: pieh-ejdsch
14.03.2011 um 22:21 Uhr
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:
01.
:: ---- schnipp ---- stopme.cmd 
02.
:: usage: stopme.cmd Batchfile 
03.
@echo off 
04.
setlocal 
05.
if not "%~1" == "" goto :start 
06.
set "startzeit=1" 
07.
set "stopzeit=1" 
08.
set /p startzeit=Bitte Enter druecken um den Timer zu starten! 
09.
:start 
10.
set "startzeit=%time%" 
11.
if not "%~1" == "" (call %* 
12.
goto :stop 
13.
14.
set /p "stopzeit=Bitte Enter druecken um den Timer zu stoppen! 
15.
:stop 
16.
set "stopzeit=%time% 
17.
if "%startzeit:~0,1%" == " " set "startzeit=%startzeit:~1%" 
18.
if "%stopzeit:~0,1%" == " " set "stopzeit=%stopzeit:~1%" 
19.
for %%i in ("%startzeit%" "%stopzeit%") do for /f "tokens=1-4 delims=:," %%j in (%%i) do ( 
20.
	if defined sec set /a sec1=sec 
21.
	set /a sec=10%%l%%m %%10000,sec+=10%%k00 %%10000 * 60,sec+=10%%j00 %%10000 *3600 
22.
	if defined sec1 set /a sec-=sec1 
23.
24.
set /a HH =sec / 360000,sec%%=360000,min=100+sec/6000,sec%%=6000,sec+=10000 
25.
echo %HH%:%min:~-2%:%sec:~-4,2%,%sec:~-2% >&3 
26.
if "%~1" == "" echo.Drueck mich!&pause>nul 
27.
:: ---- schnapp ---- stopme.cmd
etwas genauer
[/OT]

Gruß Phil
Bitte warten ..
Mitglied: bastla
14.03.2011 um 22:38 Uhr
@PH
Normal geht das sst und fertsch.
Für eine Textdatei mit mindestens 27.744.225 Zeilen?

Grüße
bastla
Bitte warten ..
Mitglied: pieh-ejdsch
14.03.2011 um 22:53 Uhr
woher soll ich denn jetzt so eine lange Datei hernehmen? Mal gucken ob eine lange Webseite gibt.

Gruß Phil
Bitte warten ..
Mitglied: 76109
14.03.2011 um 23:21 Uhr
Hallo Phil!

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

Gruß Dieter
Bitte warten ..
Mitglied: pieh-ejdsch
15.03.2011 um 01:14 Uhr
hallo Didi,

ich wollt es bissel realitätsnäher machen. ich hab den Dir paarmal übern Kompletten Rechner gejagt
01.
(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
Bitte warten ..
Mitglied: 76109
15.03.2011 um 08:58 Uhr
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
Bitte warten ..
Mitglied: martinstein
21.03.2011 um 23:50 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Einzelne Zeilen in txt Datei speichern und auslesen (7)

Frage von noah1400 zum Thema Batch & Shell ...

Batch & Shell
gelöst BATCH ini Datei Datei auslesen (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
Ungewöhnliche Txt.Datei-Abfrage mit Batch (3)

Frage von DaTobsn zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...