PDA

Vollständige Version anzeigen : File-Handling


Ibo
08.08.2001, 09:31
Hallo zusammen,

ich bin ein Neuling in diesem Bereich (VB) und habe eine Frage:

In meinem Projekt lese ich den Inhalt eines Verzeichnisses aus und speichere diesen zur Weiterverarbeitung in eine Textdatei (dir.log). Eine andere Funktion nimmt sich diese Datei und übergibt jede Zeile einzeln an eine andere Funktion, die dann darauf mit den empfangegen Daten ein Script anschmeisst.
Mein Problem ist, dass ich jeden bearbeiteten Eintrag (Zeile) in der dir.log rausschmeissen möchte, um dann, falls mal unterbrochen wird, nach einem Neustart des Programmes dort wieder fortgesetzt wird, wo es abgebrochen wurde.

Ich hoffe, das war ausführlich genug. Ich bin über jede Antwort dankbar.

Grüsse
Ibo

Stefan Kulpa
09.08.2001, 11:43
<font face="Verdana" size="2">
Hallo,

vielleicht hilft Dir folgendes Beispiel weiter:</font>
<font face="Courier New" size="3"><pre>
Sub Test()

Dim sListe As String '** Pfad zur Log-Datei
Dim sItem As String '** Dateiname im Array
Dim sBuffer As String '** Hilfsvariable
Dim asBuffer() As String '** Speicher für Dateiinhalt
Dim iFile As Integer '** Handle für Dateioperation
Dim lUBound As Long '** Array-Dimension
Dim lLBound As Long '** Array-Dimension
Dim lCount As Long '** Zählervariable

