PDA

Vollständige Version anzeigen : Daten aus Textdatei lesen


stine1
20.01.2005, 08:05
Hallo,
Ich hab schon wieder ein nerviges Projekt auf der Arbeit zu erledigen:
Es gibt zwei Textdateien, in denen Daten in Tabellenform stehen. Ich soll nun aus jeder Textdatei bestimmte Daten auslesen und zusammen in einer dritten neu abspeichern.
Mein Problem ist ein ziemlich hartnäckiger Laufzeitfehler 91. Ich markiere ihn rot:

Option Explicit

Sub Zusammen()
'
' Zusammen Makro
' Makro am 18.01.2005 von metaframe aufgezeichnet
'
Dim I As Integer
Dim oFSO As Object
Dim oFile As Object
Dim txtLine As Object
Dim sLines() As String
Dim plu As String
Dim bez As String
Dim wg As String
Dim euro As Integer
Dim cent As Integer
Dim ean As String
Dim ReadLine As Object





Open "M:\PFLEGE.txt" For Input As #1
Set oFSO = CreateObject("Scripting.FileSystemObject")
'soll den Text als String einlesen
For I = 1 To 5000 '5000 Zeilen
sLines = Split(oFile.ReadAll, vbCrLf)
txtLine.Text = ReadLine("M:\PFLEGE.txt", I)
plu = Mid(sLines, 3, [6])
bez = Mid(sLines, 9, [30])
wg = Mid(sLines, 39, [40])
euro = Mid(sLines, 42, [46])
cent = Mid(sLines, 48, [49])
'liest benötigte Tabellendaten aus der Textdatei wie z.b. plu-nummer und bez(eichnung)

Next I



Open "M:\EAN.prn" For Input As #2
Set oFSO = CreateObject("Scripting.FileSystemObject")
For I = 1 To 5000
sLines = Split(oFile.ReadAll, vbCrLf)
txtLine.Text = ReadLine("EAN.prn", I)
ean = Mid(sLines, 30, [39])
'liest die zusätzlich benötigten daten aus der zweiten datei
Next I


Open "M:\ausgabe.txt" For Input As #3
Print #3, ean
Print #3, Spc(5)
Print #3, bez
Print #3, Spc(5)
Print #3, wg
Print #3, euro; ","; cent
'sollte die daten aus 1 und 2 mit jeweils 5 leerzeichen abstand in 3 schreiben


Close "M:\PFLEGE.txt"
Close "M:\EAN.prn"
Close "M:\ausgabe.txt"
'schließen



End Sub

Lumpensammler
20.01.2005, 11:32
Hallo, Stine,

wo wird denn oFile ein Wert zugewiesen?

Gruß
LS

sturzi
20.01.2005, 15:03
hallo stine1

Mir ist leider nur ein anderer Fehler aufgefallen Du benützt 3 x For Input ... Für Ausgaben gibt es z.B for output.

Ps. ich gebe zu dass ich das CreateObject("Scripting.FileSystemObject") nie benütze. Bei mir reicht schon oft ein line Input

Gruss

sturzi
20.01.2005, 16:36
hallo Stine1

falls Du es ohne dises Objekt machen willst...


<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Sub</span> Zusammen()
<span class="REM">'</span>
<span class="REM">' Zusammen Makro</span>
<span class="REM">' Makro am 18.01.2005 von metaframe aufgezeichnet</span>
<span class="REM">' von Sturzi etwas abge&auml;ndert 20.01.05</span>
<span class="REM">'</span>
<span class="TOKEN">Dim</span> I <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> plu <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> bez <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> wg <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> euro <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> cent <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> ean <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> temp <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
&nbsp;
&nbsp;
<span class="TOKEN">Open</span> &quot;M:\PFLEGE.txt&quot; <span class="TOKEN">For</span> <span class="TOKEN">Input</span> <span class="TOKEN">As</span> #1
<span class="TOKEN">Open</span> &quot;M:\EAN.prn&quot; <span class="TOKEN">For</span> <span class="TOKEN">Input</span> <span class="TOKEN">As</span> #2
<span class="TOKEN">Open</span> &quot;M:\ausgabe.txt&quot; <span class="TOKEN">For</span> <span class="TOKEN">Output</span> <span class="TOKEN">As</span> #3
&nbsp;
<span class="TOKEN">Do</span> <span class="TOKEN">While</span> <span class="TOKEN">Not</span> EOF(1)
<span class="TOKEN">Line</span> <span class="TOKEN">Input</span> #1, temp
plu = Mid(temp, 3, 6)
bez = Mid(temp, 9, 30)
wg = Mid(temp, 39, 40)
euro = Mid(temp, 42, 46)
cent = Mid(temp, 48, 49)
<span class="TOKEN">Line</span> <span class="TOKEN">Input</span> #2, temp
ean = Mid(temp, 30, 39)
<span class="TOKEN">Print</span> #3, ean &amp; <span class="TOKEN">String</span>(5, &quot; &quot;) &amp; bez &amp; <span class="TOKEN">String</span>(5, &quot; &quot;) &amp; wg &amp; euro &amp; &quot;,&quot; &amp; cent
<span class="TOKEN">Loop</span>
&nbsp;
<span class="TOKEN">Close</span> #1
<span class="TOKEN">Close</span> #2
<span class="TOKEN">Close</span> #3
&nbsp;
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Gruss Sturzi

