[VBA/Access] Doorzoeken van een grote text file

Pagina: 1
Acties:
  • 432 views sinds 30-01-2008
  • Reageer

  • MoNo79
  • Registratie: Juli 2001
  • Laatst online: 27-06 23:29
Ik heb een probleem met een stuk code. De bedoeling van de code is om te zoeken in een grote *.TXT om bepaalde dingen te zoeken. Mijn code werkt prima met de wat kleinere bestanden maar een bestand van 500 MB wil niet omdat een string niet zo groot kan worden.

Op regel 20 loopt de code fout omdat de String niet groot genoeg is.

Weet iemand een simpele oplossing, ben normaal C# gewend en zit voor de eerste keer in VBA te kloten. :p

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Sub BestandInfo(FileName As String)
  'variabelen
  Dim intFF As Long
  Dim intRegel As Long
  
  Dim aantallen As Long
  Dim intLine As Long
  
  Dim bestandNummer As String
  Dim strLine As String
  Dim result As String
  Dim locatie As String
  
  Dim varLines, e As Variant
  
  intFF = FreeFile
   
  'Zet de data van de file in de string
  Open FileName For Binary Access Read Lock Read Write As intFF
  strLine = Space(LOF(intFF))
  Get intFF, , strLine
  Close intFF
  
  varLines = Split(strLine, vbCrLf)
  'aantallen tellen hoeveel
  For Each e In varLines
    'kijk of de string "070RMet vriendelijke groet," voorkomt in de lijn, dan verhoog aantal
    intLine = InStr(1, e, "070RMet vriendelijke groet,", vbTextCompare)
    If intLine > 0 Then
       aantallen = aantallen + 1
    End If
      
    'bij regel 3 bent kopieer een substring hiervan de betreffende regel
    If intRegel = 3 Then
        locatie = Mid(e, 154, 10)
    End If
   
    'teller van de regelnummer
    intRegel = intRegel + 1
  Next
  
  
  bestandNummer = Mid(FileName, Len(FileName) - 11, 8)
  lijst = lijst + bestandNummer + ";" + locatie + ";" + Format(1, aantallen) + vbNewLine
  
 End Sub

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-07 17:21

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • sebastius
  • Registratie: September 2000
  • Laatst online: 25-07 08:56

sebastius

Laten we lekker link gaan doen

Gewoon per regel inlezen is niet mogelijk?

  • MoNo79
  • Registratie: Juli 2001
  • Laatst online: 27-06 23:29
sebastius schreef op vrijdag 26 januari 2007 @ 14:06:
Gewoon per regel inlezen is niet mogelijk?
Weet je hoe je per regel een bestand kan inlezen? Ik kan dat nergens vinden op internet.

  • lier
  • Registratie: Januari 2004
  • Laatst online: 00:13

lier

MikroTik nerd

Dat is toch gewoon met ReadLine() !?

Zie voorbeeld op Experts Exchange

Eerst het probleem, dan de oplossing


Verwijderd

inderdaad, gebruik readline of de microsoft scripting engine, de records zijn zo te zien toch met vbcrlf gescheiden. normaal gesproken kan een string 2 gigabyte bevatten en is het niet nodig de buffer op voorhand met spaties te vullen.

  • MoNo79
  • Registratie: Juli 2001
  • Laatst online: 27-06 23:29
lier schreef op vrijdag 26 januari 2007 @ 14:20:
Dat is toch gewoon met ReadLine() !?

Zie voorbeeld op Experts Exchange
Ik heb dit stukje code gezien, maar ik kan de module niet vinden om hier gebruik van te maken. Ik heb de System al toegevoegd, maar IO.StreamReader dan ik niet selecteren.

Visual Basic:
1
2
3
4
5
6
7
8
Sub test(FileName As String)
Dim fileReader As System.IO.StreamReader
fileReader = _
My.Computer.FileSystem.OpenTextFileReader(FileName)
Dim stringReader As String
stringReader = fileReader.ReadLine()
lijst = lijst + stringReader + vbNewLine
End Sub

  • lier
  • Registratie: Januari 2004
  • Laatst online: 00:13

lier

MikroTik nerd