'** Pfad zur Log-Datei bestimmen
sListe = "C:\Temp\Liste.txt"
'** Freie Dateinummer ermitteln
iFile = FreeFile
'** Log-Datei zum Lesen öffnen
Open sListe For Input As #iFile
'** Inhalt in ein Array einlesen
If LOF(iFile) > 0 Then
'** VB(A) 6.0 wegen Split-Funktion notwendig!
asBuffer = Split(Input(LOF(iFile), #iFile), vbCrLf)
End If
'** Datei wieder schließen
Close #iFile
'** Für jeden Eintrag im Array die Bearbeitung durchführen,
'** den Eintrag selbst entfernen und den Rest zurück in die
'** Datei schreiben.
lLBound = LBound(asBuffer)
lUBound = UBound(asBuffer)
For lCount = lLBound To lUBound
sItem = asBuffer(lCount)
If Len(sItem) > 0 Then
'** Bearbeitung der Datei aufrufen ...
'** ....
'** Eintrag im Array 'entfernen'
asBuffer(lCount) = vbNullString
'** Aus dem Rest im Array Daten zum
'** Zurückschreiben bilden
sBuffer = Join(asBuffer, vbCrLf)
'** Freie Dateinummer ermitteln
iFile = FreeFile
'** Datei zum Schreiben öffnen
Open sListe For Output As #iFile
'** Daten schreiben
Print #iFile, sBuffer
'** Datei wieder schließen
Close #iFile
End If
Next

End Sub

</pre></font>
<font face="Verdana" size="2">
In diesem Beispiel wird die Log-Datei (Pfad muss noch angepasst werden) in ein Array eingelesen.
Aus diesem Array heraus wird dann Datei für Datei bearbeitet (muss noch eingefügt werden).
Nach jeder Bearbeitung wird der Eintrag aus dem Array quasi gelöscht und der Inhalt des Arrays zurück in die Datei geschrieben. Das hat zur Folge, dass die bearbeiteten Dateien aus der Log-Datei nacheinander verschwinden.

HTH</font>

Susi
09.08.2001, 12:11
Hi Ibo,
wenn ich Dateien auszuwerten habe, arbeite ich immer mit zusätzlichen Dateien.

Ich würde alle erfolgreich ausgewerteten Zeilen aus "dir.log" in eine zweite Datei (z.B. "dirAusgewertet.txt") schreiben und bei Neustart des Programmes den Inhalt von "dir.log" mit dem Inhalt von "dirAusgewertet.log" vergleichen.

Alle nicht ausgewerteten Zeilen aus "dir.log" (also alle, die nicht sowohl in "dir.log" als auch in "dirAusgewertet.txt" enthalten sind), würde ich in eine dritte Datei schreiben.
Nach Abschluss des Vergleichs müssten dann die Dateien "dir.log" und "dirAusgewertet.txt" gelöscht und die Datei mit den Vergleichsresultaten unter "dir.log" gespeichert werden.

Das würde dann ungefähr so aussehen (der Code sieht über die Antwort-Vorschau ziemlich unformatiert aus - ich weiß leider nicht, wie ich´s anders hinkriegen soll):

Private Const m_stDateiPfad As String = "c:\"

Private Sub VglDateien()
Dim boIdentisch As Boolean
Dim inHandleDirLog As Integer
Dim inHandleDirAusgewertetTxt As Integer
Dim inHandleVglResultate As Integer
Dim stEingabe As String
Dim lgIndex As Long
Dim colAusgewerteteZeilen As Collection

If Dir(m_stDateiPfad & "dir.log") <> "" And _
Dir(m_stDateiPfad & "dirAusgewertet.txt") <> "" Then
'Vergleich nur, wenn auch was zum Vergleichen da ist

Set colAusgewerteteZeilen = New Collection

'zum schnelleren Vergleich Zeilen in einer Collection zwischenpuffern
inHandleDirAusgewertetTxt = FreeFile
Open m_stDateiPfad & "dirAusgewertet.txt" For Input As inHandleDirAusgewertetTxt
Do Until EOF(inHandleDirAusgewertetTxt)
Line Input #inHandleDirAusgewertetTxt, stEingabe
colAusgewerteteZeilen.Add stEingabe
Loop
Close #inHandleDirAusgewertetTxt


inHandleVglResultate = FreeFile
Open m_stDateiPfad & "dir1.log" For Output As inHandleVglResultate
inHandleDirLog = FreeFile
Open m_stDateiPfad & "dir.log" For Input As inHandleDirLog

'Vergleich durchführen und noch nicht ausgewertete Datensätze in "dir1.log"
'wegschreiben
Do Until EOF(inHandleDirLog)
Line Input #inHandleDirLog, stEingabe

boIdentisch = False
For lgIndex = colAusgewerteteZeilen.Count To 1 Step -1
If colAusgewerteteZeilen(lgIndex) = stEingabe Then
colAusgewerteteZeilen.Remove (lgIndex)
boIdentisch = True
Exit For
End If
Next

If boIdentisch = False Then
Print #inHandleVglResultate, stEingabe
End If
Loop

Close #inHandleVglResultate
Close #inHandleDirLog

Set colAusgewerteteZeilen = Nothing

'Löschen der verglichenen Dateien
Kill m_stDateiPfad & "dir.log"
Kill m_stDateiPfad & "dirAusgewertet.txt"
'Umbenennen der Datei mit den Vergleichsresultaten, damit diese im nächsten Schritt
'ausgewertet werden kann
Name m_stDateiPfad & "dir1.log" As m_stDateiPfad & "dir.log"
End If
End Sub


Public Sub DirLogAuswerten()
Dim inHandleDirLog As Integer
Dim inHandleDirAusgewertetTxt As Integer
Dim stEingabe As String

'noch nicht ausgewertete Zeilen ermitteln
Call VglDateien

If Dir(m_stDateiPfad & "dir.log") <> "" Then
inHandleDirAusgewertetTxt = FreeFile
Open m_stDateiPfad & "dirAusgewertet.txt" For Output As inHandleDirAusgewertetTxt
inHandleDirLog = FreeFile
Open m_stDateiPfad & "dir.log" For Input As inHandleDirLog

Do Until EOF(inHandleDirLog)
Line Input #inHandleDirLog, stEingabe

'Zeilen auswerten und erfolgreich ausgewertete Zeilen in "dirAusgewertet.txt"
'wegschreiben
If ScriptAusfuehren(stEingabe) = True Then
Print #inHandleDirAusgewertetTxt, stEingabe
Else
End If
Loop

Close #inHandleDirLog
Close #inHandleDirAusgewertetTxt
End If
End Sub

Private Function ScriptAusfuehren(ByVal stEingabe As String) As Boolean
'wenn Script erfolgreich generiert "True" zurück geben, ansonsten "False"
End Function

Ibo
14.08.2001, 08:44
Hallo Susi, Hallo Stefan,

danke für Eure Antwort. Werde es ASAP! ausprobieren. :)

Grüsse
Ibo

maryjam01
21.09.2006, 08:22
Hallo!
Ich möchte auch gerne einen String bearbeiten, bzw. eine csv. Datei in der viele Zeilen stehen (hier in einem anderen Thread (http://www.ms-office-forum.net/forum/showthread.php?t=194923) )
Kann ich dazu eventuell das hier genannte Beispiel benutzen. Es wäre schon hilfreich, wenn ich in dem imm anderen Thread genannten Beispiel die letzten 18 durch Kommata getrennten Felder an den Anfang jeder Zeile bekommen könnte! (natürlich in der Reihenfolge, wie sie hinten stehen ;) )

Hier nocheinmal die besagte Zeile:

XYZ3: VX_OPQRS1234_Sdfgdf TExt: Hier kommt ein beliebig langer Text, der nicht von """" o.ä. eingefasst ist, in diesem Satz sind Kommas und am Ende steht ein Punkt. Dannch stehen 18 Kommata, die genau die Felder trennen, die mich interessieren.,"","","F","","","","","","","","","","","","F","F","",""

Bestgruß, Mary

Stefan Kulpa
23.09.2006, 05:29
Kann ich dazu eventuell das hier genannte Beispiel benutzen.
Grundsätzlich schon.
Nur musst du dann nach dem ersten Einlesen in ein Array die Inhalte jedes Array-Elementes auf die gleiche Weise wiederum in ein Array einlesen, wobei diesmal das Komma als Seperator für die Split-Funktion benutzt wird.
Ist dann der jeweilige Datensatz im Array augeteilt, kann man beliebig auf die einzelnen Elemente zugreifen und den Satz neu zusammenstellen.
Wenn das Ergebnis wieder in die Datei zurückgeschrieben werden soll, benötigt man eine zweite, neue und leere Datei.

HTH