Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
708to712
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
708to712
708to712
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

die Nadel im Heuhaufen suchen...

die Nadel im Heuhaufen suchen...
18.12.2005 17:32:25
michael
Hallo,
anbei ein ausschnitt aus einem log-file.
Per
Do Until EOF(intFile)
Line Input #intFile, strLine
If InStr(1, strLine, "abc") 0 Then
finde ich ein markante Textzeile
nach dieser Zeile muß ich "G3MP2=" finden
Dieser Wert muss sich nicht unbedingt in einer Zeile befinden, sondern kann auch über 2 Zeilen geschrieben sein.
Jedoch wird er immer re und li von "\" eingerahmt \G3MP2=-231.8297519\, die anzahl der Zeichen vor oder nach dem Komma kann ebenfalls variieren.
Hat jemand eine Idee zu diesem Problem?
Danke und viele Grüße
Michael
1\1\GINC-THEO13\Mixed\G3MP2\G3MP2\C6H6\QCL\15-Dec-2005\0\\#G3MP2\\Benz
ol\\0,1\C,0,-1.2083204616,-0.6976098407,0.\C,0,-1.2083077557,0.6976318
109,0.\C,0,0.0000124131,1.3952411363,0.\C,0,1.2083207567,0.6976093302,
0.\C,0,1.2083080508,-0.6976313007,0.\C,0,-0.0000130044,-1.3952411361,0
.\H,0,-2.1498113987,-1.2411683059,0.\H,0,-2.1497887947,1.2412074438,0.
\H,0,0.0000223756,2.482375438,0.\H,0,2.1498115958,1.2411679734,0.\H,0,
2.1497889915,-1.2412071114,0.\H,0,-0.0000227628,-2.482375438,0.\\Versi
on=x86-Linux-G03RevB.04\State=1-A'\MP2/6-31G(d)=-231.4577197\QCISD(T)/
6-31G(d)=-231.5312798\MP2/GTMP2Large=-231.7131444\G3MP2=-231.8297519\F
reqCoord=-2.2685750811,-1.3097400937,0.,-2.2685511382,1.3097805494,0.,
0.0000210487,2.6195136137,0.,2.268577927,1.3097340799,0.,2.2685540366,
-1.3097746597,0.,-0.0000279785,-2.6195136911,0.,-4.0287851821,-2.32597
17853,0.,-4.0287420791,2.326044276,0.,0.0000452294,4.6520159654,0.,4.0
287864749,2.3259744882,0.,4.0287443673,-2.3260456405,0.,-0.0000416973,
-4.6520160958,0.\PG=CS [SG(C6H6)]\NImag=0\\0.82148692,0.04518385,0.769
28905,0.,0.,0.16590314,-0.16649365,0.05449651,0.,0.82148429,-0.0545002
2,-0.36831981,0.,-0.04518618,0.76929052,0.,0.,-0.07768100,0.,0.,0.1659
0321,0.06383833,-0.12197683,0.,-0.31787800,-0.03290175,0.,0.74320971,-
0.03304415,-0.02565932,0.,-0.14189862,-0.21695275,0.,0.00000757,0.8475
6835,0.,0.,0.00973061,0.,0.,-0.07767990,0.,0.,0.16590300,-0.03261154,0
.05219765,0.,-0.07041115,-0.04446473,0.,-0.31786464,0.14189465,0.,0.82
147121,0.05219770,-0.09288671,0.,0.04446802,0.10858991,0.,0.03289779,-
0.21695257,0.,0.04518941,0.76930199,0.,0.,-0.00944411,0.,0.,0.00973066
,0.,0.,-0.07768067,0.,0.,0.16590356,-0.07041115,0.044 usw.

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: die Nadel im Heuhaufen suchen...
18.12.2005 18:38:59
Erich
Hallo Michael,
besteht das Logfile tatsächlich aus Zeilen mit jeweils 70 Zeichen?
Das würde die Sucherei etwas erschweren: Die Suchbegriffe "abc" oder "\G3MP2=" könnten - wie auch der zu ermittelnde Wert von G3MP2 - durch Zeilenwechsel-Zeichen unterbrochen sein.
Oder stehen im Logfile gar keine Zeilenenden, besteht also aus einem einzigen Satz? Dann ist "Line Input" vielleicht nicht die beste Art und Weise, die Datei zu lesen: Nach dem ersten Lesen stünde in strLine der gesamte Inhalt der Datei, soweit er denn in einem Rutsch gelsen werden kann und in die Variable passt.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: die Nadel im Heuhaufen suchen...
18.12.2005 20:20:44
michael
Hallo Erich,
der LogFile ist unterschiedlcih "formatiert" - besitzt aber Zeilenenden.
Die Zeile in der ich nach abc Suche ist eine echte einzelne Zeile, die immer gleich ist - das abc wird nicht unterbrochen. Das bereitet mir kein kopfzerbrechen...
dann folgt der Block:
besitzt bisher immer 70 Zeichen pro Zeile, deshalb kann der Suchbegriff \G3MP2= sowie das Ergebnis unterbrochen sein.
Danke und viele Grüße
Michael
AW: die Nadel im Heuhaufen suchen...
18.12.2005 18:49:00
Josef
Hallo Michael!
Probier mal!
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub sucheInTextFile()
Dim x As Long, Zeilen() As String, FName As String, sText As String

