Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

VB6 Codeschnipsel für Replacefunktion

Frage Entwicklung

Mitglied: CanTan

CanTan (Level 1) - Jetzt verbinden

17.02.2009, aktualisiert 23:39 Uhr, 3612 Aufrufe, 9 Kommentare

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. ;-(
Mitglied: Logan000
18.02.2009 um 09:21 Uhr
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:
01.
.... 
02.
EingabeDatei = "XYZ.TXT" 
03.
AusgabeDatei = "XYZ.TXT" 
04.
...
gleiche Dateinahmen?

Gruß L.
Bitte warten ..
Mitglied: bastla
18.02.2009 um 16:57 Uhr
Hallo CanTan!

Lässt sich auch kürzer abhandeln:
01.
'Variablen & Konstanten definieren 
02.
Dim fso, objEingabe, objAusgabe, objSuchen 
03.
Dim Pfad, EingabeDatei, AusgabeDatei, Zeile, FeldAlt, FeldNeu 
04.
 
05.
Private Sub Suchen_Click() 
06.
' Suchen der notwenigen Datei im Ornder wo das Tool liegt 
07.
Pfad = "\" 
08.
EingabeDatei = "XYZ.TXT" 
09.
AusgabeDatei = "XYZ.TXT" 
10.
' Der Textinhalt der gesucht und verändert werden soll 
11.
FeldAlt = "0001118888222" 
12.
FeldNeu = "0001119999222" 
13.
'also die 8888 gegen die 9999 
14.
 
15.
Const ForReading = 1, ForWriting = 2, ForAppending = 8 
16.
 
17.
'Objekt erstellen 
18.
Set fso = CreateObject("Scripting.FileSystemObject") 
19.
 
20.
If fso.FileExists(EingabeDatei) Then 
21.
    ' gesamten Dateiinhalt einlesen 
22.
    Gesamttext = fso.OpenTextFile(EingabeDatei, ForReading).ReadAll 
23.
Else 
24.
    'MsgBox "Fehler: Eingabedatei ist nicht vorhanden." 
25.
Exit Sub 
26.
End If 
27.
 
28.
' im gesamten Dateiinhalt Ersetzung vornehmen und neuen Dateiinhalt in Ausgabedatei schreiben 
29.
fso.OpenTextFile(AusgabeDatei, ForWriting, True).Write Replace(Gesamttext, FeldAlt, FeldNeu)  
30.
 
31.
Set fso = Nothing 
32.
 
33.
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.
Bitte warten ..
Mitglied: CanTan
18.02.2009 um 22:29 Uhr
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!
Bitte warten ..
Mitglied: bastla
18.02.2009 um 22:54 Uhr
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:
01.
' Eingabedatei löschen 
02.
fso.DeleteFile Pfad & EingabeDatei, True 
03.
' Ausgabedatei umbenennen durch MoveFile 
04.
fso.MoveFile Prad & AusgabeDatei, Pfad & EingabeDatei
Grüße
bastla
Bitte warten ..
Mitglied: CanTan
18.02.2009 um 23:21 Uhr
Oh Basta,
das werde ich morgen gleich probieren und hier berichten.
Wenn das geht, geb ich einen aus!

@ 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
Bitte warten ..
Mitglied: miniversum
19.02.2009 um 14:43 Uhr
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.
Bitte warten ..
Mitglied: CanTan
19.02.2009 um 19:03 Uhr
Hallo ihr treueren Helfer,

also Bastlas Code greift anfänglich.
1. natürlich muss man vorher noch den Gesamttext definieren.
01.
Dim Gesamttext As String<code/> 
02.
 
03.
2. ...und Selbstverfreilich habe ich etwas mehr Wert auf den Pfad  
04.
gelegt und genau definiert. 
05.
 
06.
<code> 
07.
     EingabeDatei = Pfad & "XYZ.TXT" 
08.
     AusgabeDatei = Pfad & "XYZ.TMP" 
09.
<code/> 
10.
 
11.
3. ...auch wird ganz supi die neue AusgabeDatei XYZ.TMP angelegt, 
12.
und der prozess des Ändern klappt auch bestens, doch leider kann,  
13.
warum auch immer, die EingabeDatei nicht gelöscht  werden und  
14.
somit fällt der ganze Code auf die Nase. Im Debugen verweist er 
15.
auf die folgende Zeile verwiesen. 
16.
 
17.
<code> 
18.
    ' Eingabedatei löschen 
19.
        fso.DeleteFile Pfad & EingabeDatei, True 
20.
<code/> 
21.
 
22.
--> Laufzeitfehler 52 
23.
--> Dateiname oder -nummer falsch° 
24.
 
25.
Es gibt also ein Problem mir dem löschen?? 
26.
Danach liegen die TXT und die TMP im Verzeichnis. 
27.
 
28.
4. ... ein Test mit  
29.
<code> 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
Bitte warten ..
Mitglied: bastla
19.02.2009 um 19:46 Uhr
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
Bitte warten ..
Mitglied: CanTan
19.02.2009 um 20:38 Uhr
Hallo bastla,
ich habe es mit deinem letzten tipp ebenfalls versucht, doch leider ohne erfolg.
wieder der gleiche fehler.

01.
' Eingabedatei löschen 
02.
        fso.DeleteFile Pfad & EingabeDatei, True 
03.
 
04.
' oder auch mal getestet 
05.
        Kill (Pfad & EingabeDatei) 
06.
 
07.
' sowie auch getestet - Ausgabedatei umbenennen durch MoveFile 
08.
        fso.MoveFile Pfad & AusgabeDatei, Pfad & EingabeDatei 
09.
 
10.
' und natürlich  habe ich auch deinen letzten tip probiert 
11.
       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:

01.
' Suchen der notwenigen Datei im Ordner 
02.
        Pfad = "C:\ABC\123\" 
03.
            EingabeDatei = Pfad & "XYZ.LDT" 
04.
            AusgabeDatei = Pfad & "XYZ.TMP" 
05.
 
06.
' Der Textinhalt der gesucht und verändert werden soll 
07.
            FeldAlt = "8888" 
08.
        FeldNeu = "9999" 
09.
     
10.
    Const ForReading = 1, ForWriting = 2, ForAppending = 8 
11.
 
12.
    'Objekt erstellen 
13.
        Set fso = CreateObject("Scripting.FileSystemObject") 
14.
        If fso.FileExists(EingabeDatei) Then 
15.
         
16.
        ' gesamten Dateiinhalt einlesen 
17.
        Gesamttext = fso.OpenTextFile(EingabeDatei, ForReading).ReadAll 
18.
Else 
19.
    'Meldung ist nicht ständig erwünscht, da Datei nicht unendwegt vorhanden 
20.
    'MsgBox "Fehler: Eingabedatei ist nicht vorhanden." 
21.
 
22.
Exit Sub 
23.
 
24.
End If 
25.
 
26.
    ' im gesamten Dateiinhalt Ersetzung vornehmen und neuen Dateiinhalt in Ausgabedatei schreiben 
27.
        fso.OpenTextFile(AusgabeDatei, ForWriting, True).Write Replace(Gesamttext, FeldAlt, FeldNeu) 
28.
 
29.
    'ob noch notwenige weiß ich nicht aber schaden tuts nicht 
30.
        fso.OpenTextFile(EingabeDatei, ForWriting, True).Write Replace(Gesamttext, FeldAlt, FeldNeu) 
31.
 
32.
  'das "neue" löschen, was jetzt geht, warum auch immer, nach 1000 versuchen  
33.
    ' Eingabedatei löschen 
34.
            fso.DeleteFile EingabeDatei, True 
35.
             
36.
    ' Ausgabedatei umbenennen durch MoveFile 
37.
            fso.MoveFile AusgabeDatei, EingabeDatei 
38.
 
39.
 
40.
Set fso = Nothing 
41.
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
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (19)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (19)

Frage von patz223 zum Thema Windows Userverwaltung ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (15)

Link von Penny.Cilin zum Thema Viren und Trojaner ...