cantan
Goto Top

VB6 Codeschnipsel für Replacefunktion

nabend,
wer kann mir helfen? für fachleute wahrscheinlich ein lacher
aber ich suche schon seit stunden eine möglichkeit wie ich in einer 22kb
großen textdatei nach einer bestimmten ziffernfolge suche und diese (die
übrigens mehrfach im text vorkommt) durch eine andere zu ersetzen.
sinngemäss:
suche nach 1148888000 und ersetze diese druch 1149999000
wobei eben die 8888 durch die 9999 ersetz werden muss.

für eine ähnlich sache hatte ich mal einen wunderherlichen vbs code,
(http://www.vb-magazin.de/forums/forums/t/4020.aspx) doch dieser fühlt
sich mit meiner jetzigen aufgabe etwas überfordert, obwohl es anfänglich recht
gut los geht´, doch wie weiter?? Wer kennt sich aus! Derzeit ersetzt er nicht,
sondern löscht die Datei.

zB:
[Code]
'Variablen & Konstanten definieren
Dim fso, objEingabe, objAusgabe, objSuchen
Dim Pfad, EingabeDatei, AusgabeDatei, Zeile, FeldAlt, FeldNeu

Private Sub Suchen_Click()
' Suchen der notwenigen Datei im Ornder wo das Tool liegt
Pfad = "\"
EingabeDatei = "XYZ.TXT"
AusgabeDatei = "XYZ.TXT"
' Der Textinhalt der gesucht und verändert werden soll
FeldAlt = "0001118888222"
FeldNeu = "0001119999222"
'also die 8888 gegen die 9999

Const ForReading = 1, ForWriting = 2, ForAppending = 8

'Objekt erstellen
Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FileExists(EingabeDatei) Then
Set objEingabe = fso.OpenTextFile(EingabeDatei, ForReading)
Else
'MsgBox "Fehler: Eingabedatei ist nicht vorhanden."
Exit Sub
End If

Set objAusgabe = fso.OpenTextFile(AusgabeDatei, ForWriting, True)

Do Until objEingabe.AtEndofStream
' Zeile lesen, Feld/Zeile/Zeichen austauschen und Zeile schreiben
Zeile = objEingabe.ReadLine
objAusgabe.WriteLine Vorspann & Replace(Zeile, FeldAlt, FeldNeu)

' Loop ist die Wiederholung des ganzen ab dem Sub, wobei sich die Wartezeit dessen nach dem Timer richtet
Loop

objEingabe.Close
objAusgabe.Close

' Eingabedatei löschen
fso.DeleteFile EingabeDatei, True
' Ausgabedatei umbenennen durch MoveFile
fso.MoveFile AusgabeDatei, EingabeDatei

Set objAusgabe = Nothing
Set objEingabe = Nothing
Set fso = Nothing

End Sub[/code]

Wer kann einem VBDAU helfen. ;-(

Content-ID: 109311

Url: https://administrator.de/contentid/109311

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

Logan000
Logan000 18.02.2009 um 09:21:34 Uhr
Goto Top
Moin Moin

Zuerst möchte ich Dich mal auf die Formatierungshilfe hinweisen!
Dann sehe ich auf Anhieb keinen Fehler in dem Script.
Außer vielleicht:
....
EingabeDatei = "XYZ.TXT"  
AusgabeDatei = "XYZ.TXT"  
...
gleiche Dateinahmen?

Gruß L.
bastla
bastla 18.02.2009 um 16:57:58 Uhr
Goto Top
Hallo CanTan!

Lässt sich auch kürzer abhandeln:
'Variablen & Konstanten definieren  
Dim fso, objEingabe, objAusgabe, objSuchen
Dim Pfad, EingabeDatei, AusgabeDatei, Zeile, FeldAlt, FeldNeu

Private Sub Suchen_Click()
' Suchen der notwenigen Datei im Ornder wo das Tool liegt  
Pfad = "\"  
EingabeDatei = "XYZ.TXT"  
AusgabeDatei = "XYZ.TXT"  
' Der Textinhalt der gesucht und verändert werden soll  
FeldAlt = "0001118888222"  
FeldNeu = "0001119999222"  
'also die 8888 gegen die 9999  

Const ForReading = 1, ForWriting = 2, ForAppending = 8

'Objekt erstellen  
Set fso = CreateObject("Scripting.FileSystemObject")  

If fso.FileExists(EingabeDatei) Then
    ' gesamten Dateiinhalt einlesen  
    Gesamttext = fso.OpenTextFile(EingabeDatei, ForReading).ReadAll
Else
    'MsgBox "Fehler: Eingabedatei ist nicht vorhanden."  
Exit Sub
End If

' im gesamten Dateiinhalt Ersetzung vornehmen und neuen Dateiinhalt in Ausgabedatei schreiben  
fso.OpenTextFile(AusgabeDatei, ForWriting, True).Write Replace(Gesamttext, FeldAlt, FeldNeu) 

Set fso = Nothing

End Sub
Da ohnehin bereits der gesamte Text gelesen ist, kann beim Schreiben in die Ausgabedatei tatsächlich der gleiche Dateiname verwendet werden - dadurch wird automatisch die Eingabedatei überschrieben.

Wenn übrigens die Pfadangabe einen Sinn haben soll, müsstest Du diesen Pfad auch verwenden, etwa in der Art:
If fso.FileExists(Pfad & EingabeDatei) Then
Grüße
bastla

P.S.: Der Formatierungshilfe könntest Du entnehmen, dass für die Kennzeichnung als "Code" nicht "", sondern "<>" zu verwenden sind.
CanTan
CanTan 18.02.2009 um 22:29:33 Uhr
Goto Top
Oh L und Bastla,
der code ist auch eigentlich top, doch leider fällt er bei der jetzigen aufgabe, aus welchen grund auch immer auf die nase. Ich starte den process per timer (alles 8 sek.) und das einlesen beginnt auch schon und im moment des ersetzens der neuen datei, löscht er zwar die alte also " EingabeDatei" auch weg aber ab dann ist ruhe im schacht??? Es generiert mir nicht die neue. ICh habe auch schon versucht den timer hoch zu setzen, doch leider ohne erfolg? Bei einem kleineren projekt klappte das besten, doch hier (warum auch immer) scheinbar ähnlich, nur die ein- und ausgabedateinamen und der zu verändernde inhalt sind anders und ..... hier leigt wahrscheinlich des problems wurzel ... mehr°° Also mehr text zum durch suchen!?
Kann das sein?

ps: danke betreffs codekennzeichnung! wird mirs merken!
bastla
bastla 18.02.2009 um 22:54:48 Uhr
Goto Top
Hallo CanTan!

Zur Sicherheit vorweg nochmals der Hinweis auf die Verwendung der Pfad-Angabe, also jeweils
Pfad & EingabeDatei
bzw
Pfad & AusgabeDatei
Aktiviere auch zur Sicherheit die auskommentierte Zeile 24 wieder.
Sollte es aber tatsächlich ein Timing-Problem sein, dann bleib dabei, zunächst die Ausgabedatei (aber mit einem anderen Namen!) zu erstellen und nach dem Löschen der Eingabedatei die Ausgabedatei per "MoveFile" umzubenennen.

Dazu müsstest Du in meinem Vorschlag nur den anderen Dateinamen in Zeile 9 eintragen und ab Zeile 30 einfügen:
' Eingabedatei löschen  
fso.DeleteFile Pfad & EingabeDatei, True
' Ausgabedatei umbenennen durch MoveFile  
fso.MoveFile Prad & AusgabeDatei, Pfad & EingabeDatei
Grüße
bastla
CanTan
CanTan 18.02.2009 um 23:21:39 Uhr
Goto Top
Oh Basta,
das werde ich morgen gleich probieren und hier berichten.
Wenn das geht, geb ich einen aus! face-smile

@ an der pfad woll ich mich gar nicht groß festhalten, da ich das tool unter mehren umgebungen verwenden wollte, und somit nur die voaussetzung bestand, dass es immer da liegt, wo die zu bearbeitende datei liegt!
aber wenn ich meint, mach ich dies... null problem°

@die zeile 24 hatte ich nur zum testen on, in der praxis liegt nicht immer und ständig eine zu bearbeitende datei vor und somit kann die meldung alle 8 sek nervetötend sein .... oder, fällt mir grade so ein, ich lass die meldung im hintergrund aufgehen und nach 3 sek selbst wieder verschwinden. tat wäre ne idee. muss ich noch drüber nachdenken.

@anderen Ausgabenamen und einfügen des Codes test ich morgen .......
bin schon ganz hibbelig !!

danke, meld mich
miniversum
miniversum 19.02.2009 um 14:43:33 Uhr
Goto Top
bastlas Code müste laufen.
Der Code aus dem Eingangsposting tut auch genau das was er soll. Das problem liegt ind er Reihenfolge. Erst wird die eingangsdatei gelesen, dann in die Ausgangsdatei geschrieben, dann die Eingangsdatei gelöscht und zum Schluss die Ausgangsdatei umbenannt. Das Problem ist das die Ausgangsdatei udn die Eingangsdatei den gleichen Namen haben. Wird also die Eingangsdatei gelöscht bedeutet dies das die Ausgangsdatei gelöscht wird. Gib der Ausgangsdatei einfach eine anderennamen oder ersetzte die Zeile
AusgabeDatei = "XYZ.TXT"
durch diese
AusgabeDatei = EingabeDatei & ".tmp"
Dann geht das. Der Name der Ausgangsdatei ist völlig egal da sie zum Schluss sowieso umbennant wird wie die Eingangsdatei.
CanTan
CanTan 19.02.2009 um 19:03:35 Uhr
Goto Top
Hallo ihr treueren Helfer,

also Bastlas Code greift anfänglich.
1. natürlich muss man vorher noch den Gesamttext definieren.
Dim Gesamttext As String<code/>

2. ...und Selbstverfreilich habe ich etwas mehr Wert auf den Pfad 
gelegt und genau definiert.


     EingabeDatei = Pfad & "XYZ.TXT" 
     AusgabeDatei = Pfad & "XYZ.TMP" 
<code/>

3. ...auch wird ganz supi die neue AusgabeDatei XYZ.TMP angelegt,
und der prozess des Ändern klappt auch bestens, doch leider kann, 
warum auch immer, die EingabeDatei nicht gelöscht  werden und 
somit fällt der ganze Code auf die Nase. Im Debugen verweist er
auf die folgende Zeile verwiesen.


    ' Eingabedatei löschen 
        fso.DeleteFile Pfad & EingabeDatei, True
<code/>

--> Laufzeitfehler 52
--> Dateiname oder -nummer falsch°

Es gibt also ein Problem mir dem löschen??
Danach liegen die TXT und die TMP im Verzeichnis.

4. ... ein Test mit 
 fso.MoveFile Pfad & AusgabeDatei, Pfad & EingabeDatei 
ergab, dass es hier ebenso ein Problkem geben wird°°

Test: Habe den move string mal vor die Messagebox (von wegen Datei nicht vorhanden
gepackt) um dies schon mal zu testen und bekomme die gleiche Fehlermledung. heul°°
(natürlich habe ich vorher die org datei zum Test umbenannt)

--> Laufzeitfehler 52
--> Dateiname oder -nummer falsch°

5. .. der Debugmodus zeigt mir in VB6 im Tooltip die Pfade für Eingabe
und AusgabeDatei richtig an!!

6. ... den Timer habe ich auch mal hoch gestellt bzw. off
gleiches prob.

shit, so ein pipicode und soviel stress

ps: das mit der formatierung wird noch ..sorry face-wink
bastla
bastla 19.02.2009 um 19:46:15 Uhr
Goto Top
Hallo CanTan!

Hast Du auch versucht, mit der Ausgabedatei die Eingabedatei direkt zu überschreiben? Nach dem Einlesen wird letztere ja nicht mehr benötigt.

Dazu wären einfach Pfad und Name der Eingabedatei zu verwenden:
fso.OpenTextFile(EingabeDatei, ForWriting, True).Write Replace(Gesamttext, FeldAlt, FeldNeu)
Ansonsten: Wie entsteht denn die Eingabedatei? Sieht ja fast so aus, als würde ein anderer Prozess diese Datei (noch) geöffnet halten, was natürlich auch die eben beschriebene "Direkt"-Variante scheitern ließe ...

Grüße
bastla
CanTan
CanTan 19.02.2009 um 20:38:29 Uhr
Goto Top
Hallo bastla,
ich habe es mit deinem letzten tipp ebenfalls versucht, doch leider ohne erfolg.
wieder der gleiche fehler.

' Eingabedatei löschen  
        fso.DeleteFile Pfad & EingabeDatei, True

' oder auch mal getestet  
        Kill (Pfad & EingabeDatei)

' sowie auch getestet - Ausgabedatei umbenennen durch MoveFile  
        fso.MoveFile Pfad & AusgabeDatei, Pfad & EingabeDatei

' und natürlich  habe ich auch deinen letzten tip probiert  
       fso.OpenTextFile(EingabeDatei, ForWriting, True).Write Replace(Gesamttext, FeldAlt, FeldNeu

leider alles ohne erfolg, also hab ich nochmals etwas gesucht und gekrahmt...

und so klappts jetzt:

' Suchen der notwenigen Datei im Ordner  
        Pfad = "C:\ABC\123\"  
            EingabeDatei = Pfad & "XYZ.LDT"  
            AusgabeDatei = Pfad & "XYZ.TMP"  

' Der Textinhalt der gesucht und verändert werden soll  
            FeldAlt = "8888"  
        FeldNeu = "9999"  
    
    Const ForReading = 1, ForWriting = 2, ForAppending = 8

    'Objekt erstellen  
        Set fso = CreateObject("Scripting.FileSystemObject")  
        If fso.FileExists(EingabeDatei) Then
        
        ' gesamten Dateiinhalt einlesen  
        Gesamttext = fso.OpenTextFile(EingabeDatei, ForReading).ReadAll
Else
    'Meldung ist nicht ständig erwünscht, da Datei nicht unendwegt vorhanden  
    'MsgBox "Fehler: Eingabedatei ist nicht vorhanden."  

Exit Sub

End If

    ' im gesamten Dateiinhalt Ersetzung vornehmen und neuen Dateiinhalt in Ausgabedatei schreiben  
        fso.OpenTextFile(AusgabeDatei, ForWriting, True).Write Replace(Gesamttext, FeldAlt, FeldNeu)

    'ob noch notwenige weiß ich nicht aber schaden tuts nicht  
        fso.OpenTextFile(EingabeDatei, ForWriting, True).Write Replace(Gesamttext, FeldAlt, FeldNeu)

  'das "neue" löschen, was jetzt geht, warum auch immer, nach 1000 versuchen   
    ' Eingabedatei löschen  
            fso.DeleteFile EingabeDatei, True
            
    ' Ausgabedatei umbenennen durch MoveFile  
            fso.MoveFile AusgabeDatei, EingabeDatei


Set fso = Nothing
End Sub

vllt bin ich mal durchzweiander gekommen, beim vielen testen?
egal, jetzt gehts!
danke euch allen sehr!
wie immer, halt im adminforum
so hilft man sich gegenseitig
cantan