On Error GoTo ERRORHANDLER


FName = Application.GetOpenFilename("Textl Dateien (*.txt)," & _
  "*.txt")

If FName = "Falsch" Then Exit Sub

sText = "G3MP2=" 'Suchtext

If sText = "" Then Exit Sub

With Application
  .ScreenUpdating = False
  .EnableEvents = False
  .DisplayAlerts = False
  .Calculation = xlCalculationManual
  .Cursor = xlWait
End With

Range("A:A").ClearContents 'Datenbereich löschen

'Die letzten beiden Parameter geben das linke und rechte
'Begrenzungszeichen einer Zeile an, dies können auch
'mehrere sein.
If FindTerm(FName, sText, Zeilen, "\", "\") Then
  
  For x = 0 To UBound(Zeilen) - 1
    
    Cells(x + 1, 1) = Zeilen(x)
    
  Next x
  
  MsgBox "Es wurde" & IIf(UBound(Zeilen) > 1, "n ", " ") & UBound(Zeilen) & _
    " Zeile" & IIf(UBound(Zeilen) > 1, "n ", " ") & "gefunden!"
  
Else
  MsgBox "Suchbegriff nicht vorhanden!"
End If

ERRORHANDLER:
Debug.Print Err.Number; Err.Description
With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .DisplayAlerts = True
  .Calculation = xlCalculationAutomatic
  .Cursor = xlDefault
End With

End Sub


Private Function FindTerm(File As String, s As String, ZZ() As String, _
  tl As String, tr As String) As Boolean

'Nach einer Idee von http://www.activevb.de
Dim c As Long, i As Long, j As Long
Dim FLen As Long, lc As Long, p As Long
Dim v As Long, w As Long
Dim f As Integer
Dim a As String, d As String
Dim buffer As String, old As String


'Dieser Wert gibt die Paketgröße von Get# an. Er kann beliebig
'geändert werden, sollte aber nicht kleiner als die längste
'zu erwartende Zeile des zu druchsuchenden Files sein
Const PS As Long = 1024&

Redim ZZ(0)

'Prüfen ob Parameter plausibel sind
If Len(tl) = 0 Or Len(tr) = 0 Or Len(s) = 0 Or _
  Dir$(File, vbNormal) = "" Then
  
  MsgBox ("Paramter stimmen nicht!")
  Exit Function
End If

f = FreeFile
Open File For Binary Shared As #f
FLen = LOF(f)

'Anzahl der Durchläufe anhand der Dateigröße ermitteln
p = FLen \ PS
If FLen Mod PS <> 0 Then p = p + 1

'Schleife starten
For c = 1 To p
  buffer = Space$(PS)
  Get f, , buffer
  a = old & buffer
  
  i = InStr(1, a, s)
  If i <> 0 Then
    'Suchbegriff wurde im aktuellen Paket gefunden
    lc = 0
    Do
      i = InStr(i, a, s)
      If i <> 0 Then
        
        'Zeilenanfang suchen
        v = 1
        For j = i To 1 Step -1
          d = Mid$(a, j, 1)
          
          'gefunden
          If InStr(1, tl, d) Then
            v = j + 1
            Exit For
          End If
        Next j
        
        'Zeilenende suchen
        w = 0
        For j = i To Len(a)
          d = Mid$(a, j, 1)
          
          'gefunden
          If InStr(1, tr, d) Then
            w = j - 1
            Exit For
          End If
        Next j
        
        If w <> 0 Then
          ' Zeile auschneiden und in einem Feld speichern
          ' Hier könnten auch weitere Suchkriterien abge-
          ' fragt werden.
          ZZ(UBound(ZZ)) = Mid$(a, v, w - v)
          Redim Preserve ZZ(0 To UBound(ZZ) + 1)
          lc = w
        End If
        
        i = w
      End If
      
      'Weiter schleifen, da der Suchbegriff im Paket ja
      'öfters als einmal auftauchen kann
    Loop Until i = 0
    
    If lc = 0 Then
      'Suchbegriff wurde im aktuellen Paket nicht ge-
      'funden. Daher ganzen String für die nächste Runde
      'speichern
      old = a
    Else
      'Ab Ende der zuletzt gefundenen Zeile des aktuel-
      'len Paketes für die nächste Runde speichern
      old = Mid$(a, lc)
    End If
  Else
    'Paket der aktuellen Runde speichern
    old = buffer
  End If
Next c
Close f

If UBound(ZZ) > 0 Then FindTerm = True
End Function


'******************************
'* Gruß Sepp
'*
'* Rückmeldung wäre nett!
'******************************

Anzeige
AW: die Nadel im Heuhaufen suchen...
18.12.2005 21:30:01
michael
Hallo Josef,
danke für den Code - leider springt er bei
f = FreeFile
Open File For Binary Shared As #f
in den Errorhandler und beendet den Macro.
Das liegt soweit ichs testen konnte an der Filegröße. Hab die Datei aufs wesentliche gekürzt, dann gings. Jedoch fehlt die letzte Ziffer der Zahl...
Die ursprüngliche Dateigröße kann leicht 500 kB und mehr sein - ließe sich das irgendwie handhaben?
Wenn der Suchbegriff durch den Zeilenumbruch getrennt wird - kein Treffer.
Ist das Ergebnis durch zeilenumbruch getrennt. wird es mit ZeilenumbruchSteuerzeichen übernommen. Ließe sich das automatisch formatieren?
Ich habe mal die gerkürzte Version anghängt - vielleicht hift es...
Ich habe auch gleich einige Zeilenumbrüche für Suchtext und Ergebnis eingefügt.
Danke und viele Grüße
Michael
PS. interessanter Weise tauchen die Steuerzeichen wieder auf. Die dachte ich eigentlich los zu sein, da ich den original log-file (kommt aus UNIX) in word öffne und als txt speichere. Im original Logfile werden teilweise ganze Absätze als eine Zeile erkannt
https://www.herber.de/bbs/user/29408.txt
Anzeige
AW: die Nadel im Heuhaufen suchen...
18.12.2005 22:13:32
Josef
Hallo Michael!
Ich hab' dein Testfile mal auf 5.500 KB aufgebläht und der Code läuft Tadellos!
Die Umbrüche werden jetzt entfernt und auch die letzte Ziffer wird nicht mehr verschluckt.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub sucheInTextFile()
Dim x As Long, Zeilen() As String, FName As String, sText As String

On Error GoTo ERRORHANDLER


FName = Application.GetOpenFilename("Textl Dateien (*.txt)," & _
  "*.txt")

If FName = "Falsch" Then Exit Sub

sText = "G3MP2=" 'Suchtext

If sText = "" Then Exit Sub

With Application
  .ScreenUpdating = False
  .EnableEvents = False
  .DisplayAlerts = False
  .Calculation = xlCalculationManual
  .Cursor = xlWait
End With

Range("A:A").ClearContents 'Datenbereich löschen

'Die letzten beiden Parameter geben das linke und rechte
'Begrenzungszeichen einer Zeile an, dies können auch
'mehrere sein.
If FindTerm(FName, sText, Zeilen, "\", "\") Then
  
  For x = 0 To UBound(Zeilen) - 1
    
    Cells(x + 1, 1) = Zeilen(x)
    
  Next x
  
  MsgBox "Es wurde" & IIf(UBound(Zeilen) > 1, "n ", " ") & UBound(Zeilen) & _
    " Zeile" & IIf(UBound(Zeilen) > 1, "n ", " ") & "gefunden!"
  
Else
  MsgBox "Suchbegriff nicht vorhanden!"
End If

ERRORHANDLER:
Debug.Print Err.Number; Err.Description
With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .DisplayAlerts = True
  .Calculation = xlCalculationAutomatic
  .Cursor = xlDefault
End With

End Sub



Private Function FindTerm(File As String, s As String, ZZ() As String, _
  tl As String, tr As String) As Boolean

'Nach einer Idee von http://www.activevb.de
Dim c As Long, i As Long, j As Long
Dim FLen As Long, lc As Long, p As Long
Dim v As Long, w As Long
Dim f As Integer
Dim a As String, d As String
Dim buffer As String, old As String


'Dieser Wert gibt die Paketgröße von Get# an. Er kann beliebig
'geändert werden, sollte aber nicht kleiner als die längste
'zu erwartende Zeile des zu druchsuchenden Files sein
Const PS As Long = 1024&

Redim ZZ(0)

'Prüfen ob Parameter plausibel sind
If Len(tl) = 0 Or Len(tr) = 0 Or Len(s) = 0 Or _
  Dir$(File, vbNormal) = "" Then
  
  MsgBox ("Paramter stimmen nicht!")
  Exit Function
End If

f = FreeFile
Open File For Binary Shared As #f
FLen = LOF(f)

'Anzahl der Durchläufe anhand der Dateigröße ermitteln
p = FLen \ PS
If FLen Mod PS <> 0 Then p = p + 1

'Schleife starten
For c = 1 To p
  buffer = Space$(PS)
  Get f, , buffer
  a = old & buffer
  a = Replace(Replace(a, Chr(10), ""), Chr(13), "") 'Zeilenumbrüche entfernen
  
  i = InStr(1, a, s)
  If i <> 0 Then
    'Suchbegriff wurde im aktuellen Paket gefunden
    lc = 0
    Do
      i = InStr(i, a, s)
      If i <> 0 Then
        
        'Zeilenanfang suchen
        v = 1
        For j = i To 1 Step -1
          d = Mid$(a, j, 1)
          
          'gefunden
          If InStr(1, tl, d) Then
            v = j + 1
            Exit For
          End If
        Next j
        
        'Zeilenende suchen
        w = 0
        For j = i To Len(a)
          d = Mid$(a, j, 1)
          
          'gefunden
          If InStr(1, tr, d) Then
            w = j
            Exit For
          End If
        Next j
        
        If w <> 0 Then
          ' Zeile auschneiden und in einem Feld speichern
          ' Hier könnten auch weitere Suchkriterien abge-
          ' fragt werden.
          ZZ(UBound(ZZ)) = Mid$(a, v, w - v)
          Redim Preserve ZZ(0 To UBound(ZZ) + 1)
          lc = w
        End If
        
        i = w
      End If
      
      'Weiter schleifen, da der Suchbegriff im Paket ja
      'öfters als einmal auftauchen kann
    Loop Until i = 0
    
    If lc = 0 Then
      'Suchbegriff wurde im aktuellen Paket nicht ge-
      'funden. Daher ganzen String für die nächste Runde
      'speichern
      old = a
    Else
      'Ab Ende der zuletzt gefundenen Zeile des aktuel-
      'len Paketes für die nächste Runde speichern
      old = Mid$(a, lc)
    End If
  Else
    'Paket der aktuellen Runde speichern
    old = buffer
  End If
Next c
Close f

If UBound(ZZ) > 0 Then FindTerm = True
End Function


'******************************
'* Gruß Sepp
'*
'* Rückmeldung wäre nett!
'******************************

Anzeige
Und jetzt.....
18.12.2005 22:26:08
Josef
Hallo Michael!
...klappts auch mit Umbruch im Suchbegriff!
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub sucheInTextFile()
Dim x As Long, Zeilen() As String, FName As String, sText As String

'On Error GoTo ERRORHANDLER


FName = Application.GetOpenFilename("Textl Dateien (*.txt)," & _
  "*.txt")

If FName = "Falsch" Then Exit Sub

sText = "G3MP2=" 'Suchtext

If sText = "" Then Exit Sub

With Application
  .ScreenUpdating = False
  .EnableEvents = False
  .DisplayAlerts = False
  .Calculation = xlCalculationManual
  .Cursor = xlWait
End With

Range("A:A").ClearContents 'Datenbereich löschen

'Die letzten beiden Parameter geben das linke und rechte
'Begrenzungszeichen einer Zeile an, dies können auch
'mehrere sein.
If FindTerm(FName, sText, Zeilen, "\", "\") Then
  
  For x = 0 To UBound(Zeilen) - 1
    
    Cells(x + 1, 1) = Zeilen(x)
    'Oder nur den Wert
    Cells(x + 1, 1) = CDbl(Trim$(Replace(Replace(Replace(Zeilen(x), sText, ""), ".", ","), " ", "")))
    
  Next x
  
  MsgBox "Es wurde" & IIf(UBound(Zeilen) > 1, "n ", " ") & UBound(Zeilen) & _
    " Zeile" & IIf(UBound(Zeilen) > 1, "n ", " ") & "gefunden!"
  
Else
  MsgBox "Suchbegriff nicht vorhanden!"
End If

ERRORHANDLER:
Debug.Print Err.Number; Err.Description
With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .DisplayAlerts = True
  .Calculation = xlCalculationAutomatic
  .Cursor = xlDefault
End With

End Sub



Private Function FindTerm(File As String, s As String, ZZ() As String, _
  tl As String, tr As String) As Boolean

'Nach einer Idee von http://www.activevb.de
Dim c As Long, i As Long, j As Long
Dim FLen As Long, lc As Long, p As Long
Dim v As Long, w As Long
Dim f As Integer
Dim a As String, d As String
Dim buffer As String, old As String


'Dieser Wert gibt die Paketgröße von Get# an. Er kann beliebig
'geändert werden, sollte aber nicht kleiner als die längste
'zu erwartende Zeile des zu druchsuchenden Files sein
Const PS As Long = 1024&

Redim ZZ(0)

'Prüfen ob Parameter plausibel sind
If Len(tl) = 0 Or Len(tr) = 0 Or Len(s) = 0 Or _
  Dir$(File, vbNormal) = "" Then
  
  MsgBox ("Paramter stimmen nicht!")
  Exit Function
End If

f = FreeFile
Open File For Binary Shared As #f
FLen = LOF(f)

'Anzahl der Durchläufe anhand der Dateigröße ermitteln
p = FLen \ PS
If FLen Mod PS <> 0 Then p = p + 1

'Schleife starten
For c = 1 To p
  buffer = Space$(PS)
  Get f, , buffer
  a = old & buffer
  a = Replace(Replace(Replace(a, Chr(10), ""), Chr(13), ""), " ", "") 'Zeilenumbrüche entfernen
  
  i = InStr(1, a, s)
  If i <> 0 Then
    'Suchbegriff wurde im aktuellen Paket gefunden
    lc = 0
    Do
      i = InStr(i, a, s)
      If i <> 0 Then
        
        'Zeilenanfang suchen
        v = 1
        For j = i To 1 Step -1
          d = Mid$(a, j, 1)
          
          'gefunden
          If InStr(1, tl, d) Then
            v = j + 1
            Exit For
          End If
        Next j
        
        'Zeilenende suchen
        w = 0
        For j = i To Len(a)
          d = Mid$(a, j, 1)
          
          'gefunden
          If InStr(1, tr, d) Then
            w = j
            Exit For
          End If
        Next j
        
        If w <> 0 Then
          ' Zeile auschneiden und in einem Feld speichern
          ' Hier könnten auch weitere Suchkriterien abge-
          ' fragt werden.
          ZZ(UBound(ZZ)) = Mid$(a, v, w - v)
          Redim Preserve ZZ(0 To UBound(ZZ) + 1)
          lc = w
        End If
        
        i = w
      End If
      
      'Weiter schleifen, da der Suchbegriff im Paket ja
      'öfters als einmal auftauchen kann
    Loop Until i = 0
    
    If lc = 0 Then
      'Suchbegriff wurde im aktuellen Paket nicht ge-
      'funden. Daher ganzen String für die nächste Runde
      'speichern
      old = a
    Else
      'Ab Ende der zuletzt gefundenen Zeile des aktuel-
      'len Paketes für die nächste Runde speichern
      old = Mid$(a, lc)
    End If
  Else
    'Paket der aktuellen Runde speichern
    old = buffer
  End If
Next c
Close f

If UBound(ZZ) > 0 Then FindTerm = True
End Function


'******************************
'* Gruß Sepp
'*
'* Rückmeldung wäre nett!
'******************************

Anzeige
AW: Und jetzt.....
19.12.2005 02:59:54
michael
Hallo Josef,
erst mal Danke für deine Hilfe - ich muss mal unterbrechen - werde im Laufe des Tages deine Codes testen - melde mich dann wieder
ein müder Michael...
... ja läuft - klasse! m.T.
19.12.2005 17:29:07
michael
Hallo Josef,
klasse! funktioniert!!
Man darf nur nicht den Testdatensatz verwenden, in dem ich zur Vollständigkeitskontrolle an die Zahlen a-g anhängte. Bei alphanummerischen Werten erzeugt CDbl einen Fehler.
Vielen Dank!
Gruß
Micahel
AW: die Nadel im Heuhaufen suchen...
18.12.2005 21:23:25
MichaV
Hallo,
hier noch ein Ansatz mit weniger Code:


      
Option Explicit
Sub Suchen()
Dim sInhalt As String
Dim sABC() As String
Dim sTeilText() As String
Dim i As Integer
Open "d:\micha\excel\suchtext.txt" For Binary As #1
sInhalt = Space(LOF(1))
Get #1, , sInhalt
Close #1
'Dateiinhalt vor und nach dem "abc" aufteilen
sABC = Split(sInhalt, "abc")
'wenn "abc" nur 1x im Text auftaucht, dann besteht sABC aus 2 Datenfeldern,
'ein Feld mit dem Text vor "abc" und eins mit dem Text nach "abc"

'im 2. Feld Zeilenumbrüche löschen
sABC(1) = Replace(sABC(1), vbCrLf, "")
'dieses Feld nun wieder aufteilen, Trenner ist das "\", weil der Suchtext immer
'zwischen zwei Backslashes steht
sTeilText = Split(sABC(1), "\")
'und nun alle Felder durchsuchen, ob sie dem gesuchten Text entsprechen
For i = 0 To UBound(sTeilText)
  
If sTeilText(i) Like "G3MP2=*" Then MsgBox sTeilText(i)
Next i
End Sub 


Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: die Nadel im Heuhaufen suchen...
18.12.2005 21:43:54
MichaV
Hallo,
hab grade gelesen, was Du oben geschrieben hast. Ich quatsch mal hier weiter:
Ändere meinen Code mal bitte so, daß die Steuerzeichen gleich nach dem Einlesen umgewandelt werden:
Close #1
sInhalt = Replace(sInhalt, vbCrLf, "")
sInhalt = Replace(sInhalt, vbCr, "")
sInhalt = Replace(sInhalt, vbLf, "")
...und ist Dein Suchtext wirklich "abc"? Den hab ich in der Dati vergeblich gesucht.
Gruß- Micha
PS: Rückmeldung wäre nett.
AW: die Nadel im Heuhaufen suchen...
18.12.2005 22:21:59
michael
... da haben wir uns gerade überschnitten...
also mein suchtext ist das "Diagonal vibrational polarizability:" war mir aber zu lang in der Frage
werds gleich testen
Danke
Michael
Anzeige
Zeilenumbruch mit Tücken...
18.12.2005 22:41:58
michael
Hallo Micha,
die Idee mit dem Zeilenumbruch ist super! Nur trickst uns der Zeilenanfang aus...
Dummerweise beginnt jede Zeile mit einem Leerzeichen.
Wenn ich das Prinzip richtig verstehe entfernst du alle Zeilenumbrüche, sodass ein durchgehender Text entsteht oder entstehen würde, wenn nicht jede Zeile mit einem Leerzeichen begänne.
Ich hab mal im Beispiel nach "G3M P2=*" suchen lassen und siehe da 1 Treffer...
Könnte man diese Leerzeichen übergehen? Oder gibt es eine andere Lösung?
Danke
Michael
AW: Zeilenumbruch mit Tücken...
18.12.2005 22:50:08
MichaV
Hallo,
hm, ich hatte immer 6 Treffer... aber Du hast natürlich Recht.
Wenn am Beginn jeder Zeile ein Leerzeichen steht dann steht nach jedem Zeilenumruch ein Leerzeichen. Ändere meine 3 Ersetzen- Zeilen so:
sInhalt = Replace(Replace(sInhalt, vbLf & " ", ""), vbCr, "")
Mit vbLf & " ", "" löschst Du einen Umbruch und das darauffolgende Leerzeichen. Anschließend noch den Wagenrücklauf, falls es sich um ein Windows- Text handelt.
Nun hab ich 8 Treffer. Alles gefunden?
Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
SENSATIONELL!!!
18.12.2005 23:59:41
michael
Klasse Micha,
VIELEN Dank!
Michael
Danke für die Rückmeldung! mT
19.12.2005 00:14:21
MichaV
Hallo,
spaßenshalber hier der Code auf das Minimum reduziert:
Option Explicit Sub Suchen() Dim sInhalt As String Dim sTeilText() As String Dim i As Integer Open "d:\micha\excel\suchtext.txt" For Binary As #1 sInhalt = Space(LOF(1)) Get #1, , sInhalt Close #1 sTeilText = Split(Split(Replace(Replace(sInhalt, vbLf & " ", ""), vbCr, ""), "Diagonal vibrational polarizability")(1), "\") For i = 0 To UBound(sTeilText) If sTeilText(i) Like "G3MP2=*" Then MsgBox sTeilText(i) Next i End Sub
Gruß- Micha
AW: die Nadel im Heuhaufen suchen...
18.12.2005 22:16:19
michael
Hallo Micha,
super danke!
Das haut soweit hin - bis auf wenn der Suchbegriff durch den Zeilenumbruch getrennt wird. Gibt es dafür noch eine lösung? Ich befürchte das wird schwer, da diese Trennung nicht vorhersehbar ist... Und wenn man die Wildcard (*) zu frühsetzt (G*) findet man ziemlich viel...
Danke und viele Grüße
Michael
PS ich hab ein Bespiel in der Antwort für Josef hochgeladen
Anzeige
AW: die Nadel im Heuhaufen suchen...
18.12.2005 22:33:52
Erich
Hallo Michael,
zunächst mal ein Textfile zum Testen (noch mit "abc"):
https://www.herber.de/bbs/user/29409.txt
Michas Lösung habe ich etwas aufgebohrt - für mehrere Vorkommen von "abc" Sub Suchen() Dim sInhalt As String Dim sABC() As String Dim sTeilText() As String Dim i As Integer, jj As Integer ' Open "d:\micha\excel\suchtext.txt" For Binary As #1 Open "f:\exc\w-w-w\tmp\SuchTxt.txt" For Binary As #1 sInhalt = Space(LOF(1)) Get #1, , sInhalt Close #1 sInhalt = Replace(sInhalt, vbCrLf, "") sInhalt = Replace(sInhalt, vbCr, "") sInhalt = Replace(sInhalt, vbLf, "") 'Dateiinhalt vor und nach dem "abc" aufteilen sABC = Split(sInhalt, "abc") 'ab dem 2. Feld Zeilenumbrüche löschen For jj = 1 To UBound(sABC) sABC(jj) = Replace(sABC(jj), vbCrLf, "") 'dieses Feld nun wieder aufteilen, Trenner ist das "\", weil der Suchtext immer 'zwischen zwei Backslashes steht sTeilText = Split(sABC(jj), "\") 'und nun alle Felder durchsuchen, ob sie dem gesuchten Text entsprechen For i = 0 To UBound(sTeilText) If sTeilText(i) Like "G3MP2=*" Then MsgBox sTeilText(i) Next i Next jj End Sub
Damit erhalte ich die gleichen Werte wie mit Sub Suche_spezial() Dim intFile%, Zeile1$, Zeile2$, FName$, sText1$, sText2$, sText3$ Dim nrRec&, zz&, ss%, pp%, qq% sText1 = "abc" 'Suchtext1 sText2 = "\G3MP2=" 'Suchtext2 sText3 = "\" 'Suchtext3 On Error GoTo ERRORHANDLER FName = Application.GetOpenFilename("Textl Dateien (*.txt)," & "*.txt") If FName = "Falsch" Then Exit Sub Range("A:Z").ClearContents 'Datenbereich löschen zz = 1 Cells(1, 1) = sText1 & " in Rec" Cells(1, 2) = sText2 & " in Rec" Cells(1, 3) = "gef. Wert" intFile = FreeFile(1) Open FName For Input As #intFile Do Until EOF(intFile) nrRec = nrRec + 1: Line Input #intFile, Zeile1 If InStr(Zeile1, sText1) > 0 Then zz = zz + 1: Cells(zz, 1) = nrRec Loop Close intFile zz = zz + 1 Cells(zz, 1) = nrRec Cells(zz, 2) = "(Anzahl Sätze)" Open FName For Input As #intFile nrRec = 0 zz = 2 nrRec = nrRec + 1: Line Input #intFile, Zeile1 Do Until EOF(intFile) nrRec = nrRec + 1: Line Input #intFile, Zeile2 pp = InStr(Zeile1 & Zeile2, sText2) While pp > 0 And pp <= 70 qq = InStr(pp + Len(sText2), Zeile1 & Zeile2, sText3) While Cells(zz + 1, 1) < nrRec zz = zz + 1 Wend ss = 2 While Not IsEmpty(Cells(zz, ss)) ss = ss + 2 Wend Cells(zz, ss) = nrRec - 1 Cells(zz, ss + 1) = _ Mid(Zeile1 & Zeile2, pp + Len(sText2), qq - pp - Len(sText2)) pp = InStr(qq, Zeile1 & Zeile2, sText2) Wend Zeile1 = Zeile2 Loop Close intFile Exit Sub ERRORHANDLER: Debug.Print Err.Number; Err.Description End Sub
Letztere Routine gibt auch noch die Satznummern der Fundstellen aus.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: die Nadel im Heuhaufen suchen...
18.12.2005 22:36:24
Erich
Hallo nochmal,
so sehen die Suchergebnisse bei meinem Textbeispiel aus:
 
 ABCDEFGHI
1abc in Rec\G3MP2= in Recgef. Wert      
2615-12,829751915-123,829751916-234,829751918-345,8297519
33140-456,8297519      
45463-567,8297519      
577(Anzahl Sätze)       
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
1. Code i.O, 2. steigt aus...
19.12.2005 02:52:15
michael
Hallo Erich,
danke für deine Alternative/Erweiterung
Der erste Code funktioniert, bis auf die Leerzeichen, aber dafür gibt ja von Micha eine Lösung.
Leider weiß ich zu wenig von VBA, dass ich diesen Code verstehe.
Jedenfalls kann er mit den Zeilenumbrüchen im Suchwort oder dem Wert meines Beispiels nicht arbeiten.
Bei
Cells(zz, ss + 1) = _
Mid(Zeile1 & Zeile2, pp + Len(sText2), qq - pp - Len(sText2))
steigt er im 2. Durchgang (24) aus...
Ich hänge meine txt-datei an vielleicht findest du das Problem. Vielleicht ist es auch hier das Leerzeichen an jedem Zeilenanfang?
Danke und viele Grüße
Michael
https://www.herber.de/bbs/user/29411.txt
AW: 1. Code i.O, 2. steigt aus...
19.12.2005 06:53:13
Erich
Hallo Michael,
dass der Code nicht lief, hatte zwei Ursachen:
- Leerzeichen am Zeilenanfang waren nicht bekannt
- Satzlänge in den Datenblöcken ist doch nicht konstant 70
Der folgende Code bügelt das aus, er findet das hier:
 
 AB
1Recgefunden
25Diagonal vibrational polarizability
322-231.8297519a
423-231.8297519b
525-231.8297519c
627-231.8297519d
729-231.8297519e
831-231.8297519f
933-231.8297519g
10121(Anzahl Sätze)
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  

Sub Suche_spezial2()
Dim intFile%, Zeile1$, Zeile2$, FName$, sText1$, sText2$, sText3$
Dim nrRec&, zz&, ss%, pp%, qq%
FName = "f:\exc\w-w-w\tmp\SuchText.txt"
sText1 = "Diagonal vibrational polarizability"          'Suchtext1
sText2 = "\G3MP2="      'Suchtext2
sText3 = "\"            'Suchtext3
Range("A:Z").ClearContents 'Datenbereich löschen
zz = 1
Cells(1, 1) = "Rec"
Cells(1, 2) = "gefunden"
intFile = FreeFile(1)
Open FName For Binary As #intFile
Do Until EOF(intFile)
nrRec = nrRec + 1: Line Input #intFile, Zeile1
If InStr(Zeile1, sText1) > 0 Then
zz = zz + 1
Cells(zz, 1) = nrRec
Cells(zz, 2) = sText1
End If
Loop
Close intFile
zz = zz + 1
Cells(zz, 1) = nrRec
Cells(zz, 2) = "(Anzahl Sätze)"
Open FName For Binary As #intFile
nrRec = 0
zz = 2
nrRec = nrRec + 1: Line Input #intFile, Zeile1
Do Until EOF(intFile)
nrRec = nrRec + 1: Line Input #intFile, Zeile2
Zeile2 = LTrim(Zeile2)                             ' Leerzeichen links killen
pp = InStr(Zeile1 & Zeile2, sText2)
While pp > 0 And pp <= Len(Zeile1)                 ' statt <= 70
qq = InStr(pp + Len(sText2), Zeile1 & Zeile2, sText3)
While Cells(zz + 1, 1) < nrRec
zz = zz + 1
Wend
Rows(zz + 1).Insert
zz = zz + 1
Cells(zz, 1) = nrRec - 1
Cells(zz, 2) = _
Mid(Zeile1 & Zeile2, pp + Len(sText2), qq - pp - Len(sText2))
pp = InStr(qq, Zeile1 & Zeile2, sText2)
Wend
Zeile1 = Zeile2
Loop
Close intFile
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: 1. Code i.O, 2. steigt aus...
19.12.2005 15:52:03
michael
Hallo Erich,
seltsam bei mir erscheint nach Zeile/nrRec= 123 ein Laufzeitfehler - Einlesen hinter dateiende in der Zeile
nrRec = nrRec + 1: Line Input #intFile, Zeile1
kanns nicht nachvollziehen, da ja eigentlich bis EOF gesucht werden soll.
Liegt es an
intFile = FreeFile(1)? intFile wird 256 zugeordnet.
Wir arbeiten mit dem selben textfile.
Hast du die textdatei als datei gespeichert (ZielSpeichernUnter) oder derren Inhalt per copy/paste in eine eigene *.txt eingefügt - vielleicht ist das der Unterschied?
Dürfte aber eigentlich nichts ausmachen, denn jeder File besitzt ja ein EOF.
Deine beigefügte Ergebnistabelle zeigt ja dass es bei dir alles richtig erkennt.
Hast du ne Idee?
Danke
Michael
AW: 1. Code i.O, 2. steigt aus...
19.12.2005 16:26:40
Erich
Hallo Michael,
steigt er wirklich bei nrRec = 123 in der Zeile

nrRec = nrRec + 1: Line Input #intFile, Zeile1

aus? Geht eigentlich nicht, weil Zeile1 nur ein Mal vor der DO-Schleife gelesen wird - und dabei ist nrRec = 1:

nrRec = nrRec + 1: Line Input #intFile, Zeile1
Do Until EOF(intFile)
nrRec = nrRec + 1: Line Input #intFile, Zeile2

An der Bestimmung von intFile kann es wohl auch nicht liegen. (FreeFile(1) war mal eine Empfehlung von Microsoft, um evtl. Konflikte mit Office-internen Kanälen zu vermeiden, ist aber vermutlich heute nicht mehr wichtig.)
HABS GERADE GEFUNDEN!
Wenn du die beiden Zeilen

Open FName For Binary As #intFile

durch

Open FName For Input As #intFile

ersetzt, beskommst du bei nicht existierender Textdatei die (dann direkt verständliche) Fehlermeldung "Datei nicht gefunden (Fehler 53)". Mit "Binary" wird das File neu angelegt und ist leer. Daher der Fehler in Zeile 1.
Wenn die Datei auch bei dir mit

FName = "f:\exc\w-w-w\tmp\SuchText.txt"

richtig bezeichnet ist, läuft es richtig - mit Binary oder Input.
... es gibt doch (fast) immer eine natürliche Ursache ...
Grüße von Erich aus Kamp-Lintfort
Input i.O., Binary n.i.O.
19.12.2005 18:29:00
michael
Hallo Erich,
danke für die Hilfe.
Mit Input klappt es.
Mit Binary nicht...auch keine Fehlermeldung einer nicht gefundenen Datei.
Es wird 5 und Diagonal vib....richtig erkannt und geschrieben d.h. der File ist nicht leer - oder?
Der Fehler wird bereits beim 1. Open FName... gemacht
intFile = FreeFile(1)
Open FName For Binary As #intFile
Do Until EOF(intFile)
nrRec = nrRec + 1: Line Input #intFile, Zeile1
nrRec=123, Zeile1 = "" , den Dateinamen und Pfad hab ich angepasst
nrRec=121 , Zeile1 = Normal Termination....
nrRec=122 , Zeile1 = ""
auch zwischen 6 und 120 hat Zeile1 Werte.
Noch ne Idee?
Gruß
Michael
AW: Input i.O., Binary n.i.O.
19.12.2005 19:20:25
Erich
Hallo Michael,
bei mir kann ich kein unterschiedliches Fehlerverhalten zwischen Open mit Input bzw. Binary feststellen (bei nichtleerer Textdatei).
Statt
Open FName For Binary As #intFile
sollte man eigentlich
Open FName For Binary Access Read As #intFile
schreiben - in der ersten Version ist auch Schreiben möglich, und das soll hier ja sicher nicht sein.
Open FName For Input As #intFile
ist aber sicher die richtige Weise, die Datei zu öffnen. ("Binary" ist nur dank meiner Schlamperei und durch Kopieren in die Prozedur geraten.)
Einen Grund für den Fehler habe ich nicht gefunden...
Grüße von Erich aus Kamp-Lintfort
hauptsache es funktioniert - danke!
20.12.2005 01:52:49
michael
DANKE an ALLE für die super Hilfe!
20.12.2005 01:55:22
michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige