PDA

Vollständige Version anzeigen : Import *.txt


Neils Shoobridge
20.01.2003, 16:18
Hallo Zusammen,

ein Server stellt alle 15min eine TXT mit folgendem Inhalt
in ein bestimmtes Verzeichniss:

Q-Max,0,20030107,11:30
Q-Max,1,20030107,11:30,0001,0352,0349,00065
Q-Max,1,20030107,11:30,0002,0009,0009,00004
Q-Max,9,20030107,11:30

Es handelt sich um Anrufe pro 15min

Ich möchte nun die Zweite Zeile in eine Tabelle wie folgt aufnehmen:

Datum______Uhrzeit______Offered_____Anwered
07.01.2003__11:30_______352________349

Hat jemand eine Idee ?


Danke und Gruss,
Neils

Aquarii
20.01.2003, 17:19
Hallo Neils,

das ist ein recht umfangreiches Unterfangen, so daß ich vorschlagen würde, daß wir versuchen sollten, dies hier in diesem Forum schrittweise zu lösen.

1. Schritt Textdatei einlesen

Hier mal ein Beispiel mit C:\Test.txt

Public Function Testtxtlesen()
Dim Dateiname As String
Dim Temp
dateiname = "C:\test.txt"
Open dateiname For Input As #1

Do While Not EOF(1) 'Schleife bis Dateiende.
Line Input #1, temp 'Dieser Befehl liest die Zeile
' ... beliebige Anweisungen, z.B.
MsgBox (Temp)
Loop
Close #1 ' Datei schließen

End Function

Die Schleife durchläuft jede Zeile der Textdatei. Du kannst also etwa einen Zähler mitlaufen lassen, um immer die zweite Zeile zu erhalten.

Fragen:

Handelt es sich immer um genau die 2. Zeile, die Du einlesen willst?
Kann diese per Zeilenumbruch eventuell auch länger sein und in die dritte Zeile reichen?

Weitere Schritte werden zwangsläufig folgen ;)

Neils Shoobridge
20.01.2003, 19:34
Hi,

danke für Deine schnelle Antwort ;-))

Zu Frage 1:
Es ist immer die zweite Zeile.

Zu Frage2:
Nein, die Zeile wird immer die selbe Länge aufweisen und
wird nicht in die 3. Zeile reichen.

Auch sind die einzelnen Werte immer duch ein Komma getrennt.

Wäre klasse wenn es funktionieren würde :angel:

Danke & Gruss,
Neils

Aquarii
20.01.2003, 20:02
Hallo Neils,

hier also die ersten Ergebnisse:

Zum einen die Funktion, die die Textdatei einliest und die zweite Zeile in der Variablen Temp speichert. Diese wird dann an die Funktion StringAufteilen übergeben, die anhand des Kommas die Zeile in die einzelnen Werte aufteilt. (Hier noch mit Debug zur Ausgabe in Direktfenster).


<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Public Function</span> TestTxtLesen()
<span class="TOKEN">Dim</span> Dateiname <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> intI <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> temp
Dateiname = &quot;C:\Temp\test.txt&quot;
intI = 0
<span class="TOKEN">Open</span> Dateiname <span class="TOKEN">For</span> <span class="TOKEN">Input</span> <span class="TOKEN">As</span> #1
&nbsp;
<span class="TOKEN">Do</span> <span class="TOKEN">While</span> <span class="TOKEN">Not</span> EOF(1) <span class="REM">'Schleife bis Dateiende.</span>
<span class="TOKEN">Line</span> <span class="TOKEN">Input</span> #1, temp <span class="REM">'Dieser Befehl liest die Zeile</span>
intI = intI + 1
<span class="REM"> ' ... beliebige Anweisungen, z.B.</span>
MsgBox (temp)
<span class="TOKEN">If</span> intI = 2 <span class="TOKEN">Then</span> <span class="TOKEN">Exit Do</span>
<span class="TOKEN">Loop</span>
<span class="TOKEN">Close</span> #1 <span class="REM">' Datei schlie&szlig;en</span>
fktStringAufteilen (temp)
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
&nbsp;
&nbsp;
&nbsp;
<span class="TOKEN">Function</span> fktStringAufteilen(strTemp <span class="TOKEN">As</span> <span class="TOKEN">String</span>)
<span class="TOKEN">Dim</span> strZeile() <span class="TOKEN">As</span> String, i <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
strZeile = Split(strTemp, &quot;,&quot;)
<span class="TOKEN">For</span> i = <span class="TOKEN">LBound</span>(strZeile) <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(strZeile)
<span class="TOKEN">Debug.Print</span> strZeile(i)
<span class="TOKEN">Next</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
&nbsp;</pre></div>

Weitere Frage:

Welche Textteile aus der Zeile 2 genau benötigst Du? Nur den 3. (Datum), den 4. Uhrzeit, den 6 (Offered) und 7.(Anwered)? Oder noch weitere?

Aquarii
20.01.2003, 20:57
Hallo Neils,

