laza86work
Goto Top

Von Textdatei einen bestimmten Bereich auslesen

Ich versuche aus einer Textdatei einen bestimmten Bereich (z.b. zwischen zwei Tags) auszulesen

Hallo zusammen,

ich verzweifle gerade an einem Script, der mir das mühsame Suchen & Kopieren ersparen soll.

Aber von vorne.
Ich habe eine Exportdatei, in der zwischen zwei Tags " [bla] und [/bla] " ein Text steht, der aber unterschiedlich lang/groß ist.
Diesen würde ich gerne per Script (egal ob batch, vbs oder php/js oder andres) auslesen und in eine andere Datei speichern.

Das auslesen von Text funktioniert bei mir schon mal, aber das er mir unterschiedlich viel text zwischen zwei Tags ausliest klappt nicht, bzw. habe ich keine Ahnung wie ich das verwirklichen könnte. Hoffe ich schreib dies hier in das richtige Thead.

Bin um jeden Tipp dankbar.

Danke Greez laza

Content-Key: 133215

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

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

Member: TheJoker2305
TheJoker2305 Jan 12, 2010 at 08:46:34 (UTC)
Goto Top
ideal wäre hier den Weg mit Perl zu beschreiten.

Denn Perl bringt hierfür diverse Funktionen des "Texteparsen" und Dateien lesen und schreiben mit...

habe erst letztens ein Script dazu gebastelt ...

muss ich mal raussuchen ...
Member: laza86work
laza86work Jan 12, 2010 at 08:59:45 (UTC)
Goto Top
Puh, mit Perl bin ich jetzt nicht unbedingt fit.. Würde mich aber freuen, wenn du mir den Script mal zeigen könntest.

Danke schon mal, laza
Mitglied: 76109
76109 Jan 12, 2010, updated at Oct 18, 2012 at 16:40:50 (UTC)
Goto Top
Hallo laza!

Hier ein simples VB-Skript (*.vbs) mit den Beispiel-Tags <td>...</td>:
Const oPath = "F:\Test\Old.Txt"  
Const nPath = "F:\Test\New.Txt"  

Const TagBeg = "<td>"  
Const TagEnd = "</td>"  

Dim oFile, nFile, Tags

Set Fso = CreateObject("Scripting.FileSystemObject")  
    
Set oFile = Fso.OpenTextFile(oPath)
Set nFile = Fso.CreateTextFile(nPath)
    
Do Until oFile.AtEndOfStream
   Tags = Split(oFile.ReadLine, TagBeg)
   If UBound(Tags) = 1 Then nFile.WriteLine Split(Tags(1), TagEnd)(0)
Loop
    
oFile.Close:  nFile.Close

MsgBox "Fertig"  
Die Textlänge ist hierbei ohne Bedeutung

Und hier findest Du noch Beispiele, wie das mit Batch geht:


Gruß Dieter
Member: laza86work
laza86work Jan 12, 2010 at 09:38:09 (UTC)
Goto Top
Wahnsinn! Erstmal ein dicken Dankeschön! Sowas nenne ich mal eine super Antwort.
Werde mir das ganze gleich mal genauer anschauen und ausprobieren.

Ich melde mich dann nochmal. Danke!

laza
Member: Biber
Biber Jan 12, 2010 at 09:42:10 (UTC)
Goto Top
Moin laza86work,

willkommen im Forum.
Der Vollständigkeit halber auch noch eine reine Batchskizze als Orientierung:
:: ------- snipp JustTheblaSection.cmd -----
@echo off & setlocal

:: -- alles zeilenweise mit einer FOR /F -Anweisung an :Processline schicken
for /f "delims=" %%i in (e:\schnipsel\Einbla.txt) do call :ProcessLine "%%i"  
goto :eof
::~~~~~~~~~~~~~
:ProcessLine Parameter1 ist eine ganze Zeile

If not defined ShowItNow (
   if /i "%~1"=="[Bla]"  set "ShowItNow=Jepp"  && goto :eof  
 ) ELSE ( 
   if /i "%~1"=="[/Bla]" set "ShowItNow=" && goto :eof  
 )

if defined ShowItNow echo %~1 

--> alles (außer Leerzeilen] aus der Datei e:\schnipsel\Einbla.txt zwischen den Zeilen "[Bla]" und "[/Bla]" exklusive wird ausgegeben.

Grüße
Biber
Member: laza86work
laza86work Jan 12, 2010 at 10:01:12 (UTC)
Goto Top
siehe unten
Member: laza86work
laza86work Jan 12, 2010 at 10:49:19 (UTC)
Goto Top
So. Funktioniert einwandfrei! Und jetzt kommt auch noch die Batch Variante.. Wahnsinn! Das nenne ich mal ein super Forum!

Jetzt stehe ich aber noch vor einem 2. Problem. Den Inhalt zwischen den beiden Tags ( [bla] - [/bla] soll in eine andere Datei, mit dem gleichen Aufbau ersetzt werden. Also es gibt eine 2. Textdatei, die auch die Tags [bla] - [/bla] beinhaltet. dieser Inhalt soll durch den Inhalt von der ersten Textdatei ersetzt werden. Ob der Lösungsansatz mit vbs oder batch ist, spielt für mich eigentlich keine Rolle.

Danke schon mal im Voraus. laza
Member: Biber
Biber Jan 12, 2010 at 11:19:16 (UTC)
Goto Top
Moin laza86work,

Zitat von @laza86work:

Ob der Lösungsansatz mit vbs oder batch ist, spielt für mich eigentlich keine Rolle.
Für uns auch niocht wirklich.... können (und werden) wir auch machen.

Aber: Eigentlich haben wir dir schon verschiedene Werkzeuge in die Hand gedrückt.
Könnten wir es nicht so machen,dass wir dir z.B. bis heute abend ein wenig Zeit zum Versuchen und Puzzlen lassen und du dich dann noch mal meldest - sei es mit einer selbst gefundenen Lösung oder aber mit einem Rest-Problem, mit dem du nicht weiterkommst?

Wir verteilen hier lieber Angeln statt fertige Fischstäbchen...

Grüße
Biber
Member: laza86work
laza86work Jan 12, 2010 at 11:34:44 (UTC)
Goto Top
Ok. Werde ich machen. Mal schauen wie weit ich komm.

Trotzdem nochmals danke für die Hilfe.

laza
Member: laza86work
laza86work Jan 14, 2010 at 15:07:20 (UTC)
Goto Top
So, ich habe mich mit der Materie jetzt mal auseinander gesetzt und bemerkt, das eine ganz andere Variante für mich viel praktischer ist. Ich durchlaufe einfach beide Dateien, und suche mir die Bereiche heraus und füge dann alle Teile zu einer neuen Datei zusammen. Klappt soweit wunderbar.

Hier der Code:

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objFile = objFSO.OpenTextFile("intern.txt", 1)  

Do Until objFile.AtEndOfStream

    strLine = objFile.ReadLine

    If InStr(1,strLine,"[*\Devices\Classes]",vbTextCompare) > 0 Then exit do  

    x = x + 1

    ReDim Preserve inhalt1(x)

    org_zeile = strLine

    inhalt1(x) = org_zeile

Loop

    x = 0

Do Until objFile.AtEndOfStream

    strLine = objFile.ReadLine

    If InStr(1,strLine,"[*\LicensedComputers]",vbTextCompare) > 0 Then weiter = true  

	If InStr(1,strLine,"[*\Lock]",vbTextCompare) > 0  Then exit do  
	
    If(weiter) Then

       x = x + 1
       ReDim Preserve inhalt3(x)
       org_zeile = strLine
       inhalt3(x) = org_zeile

    End If

Loop

objFile.Close

    x = 0

Set objFile = objFSO.OpenTextFile("user.txt", 1)  

Do Until objFile.AtEndOfStream

    strLine = objFile.ReadLine

    If InStr(1,strLine,"[*\Devices\Classes]",vbTextCompare) > 0 Then anfangen = true  

    If InStr(1,strLine,"[*\LicensedComputers]",vbTextCompare) > 0 Then exit do  

    If(anfangen) Then

       x = x + 1
       ReDim Preserve inhalt2(x)
       org_zeile = strLine
       inhalt2(x) = org_zeile
	   
    End If

Loop

    x = 0

Do Until objFile.AtEndOfStream

    strLine = objFile.ReadLine

    If InStr(1,strLine,"[*\Lock]",vbTextCompare) > 0 Then anfangen2 = true  

    If(anfangen2) Then

       x = x + 1
       ReDim Preserve inhalt4(x)
       org_zeile = strLine
       inhalt4(x) = org_zeile

    End If

Loop

Set objFile = objFSO.CreateTextFile("intern_neu.DLR")  

For x = 1 To UBound(inhalt1)

   objFile.WriteLine inhalt1(x)

Next

For x = 1 To UBound(inhalt2)

   objFile.WriteLine inhalt2(x)

Next

For x = 1 To UBound(inhalt3)

   objFile.WriteLine inhalt3(x)

Next

For x = 1 To UBound(inhalt4)

   objFile.WriteLine inhalt4(x)

Next

objFile.Close

msgbox "Fertig!"  

Jetzt habe ich nur noch ein Problem.
Wenn ich meine beiden Dateien, die ich zusammenführen möchte, nehme, macht er mir das nicht richtig. Wenn ich aber den Inhalt der Datei kopiere und in eine neue Textdatei einfüge, klappt alles wunderbar.
Ich denke das die Dateien nicht im richtigen "Format" abgespeichert wird. Wenn ich den Inhalt in eine andere Textdatei kopiere ist sie auf einmal auch nur noch genau halb so groß. Kann ich das Foramt der Datei irgendwie ändern? Auf Binär? ASCII? Oder wie erkenne ich, in was für einem Foramt die Datei abgespeichert wurde?

Wäre für jede Hilfe dankbar.

Greez laza
Member: Biber
Biber Jan 14, 2010 at 15:45:37 (UTC)
Goto Top
Moin laza.

ja, die FileSystemObject-Methode OpenTextFile kennt einen weiteren (dritten vierten) Parameter für ASCII/Unicode/Systemdefault.

Ich finde den hier relativ übersichtlich beschrieben.

Verbal:
Vierter Parameter von openTextFile
  • wenn 0 oder fehlend ---> ASCII
  • wenn (-1) --> Unicode
  • wenn (-2) --> pokern (Nimm die Systemvoreinstellung, wer immer das sinnvoll glaubt verwenden zu können)

[edit]
Die Methode CreateTextFile kennt als optionalen dritten Parameter TRUE für Unicode, FALSE oder weggelassen für ASCII.
[/edit]

Grüße
Biber

[edit 15.1.] Berichtigt: Bei .OpenTextFile() ist Tristate der vierte und nicht der dritte Parameter. siehe didis Kommentare unten [/edit]
Member: laza86work
laza86work Jan 14, 2010 at 16:33:42 (UTC)
Goto Top
Erstmal Danke Biber!

Habe alle Möglichkeiten ausprobiert. Sowohl beim Lesen und auch Schreiben. Leider ohne Erfolg :|

Kann ich irgendwie auslesen, was das für eine Art Textdatei ist? Oder kann ich diese in eine Textdatei umwandeln? Würde mir schon gerne den Schritt, mit dem Herauskopieren und in einer neuen Textdatei einfügen, sparen.

Hätte hierzu noch jemand eine Idee?
Member: Biber
Biber Jan 14, 2010 at 16:47:46 (UTC)
Goto Top
Moin laza86work,

dann kann es ja eigentlich nur so sein, dass diese (bei dir bisher mit Default-Unterstellung "ASCII") gelesenen Dateien in Wirklichkeit als Unicode vorliegen.
WENN das so wäre, dann müsste aber ein explizites Lesen mit "Lies-es-mir-als-Unicode"-Parameter verbunden mit der ebenso expliziten Ansage "Schreib-es-mir-als-ASCII" helfen.

Und das tut nicht, wenn ich dich richtig verstehe?

Grüße
Biber
Member: laza86work
laza86work Jan 14, 2010 at 17:00:13 (UTC)
Goto Top
Ja genau.

Ich benutze:

[code]Set objFile = objFSO.OpenTextFile("user.DLR", 1, -1)[/code]

und

[code]Set objFile = objFSO.CreateTextFile("intern_neu.DLR",FALSE)[/code]

.. aber er birngt mir beim schreiben eine Fehler, "Typen unverträglich: 'UBound'.

Wenn ich in die geschreibene Datei hinein schaue, ist diese nicht leer, sondern der erste inhalt ist mit leerzeichen zwischen den Buchstaben eingetragen worden und danach fehlen die anderen Teilinhalte..

Bringt mich das weiter, das diese Files "DLR" Endungen haben? Jedenfalls Sind die Dateien EXAKT doppelt so groß wie die erstellte Textdatei. (Die ich mit Kopieren/Einfügen erstellt habe.)

Danke im Voraus. laza
Mitglied: 76109
76109 Jan 14, 2010 at 23:40:33 (UTC)
Goto Top
Hallo zusammen!

Sorry, bin zur Zeit etwas beschäftigt. Aber wenn ich nicht ganz daneben liege, dann ist Tristate der 4. Parameter:

OpenTextFile(FileName As String, [IOMode As IOMode = ForReading], [Create As Boolean = Falsch], [Format As Tristate = TristateFalse]) As TextStream

Ansonsten sieht der Code nicht schlecht aus. Als kleine Anregung, könntest Du die Dateien gleich in ein Array einlesen und dann entsprechend bearbeiten z.B.
TextLines = Split(objFile.ReadAll, vbCrLf):   objFile.Close

For i = 0 To Ubound(TextLines)
    If InStr(1, TextLines(i), "Text1", vbTextCompare) ....  ' x1 = i  
    If InStr(1, TextLines(i), "Text2", vbTextCompare) ....  ' x2 = i  
    ....
Next

Gruß Dieter
Member: laza86work
laza86work Jan 15, 2010 at 07:38:28 (UTC)
Goto Top
Guten Morgen didi,

Danke für die Vereinfachung des Scripts, werde ich bei Gelegenheit mal umstellen.

Aber nun zum OpenTextFiles, ich habe jetzt schon alle Möglichkeiten ausprobiert, ohne Erfolg face-sad

So bringt er mir die Fehlermeldung, falsche Anzahl an Argumenten...

Set objFile = objFSO.OpenTextFile("intern.DLR", 1, -1, TRUE, -1)  

Bringt es euch/dir was, wenn ich diese DLR-File mal hochlade?

Hätte hierzu noch jemand eine Idee?

Greez laza
Mitglied: 76109
76109 Jan 15, 2010 at 09:36:43 (UTC)
Goto Top
Gueten Morgen laza!
Aber nun zum OpenTextFiles, ich habe jetzt schon alle Möglichkeiten ausprobiert, ohne Erfolg face-sad

So bringt er mir die Fehlermeldung, falsche Anzahl an Argumenten...

Set objFile = objFSO.OpenTextFile("intern.DLR", 1, -1, TRUE, -1)  
Tja, das sind nach meiner Rechnung 5 Parameter (siehe oben Syntax-Zeile) OpenTextFile("Path", ForReading 1, Create True/False, Tristate True/False)
Wobei 0 = False oder TristateFalse (ASCII) und -1 = True oder TristadeTrue (Unicode) entspricht
Bringt es euch/dir was, wenn ich diese DLR-File mal hochlade?
Schaden kann es jedenfalls nichtface-wink

Gruß Dieter
Member: laza86work
laza86work Jan 15, 2010 at 12:33:35 (UTC)
Goto Top
YEAH face-smile Es hat geklappt. Mit dem richtigen Syntax liest er die Dateien richtig!

So gehts:

Set objFile = objFSO.OpenTextFile("intern.DLR", 1, -1, -1)  

Danke nochmals an alle Helfenden! Grüße laza
Mitglied: 76109
76109 Jan 15, 2010 at 14:13:32 (UTC)
Goto Top
Hallo laza!

Zitat von @laza86work:
YEAH face-smile Es hat geklappt. Mit dem richtigen Syntax liest er die Dateien richtig!
Tja, wer lesen kann ist klar im Vorteil face-smile

Gruß Dieter