Textdatei .txt mit .vbs auf doppelte Werte prüfen und ggf. zerlegen
Hallo Admins,
ich möchte möglichst mit vbs eine Datei namens 'Quelle.txt' zerlegen:
Sobald eine Kundennummer (8stellig, hier an Stelle 18-25) ein weiteres mal in einer Zeile vorkommt, soll die betreffende Zeile in eine neue Datei geschrieben werden und aus der Quelle.txt gelöscht werden.
Beispiel:
Vorher:
Quelle.txt:
Nach der Verarbeitung:
Ziel1.txt:
Ziel2.txt:
Da auch Sonderzeichen vorkommen können (z.B.: &) sollte es über ein *.vbs Skript laufen (und nicht über Batch).
Hat jemand eine Lösung dafür?
Vielen Dank!
ich möchte möglichst mit vbs eine Datei namens 'Quelle.txt' zerlegen:
Sobald eine Kundennummer (8stellig, hier an Stelle 18-25) ein weiteres mal in einer Zeile vorkommt, soll die betreffende Zeile in eine neue Datei geschrieben werden und aus der Quelle.txt gelöscht werden.
Beispiel:
Vorher:
Quelle.txt:
Dies ist Zeile 1 44001234 Dies ist Zeile 1
Dies ist Zeile 2 45209999 Dies ist Zeile 2
Dies ist Zeile 3 44001234 Dies ist Zeile 3
Nach der Verarbeitung:
Ziel1.txt:
Dies ist Zeile 1 44001234 Dies ist Zeile 1
Dies ist Zeile 2 45209999 Dies ist Zeile 2
Ziel2.txt:
Dies ist Zeile 3 44001234 Dies ist Zeile 3
Da auch Sonderzeichen vorkommen können (z.B.: &) sollte es über ein *.vbs Skript laufen (und nicht über Batch).
Hat jemand eine Lösung dafür?
Vielen Dank!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 216109
Url: https://administrator.de/contentid/216109
Ausgedruckt am: 22.11.2024 um 17:11 Uhr
6 Kommentare
Neuester Kommentar
Halo alfabravo,
das könntest du hiermit machen:
(In den Zeilen 1-3 noch die Pfade anpassen)
Wenn du keine zusätzliche Datei (ziel1.txt) mit den bereinigten Zeilen möchtest sondern das ganze in die Quelle zurückschreiben möchtest ist das auch kein Problem. Einfach in die Variable
Grüße Uwe
das könntest du hiermit machen:
(In den Zeilen 1-3 noch die Pfade anpassen)
strQuellPfad
~ Quelle.txtstrZielClean
~ Ziel1.txtstrZielDupes
~ Ziel2.txtConst strQuellPfad = "E:\Scripte\quelle.txt"
Const strZielClean = "E:\Scripte\ziel1.txt"
Const strZielDupes = "E:\Scripte\ziel2.txt"
Set fso = WScript.CreateObject("Scripting.Filesystemobject")
Set objQuelleRead = fso.OpenTextFile(strQuellPfad,1)
arrContent = Split(objQuelleRead.ReadAll(),vbNewLine)
objQuelleRead.Close
Set regex = New RegExp
Set objDupes = fso.OpenTextFile(strZielDupes,2,True)
For i = 0 To UBound(arrContent)
regex.Pattern = "\s\d{8}\s"
Set matches = regex.Execute(arrContent(i))
If matches.Count > 0 Then
strKDNR = matches(0)
regex.Pattern = strKDNR
For x = (i+1) To UBound(arrContent)
If regex.Test(arrContent(x)) Then
objDupes.WriteLine(arrContent(x))
arrContent(x) = ""
End If
Next
End If
Next
objDupes.Close
Set objZiel = fso.OpenTextFile(strZielClean,2,True)
For z = 0 To UBound(arrContent)
If arrContent(z) <> "" Then
objZiel.WriteLine(arrContent(z))
End If
Next
objZiel.Close
Set fso = Nothing
MsgBox "Fertig!"
strZielClean
den selben Pfad eintragen wie bei strQuellPfad
.Grüße Uwe
Moin colinardo,
das kann klappen, muss aber nicht.
Wenn durch Zufall oder Zwang in diesem FixedLen-Flatfile
-> dann wird es wacklig.
Beispiel:
Mit dieser Test-Datei kommen je nach Reihenfolge der Zeile unterschiedliche Ergebnisse.
Wenn "Zeile4" vor "Zeile5" steht-> korrektes Ergebnis im Sinne der TO.
Wenn "Zeile5" vor "Zeile4" steht-> Duplikat im Sinne TO wird nicht erkannt.
Ich denke, du musst wohl oder übel mit Substring/festen Offsets arbeiten (=Mid(arrContent[i], 18, 8) ).
Grüße
Biber
das kann klappen, muss aber nicht.
Wenn durch Zufall oder Zwang in diesem FixedLen-Flatfile
- unmittelbar vor oder nach der Kundennummer Ziffern stehen
- an anderer Stelle in der Zeile auch mal 8 oder mehr Ziffern stehen könnten
-> dann wird es wacklig.
Beispiel:
DiesistZeile1abcd44001234abcdDiesistZeile1
DiesistZeile2abc 44209999abcdDiesistZeile2
DiesistZeile3abcd44001234 bcdDiesistZeile3
DiesistZeile5abc7550012341bcdDiesistZeile5
DiesistZeile4abcx55001234 bcdDiesistZeile4
Mit dieser Test-Datei kommen je nach Reihenfolge der Zeile unterschiedliche Ergebnisse.
Wenn "Zeile4" vor "Zeile5" steht-> korrektes Ergebnis im Sinne der TO.
Wenn "Zeile5" vor "Zeile4" steht-> Duplikat im Sinne TO wird nicht erkannt.
Ich denke, du musst wohl oder übel mit Substring/festen Offsets arbeiten (=Mid(arrContent[i], 18, 8) ).
Grüße
Biber
@Biber
schon kloar, mach ich ungern aber wenn's denn sein muss 8-)
schon kloar, mach ich ungern aber wenn's denn sein muss 8-)
Const strQuellPfad = "E:\Scripte\quelle.txt"
Const strZielClean = "E:\Scripte\ziel1.txt"
Const strZielDupes = "E:\Scripte\ziel2.txt"
Set fso = WScript.CreateObject("Scripting.Filesystemobject")
Set objQuelleRead = fso.OpenTextFile(strQuellPfad,1)
arrContent = Split(objQuelleRead.ReadAll(),vbNewLine)
objQuelleRead.Close
Set regex = New RegExp
Set objDupes = fso.OpenTextFile(strZielDupes,2,True)
For i = 0 To UBound(arrContent)
regex.Pattern = "^\d{8}"
Set matches = regex.Execute(Mid(arrContent(i),18))
If matches.Count > 0 Then
strKDNR = matches(0)
regex.Pattern = strKDNR
For x = (i+1) To UBound(arrContent)
If regex.Test(Mid(arrContent(x),18)) Then
objDupes.WriteLine(arrContent(x))
arrContent(x) = ""
End If
Next
End If
Next
objDupes.Close
Set objZiel = fso.OpenTextFile(strZielClean,2,True)
For z = 0 To UBound(arrContent)
If arrContent(z) <> "" Then
objZiel.WriteLine(arrContent(z))
End If
Next
objZiel.Close
Set fso = Nothing
MsgBox "Fertig!"