habe nach obiger Vorgabe mal die Funktionen fertiggestellt:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Function</span> fktStringAufteilen(strTemp <span class="TOKEN">As</span> <span class="TOKEN">String</span>)
<span class="TOKEN">Dim</span> db <span class="TOKEN">As</span> DAO.Database
<span class="TOKEN">Dim</span> rst <span class="TOKEN">As</span> DAO.Recordset
<span class="TOKEN">Dim</span> strTeil() <span class="TOKEN">As</span> String, i <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> strTextTeil(3) <span class="TOKEN">As</span> <span class="TOKEN">String</span> <span class="REM">'Array mit vier Feldern (0-3)</span>
&nbsp;
<span class="TOKEN">Set</span> db = CurrentDb()
<span class="TOKEN">Set</span> rst = db.OpenRecordset(&quot;TextDatei&quot;)
&nbsp;
strTeil = Split(strTemp, &quot;,&quot;)
<span class="TOKEN">For</span> i = <span class="TOKEN">LBound</span>(strTeil) <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(strTeil)
<span class="TOKEN">Debug.Print</span> strTeil(i)
Select Case i
Case 2
strTeil(i) = fktDatumUmwandeln(strTeil(i))
strTextTeil(0) = strTeil(i) <span class="REM">'Array f&uuml;llen</span>
Case 3
strTextTeil(1) = strTeil(i) <span class="REM">'Array f&uuml;llen</span>
Case 5
strTextTeil(2) = strTeil(i) <span class="REM">'Array f&uuml;llen</span>
Case 6
strTextTeil(3) = strTeil(i) <span class="REM">'Array f&uuml;llen</span>
<span class="TOKEN">End</span> Select
<span class="TOKEN">Next</span>
rst.AddNew
rst!Datum = strTextTeil(0)
rst!Uhrzeit = strTextTeil(1)
rst!Offered = strTextTeil(2)
rst!Anwered = strTextTeil(3)
rst.Update
rst.Close
db.Close
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
&nbsp;
<span class="TOKEN">Function</span> fktDatumUmwandeln(StrDatum <span class="TOKEN">As</span> <span class="TOKEN">String</span>) <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> strTeil1, strTeil2, strTeil3, StrDatumNeu <span class="TOKEN">As</span> <span class="TOKEN">String</span>
strTeil1 = Left(StrDatum, 4)
strTeil2 = Mid(StrDatum, 5, 2)
strTeil3 = Right(StrDatum, 2)
StrDatumNeu = strTeil2 &amp; &quot;.&quot; &amp; strTeil3 &amp; &quot;.&quot; &amp; strTeil1
fktDatumUmwandeln = StrDatumNeu
<span class="TOKEN">End</span> <span class="TOKEN">Function</span></pre></div>


Anzumerken ist:

Der Name der Tabelle, in die geschrieben wird ist "TextDatei",
die einzelnen Felder sind gemäß der beigefügten Grafik benannt.

Achte darauf, daß du unter EXTRAS/VErweise einen Verweis auf die Microsoft DAO Biblithek setzt und dieser Verweis oberhalb des Verweises auf die ADO-Bibliothek ist (mittels der Pfeiltasten).

Die Funtkion fktStringAufteilen teilt die eingelesene Zeile in die einzelnen, duch Kommata getrennten Teile auf und speichert diese in ein Array.
Das Datum wird zuvor noch mittels der Funktion fktDatumUmwandeln in die "richtige Form gebracht".
Danach werden die Arraywerte in die Tabelle geschrieben.

Neils Shoobridge
21.01.2003, 14:13
Super Danke Dir..... !!!

Nur noch ein kleines Problem:

Nach prüfung der Variablenwerte habe ich festgestellt, daß
er die erste Zeile in der Variablen Temp hinterlegt.

Geht er nun aufgrund der for-Schleife in die zweite Zeile
hat die variable Temp den Wert "".

Gehe ich nun in das Textfile manuell auf die erste Zeile
und ziehe die zweite Zeile hoch (delete) und schiebe
Sie wieder eine Zeile nach unten (enter) dann geht´s.

Hast Du eine Idee ???

Aquarii
21.01.2003, 16:22
Hallo Neils,

es tut mir leid, aber ich habe nicht verstanden, was Du meinst.
Ich habe mir auch eine Textdatei angelegt, die exakt Deiner von Deinem ersten Posting entspricht:

Q-Max,0,20030107,11:30
Q-Max,1,20030107,11:30,0001,0352,0349,00065
Q-Max,1,20030107,11:30,0002,0009,0009,00004
Q-Max,9,20030107,11:30

Der Code durchläuft bei mir die Schleife und liest bei jedem Durchgang zeilenweise die obige Textdatei ein. Das heißt im ersten Schleifendurchgang befindet sich Zeile 1 in der Variablen Temp, beim zweiten Durchgang eben Zeile 2. Dann verläßt er die Schleife und verarbeitet die Zeile 2. Soweit bei mir.

Wenn ich Dich richtig verstanden habe, ist beim zweiten Durchlauf die Variable Temp leer? Sei so lieb und maile mir doch einfach mal so eine Textdatei. Vielleicht sind noch irgendwelche Steuerzeichen enthalten, die es zu eliminieren gilt. Die E-Mail-Adresse erhältst du, wenn du auf meinen Nicknamen klickst.

Neils Shoobridge
21.01.2003, 17:55
So ... ich habs nun hingekriegt.

Frag mich nicht wieso aber bei folgenden Durchläufe
weist die Variable Temp die diese Werte auf:

Durchlauf 1: Variable Temp = 1.Zeile Textdatei
Durchlauf 2: Variable Temp = ""
Durchlauf 1: Variable Temp = 2.Zeile Textdatei
Durchlauf 1: Variable Temp = ""
usw.
:eek:

Kann ich mir leider auch nicht erklären, aber so geht es....

Ich möchte Dir nochmal herzlich für Deine Bemühungen danken, hat
mir sehr geholfen... :)

Gruss,
Neils :angel: