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

Von Textdatei einen bestimmten Bereich auslesen

Frage Entwicklung Batch & Shell

Mitglied: laza86work

laza86work (Level 1) - Jetzt verbinden

12.01.2010, aktualisiert 18.10.2012, 6449 Aufrufe, 19 Kommentare

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
Mitglied: TheJoker2305
12.01.2010 um 09:46 Uhr
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 ...
Bitte warten ..
Mitglied: laza86work
12.01.2010 um 09:59 Uhr
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
Bitte warten ..
Mitglied: 76109
12.01.2010, aktualisiert 18.10.2012
Hallo laza!

Hier ein simples VB-Skript (*.vbs) mit den Beispiel-Tags <td>...</td>:
01.
Const oPath = "F:\Test\Old.Txt" 
02.
Const nPath = "F:\Test\New.Txt" 
03.
 
04.
Const TagBeg = "<td>" 
05.
Const TagEnd = "</td>" 
06.
 
07.
Dim oFile, nFile, Tags 
08.
 
09.
Set Fso = CreateObject("Scripting.FileSystemObject") 
10.
     
11.
Set oFile = Fso.OpenTextFile(oPath) 
12.
Set nFile = Fso.CreateTextFile(nPath) 
13.
     
14.
Do Until oFile.AtEndOfStream 
15.
   Tags = Split(oFile.ReadLine, TagBeg) 
16.
   If UBound(Tags) = 1 Then nFile.WriteLine Split(Tags(1), TagEnd)(0) 
17.
Loop 
18.
     
19.
oFile.Close:  nFile.Close 
20.
 
21.
MsgBox "Fertig"
Die Textlänge ist hierbei ohne Bedeutung

Und hier findest Du noch Beispiele, wie das mit Batch geht:
http://www.administrator.de/forum/batch-aus-mehreren-zeilen-jeweils-zwe ...

Gruß Dieter
Bitte warten ..
Mitglied: laza86work
12.01.2010 um 10:38 Uhr
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
Bitte warten ..
Mitglied: Biber
12.01.2010 um 10:42 Uhr
Moin laza86work,

willkommen im Forum.
Der Vollständigkeit halber auch noch eine reine Batchskizze als Orientierung:
01.
:: ------- snipp JustTheblaSection.cmd ----- 
02.
@echo off & setlocal 
03.
 
04.
:: -- alles zeilenweise mit einer FOR /F -Anweisung an :Processline schicken 
05.
for /f "delims=" %%i in (e:\schnipsel\Einbla.txt) do call :ProcessLine "%%i" 
06.
goto :eof 
07.
::~~~~~~~~~~~~~ 
08.
:ProcessLine Parameter1 ist eine ganze Zeile 
09.
 
10.
If not defined ShowItNow ( 
11.
   if /i "%~1"=="[Bla]"  set "ShowItNow=Jepp"  && goto :eof 
12.
 ) ELSE (  
13.
   if /i "%~1"=="[/Bla]" set "ShowItNow=" && goto :eof 
14.
15.
 
16.
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
Bitte warten ..
Mitglied: laza86work
12.01.2010 um 11:01 Uhr
siehe unten
Bitte warten ..
Mitglied: laza86work
12.01.2010 um 11:49 Uhr
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
Bitte warten ..
Mitglied: Biber
12.01.2010 um 12:19 Uhr
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
Bitte warten ..
Mitglied: laza86work
12.01.2010 um 12:34 Uhr
Ok. Werde ich machen. Mal schauen wie weit ich komm.

Trotzdem nochmals danke für die Hilfe.

laza
Bitte warten ..
Mitglied: laza86work
14.01.2010 um 16:07 Uhr
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:

01.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
02.
Set objFile = objFSO.OpenTextFile("intern.txt", 1) 
03.
 
04.
Do Until objFile.AtEndOfStream 
05.
 
06.
    strLine = objFile.ReadLine 
07.
 
08.
    If InStr(1,strLine,"[*\Devices\Classes]",vbTextCompare) > 0 Then exit do 
09.
 
10.
    x = x + 1 
11.
 
12.
    ReDim Preserve inhalt1(x) 
13.
 
14.
    org_zeile = strLine 
15.
 
16.
    inhalt1(x) = org_zeile 
17.
 
18.
Loop 
19.
 
20.
    x = 0 
21.
 
22.
Do Until objFile.AtEndOfStream 
23.
 
24.
    strLine = objFile.ReadLine 
25.
 
26.
    If InStr(1,strLine,"[*\LicensedComputers]",vbTextCompare) > 0 Then weiter = true 
27.
 
28.
	If InStr(1,strLine,"[*\Lock]",vbTextCompare) > 0  Then exit do 
29.
	 
30.
    If(weiter) Then 
31.
 
32.
       x = x + 1 
33.
       ReDim Preserve inhalt3(x) 
34.
       org_zeile = strLine 
35.
       inhalt3(x) = org_zeile 
36.
 
37.
    End If 
38.
 
39.
Loop 
40.
 
41.
objFile.Close 
42.
 
43.
    x = 0 
44.
 
45.
Set objFile = objFSO.OpenTextFile("user.txt", 1) 
46.
 
47.
Do Until objFile.AtEndOfStream 
48.
 
49.
    strLine = objFile.ReadLine 
50.
 
51.
    If InStr(1,strLine,"[*\Devices\Classes]",vbTextCompare) > 0 Then anfangen = true 
52.
 
53.
    If InStr(1,strLine,"[*\LicensedComputers]",vbTextCompare) > 0 Then exit do 
54.
 
55.
    If(anfangen) Then 
56.
 
57.
       x = x + 1 
58.
       ReDim Preserve inhalt2(x) 
59.
       org_zeile = strLine 
60.
       inhalt2(x) = org_zeile 
61.
	    
62.
    End If 
63.
 
64.
Loop 
65.
 
66.
    x = 0 
67.
 
68.
Do Until objFile.AtEndOfStream 
69.
 
70.
    strLine = objFile.ReadLine 
71.
 
72.
    If InStr(1,strLine,"[*\Lock]",vbTextCompare) > 0 Then anfangen2 = true 
73.
 
74.
    If(anfangen2) Then 
75.
 
76.
       x = x + 1 
77.
       ReDim Preserve inhalt4(x) 
78.
       org_zeile = strLine 
79.
       inhalt4(x) = org_zeile 
80.
 
81.
    End If 
82.
 
83.
Loop 
84.
 
85.
Set objFile = objFSO.CreateTextFile("intern_neu.DLR") 
86.
 
87.
For x = 1 To UBound(inhalt1) 
88.
 
89.
   objFile.WriteLine inhalt1(x) 
90.
 
91.
Next 
92.
 
93.
For x = 1 To UBound(inhalt2) 
94.
 
95.
   objFile.WriteLine inhalt2(x) 
96.
 
97.
Next 
98.
 
99.
For x = 1 To UBound(inhalt3) 
100.
 
101.
   objFile.WriteLine inhalt3(x) 
102.
 
103.
Next 
104.
 
105.
For x = 1 To UBound(inhalt4) 
106.
 
107.
   objFile.WriteLine inhalt4(x) 
108.
 
109.
Next 
110.
 
111.
objFile.Close 
112.
 
113.
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
Bitte warten ..
Mitglied: Biber
14.01.2010 um 16:45 Uhr
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]
Bitte warten ..
Mitglied: laza86work
14.01.2010 um 17:33 Uhr
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?
Bitte warten ..
Mitglied: Biber
14.01.2010 um 17:47 Uhr
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
Bitte warten ..
Mitglied: laza86work
14.01.2010 um 18:00 Uhr
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
Bitte warten ..
Mitglied: 76109
15.01.2010 um 00:40 Uhr
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.
01.
TextLines = Split(objFile.ReadAll, vbCrLf):   objFile.Close 
02.
 
03.
For i = 0 To Ubound(TextLines) 
04.
    If InStr(1, TextLines(i), "Text1", vbTextCompare) ....  ' x1 = i 
05.
    If InStr(1, TextLines(i), "Text2", vbTextCompare) ....  ' x2 = i 
06.
    .... 
07.
Next
Gruß Dieter
Bitte warten ..
Mitglied: laza86work
15.01.2010 um 08:38 Uhr
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

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

01.
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
Bitte warten ..
Mitglied: 76109
15.01.2010 um 10:36 Uhr
Gueten Morgen laza!
Aber nun zum OpenTextFiles, ich habe jetzt schon alle Möglichkeiten ausprobiert, ohne Erfolg

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

01.
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 nicht

Gruß Dieter
Bitte warten ..
Mitglied: laza86work
15.01.2010 um 13:33 Uhr
YEAH Es hat geklappt. Mit dem richtigen Syntax liest er die Dateien richtig!

So gehts:

01.
Set objFile = objFSO.OpenTextFile("intern.DLR", 1, -1, -1)
Danke nochmals an alle Helfenden! Grüße laza
Bitte warten ..
Mitglied: 76109
15.01.2010 um 15:13 Uhr
Hallo laza!

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

Gruß Dieter
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

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

Ähnliche Inhalte
Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Google Android
Textdatei auf SD Karte auslesen funktioniert nicht (Oneplus One) (4)

Frage von lordzwieback zum Thema Google Android ...

Batch & Shell
Per Batch ab einer bestimmten Stelle in einer .txt auslesen (1)

Frage von PeterPann zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (24)

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

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...