Afgezien van het feit dat jouw code VB.NET is, is het ook nog eens vreselijk lelijk.
Maar...als je (toch) gebruik mag maken van .NET, plaats dan de using System.IO; in je code file.

En in het geval van VBA:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub RTFBodyX()
Const ForReading = 1, ForWriting = 2, ForAppending = 3

Dim fs, f
Dim RTFBody, strTo
Dim MyApp As New outlook.Application
Dim MyItem As outlook.MailItem

'DoCmd.OutputTo acOutputReport, "Report1", acFormatRTF, "C:\Docs\Report1.rtf"
DoCmd.OutputTo acOutputQuery, "Query1", acFormatRTF, "C:\Docs\Query1.rtf"
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile("C:\Docs\Query1.rtf", ForReading)
RTFBody = f.ReadAll
f.Close

Set MyItem = MyApp.CreateItem(olMailItem)
With MyItem
   .To = "me@email.com"
   .Subject = "txtSubjectLine"
   .Body = RTFBody
End With
MyItem.Display
End Sub

[ Voor 65% gewijzigd door lier op 26-01-2007 14:44 ]

Eerst het probleem, dan de oplossing


  • MoNo79
  • Registratie: Juli 2001
  • Laatst online: 27-06 23:29
lier schreef op vrijdag 26 januari 2007 @ 14:37:
Afgezien van het feit dat jouw code VB.NET is, is het ook nog eens vreselijk lelijk.
Maar...als je (toch) gebruik mag maken van .NET, plaats dan de using System.IO; in je CS file.
Nee ik maak gebruik van VBA in Access, de code kan ik niet gebruiken omdat VBA in Access de StreamReader niet kan vinden.

Zal even kijken of jou code werkt

[ Voor 4% gewijzigd door MoNo79 op 26-01-2007 14:44 ]


  • MoNo79
  • Registratie: Juli 2001
  • Laatst online: 27-06 23:29
Het integraal quoten van de een stuk code voegt weinig toe en ik zie hierboven dat je de editknop kent, gebruik hem dan ook :). Dit wordt gezien als kicken en dat is niet gewenst binnen de 24 uur. Even onderstaande regel toevoegen werkt ook ;)

Ook deze code werkt niet bij een bestand van 500MB, kleinere bestanden is echter geen probleem

[ Voor 72% gewijzigd door Lustucru op 26-01-2007 15:08 ]


  • lier
  • Registratie: Januari 2004
  • Laatst online: 00:13

lier

MikroTik nerd

En als je nou ipv ReadAll gebruik maakt van ReadLine ?
Deze natuurlijk per regel verwerken !

Eerst het probleem, dan de oplossing


  • MoNo79
  • Registratie: Juli 2001
  • Laatst online: 27-06 23:29
lier schreef op vrijdag 26 januari 2007 @ 15:00:
En als je nou ipv ReadAll gebruik maakt van ReadLine ?
Deze natuurlijk per regel verwerken !
Volgens mij gaat dat wel lukken, maar ik zou niet 123 weten hoe die loop constructie er uit moet zien.

  • lier
  • Registratie: Januari 2004
  • Laatst online: 00:13

lier

MikroTik nerd

code:
1
2
Do While Not tsInput.AtEndOfStream
  strLine = tsInput.ReadLine


Je kan gewoon in Google (dat is zo'n zoekmachine) zoeken op VBA + ReadLine. Werkt echt reuzehandig !

Eerst het probleem, dan de oplossing


  • MoNo79
  • Registratie: Juli 2001
  • Laatst online: 27-06 23:29
lier schreef op vrijdag 26 januari 2007 @ 15:20:
code:
1
2
Do While Not tsInput.AtEndOfStream
  strLine = tsInput.ReadLine


Je kan gewoon in Google (dat is zo'n zoekmachine) zoeken op VBA + ReadLine. Werkt echt reuzehandig !
Ja je was me net voor, vond het zelf redelijk lastig te vinden. Je wordt erg bedankt _/-\o_

Visual Basic:
1
2
3
4
5
6
7
Do While Not f.AtEndOfStream
       
  RTFBody = f.ReadLine
       
Loop
    
f.Close
Pagina: 1