Forums Neueste Beiträge
 

Textdatei parsen

17/12/2009 - 13:22 von alexander.kerensky | Report spam
Hallo Gruppe,

ich muss eine Textdatei parsen die ungefàhr folgenden Aufbau hat:

@A@Text@E@
@A@@B@Text@E@
@A@@D@@G@Text@E@

Der Text soll spàter in eine Tabelle einsortiert werden. Anhand des
Buchstabens zwischen den @-Zeichen wird bestimmt, wo genau in der
Tabelle der Text stehen soll. Das "@E@" markiert immer das Ende der
Zeile. Zwischen den Zeilen kann auch mal eine Leerzeile kommen.
Da die Textdatei sehr gross sein kann, kommt es vor allem darauf an,
dass die gewàhlte Methode sehr schnell arbeitet.
Ich zerbrech mir gerade den Kopf darüber, wie ich das Problem am
besten angehe. Kann mir jemand ein paar "Best Practice" Tipps geben
oder sogar Beispielcode liefern?
 

Lesen sie die antworten

#1 Wolfram Jahn
17/12/2009 - 22:05 | Warnen spam
schrieb:
Hallo Gruppe,

ich muss eine Textdatei parsen
[...]
Kann mir jemand ein paar "Best Practice" Tipps geben
oder sogar Beispielcode liefern?



Was heißt "Sehr groß"? So lange es in den Speicher passt, ist

set fso = createobject("Scripting.FileSystemObject")
aZeilen = split(fso.OpenTextFile("FileName").readall,vbcrlf)

schnell. Bei mehr als '1GB' sollte man aber vielleicht doch zeilenweise
verarbeiten:

' Open the file for input
set fso = createobject("Scripting.FileSystemObject")
Set MyFile = fso.OpenTextFile(FileName, ForReading)

' Read from the file
Do While MyFile.AtEndOfStream <> True
TextLine = MyFile.ReadLine
machWasMit TextLine
Loop
MyFile.Close


Den richtigen Wert für '1GB' auf Deinem System musst Du durch probieren
herausfinden.

Wenn Du die Zeilen hast, dann verarbeitest Du sie mit
im Array-Fall:

for i = 0 to ubound(aZeilen)
machWasMit aZeilen(i)
next i


Beim Parsen hilft ebenfalls oft die Split Funktion.
Falls hinter @E@ noch was stehen kann, was weggeworfen werden muss:

sub machWasMit (psZ)
dim lsZ, asZ, lsTxt, llUb, i

if "" & psZ = "" then exit sub

lsZ = psZ
lsZ = split(lsZ,"@E@",2)(0)

Falls @A@ und alles davor wegzuwerfen ist, weill das die Anfangsmarke ist:

lsZ = split(lsZ & "@A@", "@A@")(1)

(Wenn Deine Eingabedatei ordentlich und sauber ist, ohne Zeug vor oder
hinter den @A@ und @E@, kannst Du die natürlich auch nur wegreplacen:)

lsZ = replace(replace(lsZ,"@E@",""),"@A@","")

jetzt ist noch etwas übrig wie "@" oder "@D@@"
da würde ich mit

lsZ = mid(replace(lsZ,"@@",""),2)

ein besser verarbeitbares "" oder "@Text" draus machen und dann mit

asZ = split(lsZ,"@")
llUb = Ubound(asZ)
lsTxt = asZ(llUb)
for i = 0 to llUb - 1
select case asZ(i)
case "D"
behandleOptionD
case "G"
behandleOptionG
case else
behandleSonstwas
end select
next i

behandleText


die Optionen und dann den Text verarbeiten.

Vorher hast Du die natürlich die Tabelle in Word definiert, bei einer
neuen nicht leeren Zeile musst Du eine Tabellenzeile hinzufügen, in den
Optionshandlern kannst Du die Selection in eine Zelle stellen und bei
der Textbehandlung den Text einfügen und gegebenfalls formatieren.



Habe ich Deine Frage richtig verstanden?


Wolfram

Ähnliche fragen