gurkenhobel
Goto Top

VBS - Zeilen aus Textdatei auslesen (regelm. Reihenfolge)

Hallo,
wiedereinmal wird Hilfe benötigt und ich darf mich schon im voraus dafür bedanken.

Wie kann ich aus einer simplen Textdatei immer eine bestimmte Anzahl Zeilen auslesen und in eine neue Datei schreiben ?
In der Beispieldatei wären dies die Zeilen 3, 5, 8, 10, 13, 15 ... also im Wechsel 1 bzw. 2 Leerzeilen dazwischen, beginnend ab Zeile 3.


August
31
Zeile 3
blabla 4
Zeile 5
blablabla 6
30
Zeile 8
blablabla 9
Zeile 10
Blabla 11
29
Zeile 13
blabla 14
Zeile 15
blabla 16
28
...

Ich freue mich auf Antwprten
Micha

Content-Key: 221316

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

Printed on: April 20, 2024 at 03:04 o'clock

Member: Biber
Biber Nov 06, 2013 updated at 21:53:58 (UTC)
Goto Top
Moin Gurkenhobel,

ein VBSkript geht mir ja nicht so flott wie ein Batch-Einzeiler.
Deshalb poste ich diesen - der Algorithmus lässt sich sicherlich auch als VBS umsetzen.

Deinen Beispieltext oben würde ich bei mir am CMD (wo DelayedExpansion per HKCU-Eintrag immer aktiviert ist) so abfackeln:
biber$@(for /f "delims=: tokens=1,*" %a in ('findstr /n $ beispieltext.txt') do @(set /a x=%a %10)>nul & @(for %i in (0 3 5 8) do @if !x!==%i @echo %b)
Zeile 3
Zeile 5
Zeile 8
Zeile 10
Zeile 13
Zeile 15
"biber$" ist mein Prompt, der Oneliner geht also mit "@(for...." los

Bedeutet:
  • Ich lasse per "Findstr /n $" alle Zeilen von Beispieltext.txt mit Zeilennummer ausgeben
  • wenn die Zeilennummer MOD 10 gleich 0, 3, 5 oder 8 ist, dann gebe ich es aus
  • fertig

Grüße
Biber
Member: TsukiSan
TsukiSan Nov 07, 2013 at 03:02:36 (UTC)
Goto Top
Hallo Gurkenhobel,

wie Biber schon bemerkt hat, geht das mit Batch mit viel weniger Zeilen.
Aber da du nach VBS gefragt hast, hier ein Beispiel:

Set FSO = CreateObject("Scripting.FileSystemObject")  
AlleZeilen = Split(FSO.OpenTextFile("Zeilen.txt",1).ReadAll,vbcrlf)  
For i = 0 to Ubound(AlleZeilen) - 1
	a = i mod(10)
	if a = 2 or a = 4 or a = 7 or a = 9 then
		ZeilenEinzel = ZeilenEinzel & AlleZeilen(i) & vbcrlf
	end if
Next

FSO.CreateTextFile("Zeilen-gefiltert.txt",true).Write (ZeilenEinzel)  

In der 5ten Zeile müsstest du eventuell deine Zeilennummern anpassen (Achtung! fängt mit NULL an zu zählen).

Gruss

Tsuki
Member: Gurkenhobel
Gurkenhobel Nov 07, 2013 at 11:09:20 (UTC)
Goto Top
Mahlzeit Biber,

danke für die Überlegung. Aber das Batch bringt im Echo keine Ergebnisse (liegt wohl an dem DelayedExpansion in der Registry). Ich bin auch nicht so der "Batchmensch".
Bei deiner Batchdatei müsste ich ja die Zeilen alle einzeln angeben (... for %i in (0 3 5 8 10 13 15 18 20 ..) und so bringt auch die Umleitung (pipe) in eine Datei nix.
Bei VBS oder VBA ist für mich etwas nachvollziehbarer und so bevorzuge ich halt diese Variante.
Danke trotzdem

Grüße
GH
Member: Gurkenhobel
Gurkenhobel Nov 07, 2013 at 11:26:27 (UTC)
Goto Top
Hallo TsukiSan,

danke für Dein morgentliches Script, das zur vollsten Zufriedenheit funktioniert. Auch ohne Anpassung der Zeile 5 wurden alle 158 Zeilen bearbeitet und die gewünschten ausgelesen und "exportiert".

どうもありがとう

Beste Grüße
GH
Member: Biber
Biber Nov 07, 2013 updated at 21:29:48 (UTC)
Goto Top
Moin Gurkenhobel,

meine Batch-CMD-Zeile war ja nur gedacht als proof of concept für den - ich nenne es mal übertrieben "Algorithmus".

Als Batch, den du auch ohne spezielle Registry-Änderungen bei dir ausführen kannsr, sähe der (ungetestet) so aus:
@echo off & setlocal EnableDelayedExpansion
for /f "delims=: tokens=1,*" %%a in ('findstr /n $ beispieltext.txt') do (  
   set /a x=%%a %% 10  >nul 
    for %%i in (0 3 5 8) do if !x!==%%i echo %%b
)

Und nein, ich muss nicht jede Zeile einzeln angeben nach dem Muster ". for %i in (0 3 5 8 10 13 15 18 20 ..) ".

Grüße
Biber
Member: Gurkenhobel
Gurkenhobel Nov 07, 2013 at 19:17:47 (UTC)
Goto Top
Hi Biber,

ja die Ausgabe klappt jetzt schnell - aber das Umleiten in eine Datei klappt nicht. Weder vor noch nach der abschließenden Klammer bringt "> export.txt" nur eine Zeilein die Datei.

Grüße
GH
Member: Biber
Biber Nov 07, 2013 updated at 21:31:13 (UTC)
Goto Top
Moin Gurkenhobel,

zwei von vielen Möglichkeiten:

a) wenn du die Batchdatei von einem CMD-Prompt aufrufst (also bespielsweise "FilterText" eingibst, weil die Datei bei dir Filtertext.cmd heisst und im aktuellen Verzeichnis liegt) und dort die Ausgabe so aussieht, wie du sie in ein einer Datei haben willst: dann gib ein
FilterText>d:\temp\GefilterterExport.txt
, um das Ergebnis in eine Datei umzuleiten. Hat den Vorteil, dass du beim Aufruf ohne zusätzlichen Parameter erst mal das Ergebnis auf dem Monitor anschauen kannst und erst dann in einem zweiten Schritt das Ergebnis festschreibst.

b) wenn du ohne Parameter arbeiten willst und das Ziel immer in eine Datei "D:\temp\GefilterterExport.Txt" geschrieben werden soll, dann füge als neue Zeile 2 ein
">D:\temp\GefilterterExport.Txt (" und hänge in der letzten Zeile eine Klammer-Zu an:

:: --- abspeichern als Plaintext mit Endung .bat./cmd
@echo off & setlocal EnableDelayedExpansion
>D:\temp\GefilterterExport.Txt (
for /f "delims=: tokens=1,*" %%a in ('findstr /n $ beispieltext.txt') do (  
   set /a x=%%a %% 10  >nul 
    for %%i in (0 3 5 8) do if !x!==%%i echo %%b
))


Auch diesmal wieder ungetestet.

Grüße
Biber
Member: Gurkenhobel
Gurkenhobel Nov 07, 2013 at 21:08:08 (UTC)
Goto Top
Hallo Biber,

klappt alles beides wunderbar. Vielen Dank,
werde mich wohl für die Variante a mit der Umleitung auf Konsolenebene (Kommandozeilenebene) entscheiden.

Schön' Abend noch und Betse Grüße
Gurkenhobel
Member: TsukiSan
TsukiSan Nov 07, 2013 at 23:33:37 (UTC)
Goto Top
どうもありがとう

こちらこそ

Ps.: Das soll jetzt aber kein japanisches Forum werden face-wink

よろしく おねがいします

Tsuki
Member: Gurkenhobel
Gurkenhobel Nov 08, 2013 at 11:54:19 (UTC)
Goto Top
NEIN, natürlich nicht...

kann ja eh' k(aum )einer lesen.

GH

ENDE ----------------------------