(leider nicht getestet...)

stine1
21.01.2005, 07:23
Danke für die Hilfe.
Leider kommt hier die Meldung, dass die Typen unverträglich sind:

euro = Mid(temp, 42, 46)

Unimatrix Zero
21.01.2005, 08:27
Hallo Stine1,

Typen unverträglich kann ja jetzt nur heißen, daß 'Mid(temp, 42, 46)' kein Integer als Ergebnis hat.
Kannst Du denn nicht einfach mal kurz zwei Textfiles mit Beispieldaten hochladen, dann kann man Dir auch helfen.
Wobei Lumpensammler eigtl. in dem ersten Code von Dir schon die Lösung gepostet hat. Du verwendest die Microsoft Scripting Runtime Object Library und
declarierst oFile, dann mußt Du auch oFile mit der Set-Anweisung festlegen.

stine1
21.01.2005, 09:15
Ok, ich hab wieder mal nur die Hälfte verstanden *g*
Hier mal Beispiele für die Textdateien:

Nummer1:

( 1) Tasse Kaffee F 3 (10) 1.70 1.47

1 = plu
Tasse Kafee = bez
1.70 = Preis, also: 1 = euro und 70 = cent

Nummer2:

1 Tasse Kaffee 26356

26356 = ean

Unimatrix Zero
21.01.2005, 10:10
Hallo Stine1,

alles klar, ich schau es mir an, bin gerade in der Arbeit.

