Dateieigenschaften von txt-files wie Dateikodierung und darin verwendetes Trennzeichen (Tab , Komma etc) via batch-Datei auslesen und in neues textfile schreiben
Hallo,
nachdem mir hier schon mal geholfen wurde, wende ich mich mit meinen Fragen wieder mal an euch
In einem Verzeichnis stehen u.a. mehrere tausend txt-files, die automatisch erzeugt werden.
Aus unerfindlichen Gründen werden diese Dateien mal mit encoding UTF-8 , mal als ANSI geliefert.
Außerdem ändert sich auch das in den txtfiles verwendete Trennzeichen. Mal wird in den Dateien das Trennzeichen TABULATOR verwendet , mal das Trennzeichen KOMMA.
Um nun herauszufinden wieviele Txt-files in welcher Variante vorliegen, möchte ich diese Eigenschaften der Dateien gerne per batch auslesen und in eine Zieldatei schreiben.
ich bin mir nicht sicher ob ich mein Thema im richtigen Bereich eingestellt habe....
Bin für alle Vorschläge dankbar...
Grüsse Bernd
nachdem mir hier schon mal geholfen wurde, wende ich mich mit meinen Fragen wieder mal an euch
In einem Verzeichnis stehen u.a. mehrere tausend txt-files, die automatisch erzeugt werden.
Aus unerfindlichen Gründen werden diese Dateien mal mit encoding UTF-8 , mal als ANSI geliefert.
Außerdem ändert sich auch das in den txtfiles verwendete Trennzeichen. Mal wird in den Dateien das Trennzeichen TABULATOR verwendet , mal das Trennzeichen KOMMA.
Um nun herauszufinden wieviele Txt-files in welcher Variante vorliegen, möchte ich diese Eigenschaften der Dateien gerne per batch auslesen und in eine Zieldatei schreiben.
ich bin mir nicht sicher ob ich mein Thema im richtigen Bereich eingestellt habe....
Bin für alle Vorschläge dankbar...
Grüsse Bernd
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 187738
Url: https://administrator.de/forum/dateieigenschaften-von-txt-files-wie-dateikodierung-und-darin-verwendetes-trennzeichen-tab-komma-etc-via-187738.html
Ausgedruckt am: 21.04.2025 um 05:04 Uhr
19 Kommentare
Neuester Kommentar
Hallo Bernd,
irgendetwas gibt mir zu denken! Kannst du mal - wenn ich richtig mit gezählt habe - 2 Beispieltextdateien liefern - nee, eigentlich 4! - die alle Möglichkeiten aufzeigen?
Du schreibst von Textdateien. Wie sehen die aus, wenn man die öffnet? Stehen da nur Zahlenwerte drinnen? Kann ich mir nicht vorstellen, weil wenn die strickt in den besagten Formaten vorliegen, sind die Trennzeichen ja auch in entsprechenden Formaten ausgeführt.
Also, das ganze verwirrt mich etwas.
Nur mal als Beispiel: Der Buchstabe A ist im UTF-8 Format 41 und in ANSI 65.
UTF-8 41 ergibt binär 01000001 und das entspricht dezimal 65. Damit sind wir bei gleichem
Ergebnis.
Gruss
Tsuki
irgendetwas gibt mir zu denken! Kannst du mal - wenn ich richtig mit gezählt habe - 2 Beispieltextdateien liefern - nee, eigentlich 4! - die alle Möglichkeiten aufzeigen?
Du schreibst von Textdateien. Wie sehen die aus, wenn man die öffnet? Stehen da nur Zahlenwerte drinnen? Kann ich mir nicht vorstellen, weil wenn die strickt in den besagten Formaten vorliegen, sind die Trennzeichen ja auch in entsprechenden Formaten ausgeführt.
Also, das ganze verwirrt mich etwas.
Nur mal als Beispiel: Der Buchstabe A ist im UTF-8 Format 41 und in ANSI 65.
UTF-8 41 ergibt binär 01000001 und das entspricht dezimal 65. Damit sind wir bei gleichem
Ergebnis.
Gruss
Tsuki

Hallo Bernd, Hallo Tsuki!
Hier schonmal vorab der VBS-Code zum Konvertieren von UTF-8 und UTF-16-Dateien ins ANSI-Format:
@tsuki
Und den Rest darfst Du machen
Gruß Dieter
Hier schonmal vorab der VBS-Code zum Konvertieren von UTF-8 und UTF-16-Dateien ins ANSI-Format:
Option Explicit
Const CharSetIdUTF8 = "EFBBBF"
Const CharSetIdUTF16BE = "FEFF"
Const CharSetIdUTF16LE = "FFFE"
Const CharSetIdUTF32BE = "0000FEFF"
Const CharSetIdUTF32LE = "FFFE0000"
Const adTypeBinary = 1
Const adTypeText = 2
Const adSaveCreateOverWrite = 2
'Main Begin
'Call FileConvertUTFToAnsi("Dateipfad")
'Main End
Sub FileConvertUtfToAnsi(ByRef File)
Dim oFso, oBinaryStream, aBytes, sCharSetId, sCharSet, sText
Set oFso = CreateObject("Scripting.FileSystemObject")
'Die ersten 3 Bytes (Dateikennung) der Datei einlesen
With oFso.OpenTextFile(File)
sText = .Read(3)
.Close
End With
'Dateityp-Kennung
sCharSetId = Hex(Asc(Left(sText, 1))) & Hex(Asc(Mid(sText, 2, 1))) & Hex(Asc(Right(sText, 1)))
'Nur Dateityp UTF-8 und UTF-16 konvertieren
If sCharSetId = CharSetIdUTF8 Then
sCharSet = "UTF-8"
ElseIf sCharSetId = Left(CharSetIdUTF32LE, 3) Then
Exit Sub
ElseIf Left(sCharSetId, 2) = CharSetIdUTF16BE Then
sCharSet = "UTF-16"
ElseIf Left(sCharSetId, 2) = CharSetIdUTF16LE Then
sCharSet = "UTF-16"
Else
Exit Sub
End If
Set oBinaryStream = CreateObject("ADODB.Stream")
With oBinaryStream 'UTF-8/UTF-16-Datei in Byte-Array einlesen
.Type = adTypeText
.Charset = sCharSet
.Open
.LoadFromFile File
aBytes = .ReadText
.Close
End With
With oBinaryStream 'Byte-Array im Ansi-Format in Datei schreiben
.Type = adTypeText
.Charset = "x-Ansi"
.Open
.WriteText aBytes
.SaveToFile File, adSaveCreateOverWrite
.Close
End With
End Sub
@tsuki
Und den Rest darfst Du machen
Gruß Dieter
Hallo Dieter,
danke für den Code. Den werde ich mir mal abspeichern
Allerdings will der TO nichts konvertieren, sondern
Also für mich wäre mal 2 Beipiel-dateien mit UTF-8 und ANSI und davon je 2 Beispiele mit KOMMA und TABULATOR.
Dann könnte man(n) - Frau auch - eventuell nach Anhaltspunkten suchen und somit eine Auswertung vornehmen.
Gruss
Tsuki
danke für den Code. Den werde ich mir mal abspeichern
Allerdings will der TO nichts konvertieren, sondern
Um nun herauszufinden wieviele Txt-files in welcher Variante vorliegen, möchte ich diese Eigenschaften der Dateien gerne per batch auslesen und in eine Zieldatei schreiben.
Also für mich wäre mal 2 Beipiel-dateien mit UTF-8 und ANSI und davon je 2 Beispiele mit KOMMA und TABULATOR.
Dann könnte man(n) - Frau auch - eventuell nach Anhaltspunkten suchen und somit eine Auswertung vornehmen.
Gruss
Tsuki

Hallo bernd8183!
Wenn alle Dateien den gleichen Kontext beinhalten, dann kann man das anhand der Anzahl Tokens ermitteln und die Dateien gegebenenfalls durch Dateien mit einem einheitlichen Trennzeichen ersetzen.
Beispiel:
Beginnen die betreffenden Zeilen immer mit 'Produktionsjahr' und enden mit 'Gesamt'?
Gruß Dieter
Wenn alle Dateien den gleichen Kontext beinhalten, dann kann man das anhand der Anzahl Tokens ermitteln und die Dateien gegebenenfalls durch Dateien mit einem einheitlichen Trennzeichen ersetzen.
Beispiel:
Token = Split(Textzeile, ","): If UBound(Token) = BestimmteAnzahl Then Trennzeichen = ',' ..... |
Beginnen die betreffenden Zeilen immer mit 'Produktionsjahr' und enden mit 'Gesamt'?
Gruß Dieter
Na seh'n S'e,
ist doch gleich ein ganz anderer Sachverhalt
Ich denke mal, die Idee von Dieter ist das eleganteste.
Einfach die gesamte Datei öffnen, beide Möglichkeiten (KOMMA oder TABULATOR)
ersetzen durch das Trennzeichen seines Vertrauens und fertig ist die Sache.
Mann kann natürlich vorher noch raussuchen, welche Datei was für ein Trennzeichen hat(te), aber da stellt sich mir die Frage nach der Sinnhaftigkeit. Ich denke, man(n) hat doch schon genug zu tun auf der Arbeit und schlägt sich mit genug Staistiken etc. pepe herum
Viele Grüße
Tsuki
ist doch gleich ein ganz anderer Sachverhalt
Ich denke mal, die Idee von Dieter ist das eleganteste.
Einfach die gesamte Datei öffnen, beide Möglichkeiten (KOMMA oder TABULATOR)
ersetzen durch das Trennzeichen seines Vertrauens und fertig ist die Sache.
Mann kann natürlich vorher noch raussuchen, welche Datei was für ein Trennzeichen hat(te), aber da stellt sich mir die Frage nach der Sinnhaftigkeit. Ich denke, man(n) hat doch schon genug zu tun auf der Arbeit und schlägt sich mit genug Staistiken etc. pepe herum
Viele Grüße
Tsuki
Hallo Bernd,
das ist sich gar nicht so mit ohne
Jetzt nehme ich mal an, du suchst nach Doppelkomma und das wäre ein Indiz dafür, dass etwas faul ist mit deiner Datei. Dann hätte ich zum spielen folgenden VBS-Schnipsel, den du mit einer Batch-Datei aufrufst und die Ergebnisse in eine Datei umleitest.
Nehmen wir an, du benamst dein VBS-Datei: "Meine.VBS" dann rufst du im gleichen Ordner
der VBS-Datei mittels ein Batch-Datei die VBS auf:
In die VBS fügst du diesen Schnipsel ein:
Hier musst du noch den Pfad anpassen! Und zwar muss dort hinein, wo deine rund 60000 Dateien abgelegt sind.
Die Batch und die VBS würde ich in einen anderen Ordner ablegen.
Nun, wenn das soweit das tut, was du erst einmal möchtest, kannst du mit einem Taskplaner von Windows die Batch zu jeder Uhrzeit starten, die dir recht ist und dann den Rechner nachts arbeiten lassen.
Solong erst einmal und viele Grüße
Tsuki
[Edit]
Ups, noch ein ">" in die Batch eingefügt
[/Edit]
das ist sich gar nicht so mit ohne
Jetzt nehme ich mal an, du suchst nach Doppelkomma und das wäre ein Indiz dafür, dass etwas faul ist mit deiner Datei. Dann hätte ich zum spielen folgenden VBS-Schnipsel, den du mit einer Batch-Datei aufrufst und die Ergebnisse in eine Datei umleitest.
Nehmen wir an, du benamst dein VBS-Datei: "Meine.VBS" dann rufst du im gleichen Ordner
der VBS-Datei mittels ein Batch-Datei die VBS auf:
CScript Meine.VBS //NOLOGO >>Ergebnis.txt
In die VBS fügst du diesen Schnipsel ein:
Dim FSO
Dim Ordner, Pfad
Dim Suchzeichen
Suchzeichen = ",,"
Pfad = "C:\TestOrdner"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Ordner = FSO.getfolder(Pfad)
For Each File In Ordner.Files
Pfadangabe = File.Path
Set AktuelleDatei = FSO.OpenTextFile(Pfadangabe, 1)
AktuelleDaten = Split(AktuelleDatei.ReadAll,Suchzeichen)
If Ubound(AktuelleDaten) > 0 Then
Wscript.Echo "Die Datei [" & Pfadangabe & "] enthaelt falsche Trennzeichen!"
End If
AktuelleDatei.Close
Next
Set FSO = Nothing
Die Batch und die VBS würde ich in einen anderen Ordner ablegen.
Nun, wenn das soweit das tut, was du erst einmal möchtest, kannst du mit einem Taskplaner von Windows die Batch zu jeder Uhrzeit starten, die dir recht ist und dann den Rechner nachts arbeiten lassen.
Solong erst einmal und viele Grüße
Tsuki
[Edit]
Ups, noch ein ">" in die Batch eingefügt
[/Edit]

Hallo Tsuki!
Ich denke, dass Dilemma mit den Kommas sind falsche Zahlenwerte und von daher sollte es nicht mit Split, sondern anhand einer größeren Anzahl aufeinnanderfolgender Kommas hin geprüft werden. Kann mich natürlich auch irren und wenn, dann ist ein Test auf UBound gerade mal > 0 auf jeden Fall zu wenig
Gruß Dieter
Ich denke, dass Dilemma mit den Kommas sind falsche Zahlenwerte und von daher sollte es nicht mit Split, sondern anhand einer größeren Anzahl aufeinnanderfolgender Kommas hin geprüft werden. Kann mich natürlich auch irren und wenn, dann ist ein Test auf UBound gerade mal > 0 auf jeden Fall zu wenig
Gruß Dieter
Hallo Dieter,
genau soetwas vermute ich auch. Die beiden Beispieldatensätze lassen kein eindeutiges Muster erkennen, wie ein Programm explizit auf etwas aufmerksam werden soll.
Weil wenn man nur nach KOMMA-trennung sucht, stören Realwerte/Doubles etc. die mit Komma als Trenzeichen enthalten sind (andere sind wieder durch PUNKT getrennt).
Also bezugnehmend auf die letzte Info vom TO: da werden Doppelkommas angemeckert. Das ist dann schon mal ein Hint
Ich würde mal sagen, lass ihn mal die Dateien mit meinem Schnipsel durchsuchen und auflisten. Mal sehen, was dabei rumkommt. Ein gutes Gefühl habe ich immer noch nicht, aber es interessiert halt
Viele Grüße
Tsuki
genau soetwas vermute ich auch. Die beiden Beispieldatensätze lassen kein eindeutiges Muster erkennen, wie ein Programm explizit auf etwas aufmerksam werden soll.
Weil wenn man nur nach KOMMA-trennung sucht, stören Realwerte/Doubles etc. die mit Komma als Trenzeichen enthalten sind (andere sind wieder durch PUNKT getrennt).
Also bezugnehmend auf die letzte Info vom TO: da werden Doppelkommas angemeckert. Das ist dann schon mal ein Hint
Ich würde mal sagen, lass ihn mal die Dateien mit meinem Schnipsel durchsuchen und auflisten. Mal sehen, was dabei rumkommt. Ein gutes Gefühl habe ich immer noch nicht, aber es interessiert halt
Viele Grüße
Tsuki
Hallo @all!
Vielleicht auch andersrum: Wie hoch ist die Wahrscheinlichkeit, dass Dateien, die nicht TAB-getrennt sind, TAB beinhalten? Letzteres festszustellen benötigt gar kein
Grüße
bastla
P.S.: Da in der Schleife die Datei ja schon als Objekt vorliegt, kann sie einfach mit "
Vielleicht auch andersrum: Wie hoch ist die Wahrscheinlichkeit, dass Dateien, die nicht TAB-getrennt sind, TAB beinhalten? Letzteres festszustellen benötigt gar kein
Split()
sondern ist einfach per InStr()
zu realisieren ...Grüße
bastla
P.S.: Da in der Schleife die Datei ja schon als Objekt vorliegt, kann sie einfach mit "
File.OpenAsTextStream.ReadAll
" eingelesen werden ...
Hallo bastla,
deine Überlegung kommt auch noch hinzu! Das meinte ich, dass ich noch kein gutes Gefühl habe bei der ganzen Sache.
Es gibt - laut TO - zu viele Kombinationen/Möglichkeiten. Sowas kann ein Prozessor nur ganz umständlich/hässlich abfangen
Gruss
Tsuki
Ps.: Weil neulich angesprochen von bastla kann die Zeile15 oben durch
ersetzt werden 
deine Überlegung kommt auch noch hinzu! Das meinte ich, dass ich noch kein gutes Gefühl habe bei der ganzen Sache.
Es gibt - laut TO - zu viele Kombinationen/Möglichkeiten. Sowas kann ein Prozessor nur ganz umständlich/hässlich abfangen
Gruss
Tsuki
Ps.: Weil neulich angesprochen von bastla kann die Zeile15 oben durch
Wscript.Echo "Die Datei [" & Fso.GetBaseName(Pfadangabe) & "] enthaelt falsche Trennzeichen!"
Hallo Bernd,
na es freud mich, wenn es bei dir klappt
Um alle Unterordner einzubeziehen könnte man das ganze Script so aufbauen:
dann einfach deinen Zweizeiler dazu/ersetzen und es müsste funktionieren.
Viele Grüße
Tsuki
na es freud mich, wenn es bei dir klappt
Um alle Unterordner einzubeziehen könnte man das ganze Script so aufbauen:
Dim FSO
Dim Ordner, Pfad
Dim Suchzeichen
Suchzeichen = ",,"
Pfad = "C:\TestOrdner"
Set FSO = CreateObject("Scripting.FileSystemObject")
DateienEinlesen(Pfad) 'hier die Sub-Routine aufrufen
Private Sub DateienEinlesen(tempPfad)
Set Ordner = FSO.getfolder(tempPfad)
For Each File In Ordner.Files
Pfadangabe = File.Path
Set AktuelleDatei = FSO.OpenTextFile(Pfadangabe, 1)
AktuelleDaten = Split(AktuelleDatei.ReadAll,Suchzeichen)
If Ubound(AktuelleDaten) > 0 Then
'Wscript.Echo "Die Datei [" & Pfadangabe & "] enthaelt falsche Trennzeichen!"
Wscript.Echo "Die Datei [" & Fso.GetBaseName(Pfadangabe) & "] enthaelt falsche Trennzeichen!"
End If
AktuelleDatei.Close
Next
For Each Unterordner In Ordner.SubFolders
Ordner = Unterordner.Path
DateienEinlesen (Ordner)
Next
End Sub
Set FSO = Nothing
Set Ordner = Nothing
Set AktuelleDatei = Nothing
Viele Grüße
Tsuki