stine1
21.01.2005, 10:30
Danke!
Hier nochmal mein aktuellster Code. Da sit aber auch der Wurm drin, weil nur Müll rauskommt:
26356 ikel E(10U ,
ikel E(10U ,

Sub Zusammen()
'
' Zusammen Makro
' Makro am 18.01.2005 von PSMZC aufgezeichnet
'
Dim plu As String
Dim bez As String
Dim wg As String
Dim eur As String
Dim cent As String
Dim ean As String
Dim temp As String



Open "M:\PFLEGE.txt" For Input As #1
Open "M:\EAN.prn" For Input As #2
Open "M:\ausgabe.txt" For Output As #3

Do While Not EOF(1)
Line Input #1, temp
plu = Mid(temp, 3, 4)
bez = Mid(temp, 9, 20)
wg = Mid(temp, 39, 2)
eur = Mid(temp, 45, 2)
cent = Mid(temp, 48, 2)
Loop
Do While Not EOF(2)
Line Input #2, temp
ean = Mid(temp, 30, 5)
Print #3, ean; Spc(5); bez; Spc(5); wg; Spc(5); euro; ","; cent
Loop

Close #1
Close #2
Close #3


End Sub

sturzi
21.01.2005, 17:23
Hallo Stine

Dein erstes While weist Du mit Mid(xx,xx) irgendwelche Variablen zu, die gleich wieder gelöscht werden???. Sicherlich musst du während der gleichen Schlaufe die ersten beiden Dateien einlesen und ausgeben sonst bekommst Du sicherlich Müll raus...


so sollte es sein:
While
Datei 1 einlesen
Datei 2 einlesen
Datei 3 schreiben
wend

Ach ja. Unimatrix hat es ja schon erwähnt: Falls Du mal die zwei Dateien hochlädst (vielleicht je 20 Zeilen, kannst ja den Editor benützen) könnten wir Dir sicherlich besser helfen. Es könnte ja sein, dass diese Datei im Binari abgespeichert ist.....




Gruss
Sturzi

Unimatrix Zero
21.01.2005, 18:24
Hallo Stine1,

ohne ein Beispiel-Textfile kann ich jetzt nur vermuten was u.a. falsch läuft.
Ich nehme jetzt mal an, das die Texte 'Tab-Separated' sind und Du deswegen zu
dieser merkwürdigen Textausgabe kommst.
Ich lade jetzt hier mal die zwei Beispiel-Textfiles hoch mit denen ich folgenden Code getetstet habe:

Option Explicit

Sub Zusammen()
Dim ofso As FileSystemObject
Dim ofile1 As TextStream
Dim ofile2 As TextStream
Dim ofile3 As TextStream
Dim slines1() As String
Dim slines2() As String
Dim i&, lpos&
Dim plu$, bez$, wg$, eur$, cent$, ean$

Set ofso = New FileSystemObject
'Pfad muß angepasst werden!
Set ofile1 = ofso.OpenTextFile("C:\Text1.txt")
Set ofile2 = ofso.OpenTextFile("C:\Text2.txt")
'Ausgabe.txt wird hier erzeugt!
'Mußt Du evtl. bei Dir anpassen
Set ofile3 = ofso.OpenTextFile("C:\Dokumente und Einstellungen\Unimatrix Zero\Desktop\Ausgabe.txt", ForWriting, True)
Do While Not ofile1.AtEndOfStream
slines1 = Split(ofile1.ReadLine, vbTab)
plu = slines1(0)
bez = slines1(1)
wg = slines1(2)
lpos = InStr(slines1(4), ".")
eur = Left(slines1(4), lpos - 1)
cent = Right(slines1(4), Len(slines1(4)) - lpos)
'Achtung, funktioniert nur so, wenn die Zeilen der zwei Textfiles übereinstimmen
'ansonsten müßte man hier noch eine Suchfunktion einbauen!
slines2 = Split(ofile2.ReadLine, vbTab)
ean = slines2(2)
ofile3.WriteLine (ean & vbTab & bez & vbTab & wg & vbTab & eur & vbTab & cent)
Loop
ofile1.Close
ofile2.Close
ofile3.Close
Set ofile1 = Nothing
Set ofile2 = Nothing
Set ofile3 = Nothing
Set ofso = Nothing
End Sub

stine1
24.01.2005, 07:31
Hallo, Ich werde jetzt mal versuchen, Beispieldateien hochzuladen....

stine1
24.01.2005, 12:00
Ich nochmal *g*
Also, wenn ich bezüglich der Zeilen eine Schleife einbauen will, wie mache ich das? So, dass jede Zeile für sich nacheinander abgefragt wird?

For I = 1 to "EndofFile" ' was nehm ich da anstatt EndofFile?
Und dann eben so weiter, dass I immer um eins erhöht wird und die nächste Zeile ausgelesen werden kann...

stine1
24.01.2005, 14:06
Sorry, dass ich schon wieder poste, aber ich hab nicht gefunden, wie ich meinen vorherigen Post editieren kann :-(

Ich kann Entwarnung geben. Ich habe eine Lösung gefunden. Ein Arbeitskollege hat sich die Haare gerauft und es gerichtet. Wirtschaftsinformatiker ;-)

Hier die Lösung:

Sub Zusammen()
'
' Zusammen Makro
' Makro am 18.01.2005 von PSMZC aufgezeichnet
'
Dim plu As String
Dim bez As String
Dim wg As String
Dim eur As String
Dim cent As String
Dim ean As String
Dim temp As String


Open "M:\Aufgabe\2\Versuch\PFLEGE.txt" For Input As #1
Open "M:\Aufgabe\2\Versuch\EAN.prn" For Input As #2
Open "M:\Aufgabe\2\Versuch\ausgabe.txt" For Output As #3



' öffnet die vorhandenen Dateien und erstellt die Ausgabe-Datei



Do While Not EOF(1) And Not EOF(2) ' Schleife bis zum Ende der Datei

Line Input #1, temp
plu = Mid(temp, 4, 4) ' PLU-Nummer

bez = Mid(temp, 9, 20) ' Artikelbezeichnung

wg = Mid(temp, 39, 2) ' Warengruppe

eur = Mid(temp, 42, 5) ' Eurobetrag

cent = Mid(temp, 48, 2) ' Centbetrag

Line Input #2, temp

ean = Mid(temp, 30, 5) ' EAN-Nummer

'Alternativ:
'If ean <> "" and bez <> "" Then
'Das würde neben den leeren Zeilen auch EANs auslassen zu denen es keine Produktbezeichnung gibt.
If ean <> "" Then
Print #3, ean; Spc(3); bez; Spc(3); wg; Spc(3); eur; ","; cent
End If
' schreibt die Werte in die Ausgabedatei inklusive Komma für den Preis und Leerschritte zwischen den Werten

Loop

Close #1
Close #2
Close #3
' Schließt alle Dateien


End Sub