13. Semikolon pro Zeile in Textdatei mit Leerzeichen ersetzen - geht das?
Servus zusammen.
Ich stehe vor einem kleinen Problem: Ich habe immer wieder mit CSV-Dateien zu tun, in denen die Werte mit einem Semikolon getrennt sind. Und da ich in jeder Datei in jeder Zeile das 13. Semikolon durch ein Leerzeichen ersetzen muss, um zwei Werte in ein Feld zu bekommen (genauer: Feld 13 ist der Vorname, Feld 14 der Nachname und beides soll nachher zusammen dastehen), ist das in Handarbeit echt mühsam.
Das Problem an der Sache ist, dass die absolute Position dieses 13. Semikolons nicht immer dieselbe ist. Mal sind 40 Zeichen davor, mal 140.
Der Dateiname ist immer gleich (export.csv) und soll dann in bearbeitet.csv gespeichert werden.
Da meine VBS-Kenntnisse = null sind und meine letzte Batch-Datei aus den Zeiten von Windows3.1 stammt, bin ich auf Hilfe angewisen.
Wer mag mir seine Lösungsvorschläge erläutern?
Ich müsste anschließend noch "Deutschland" mit "D" ersetzen, aber ich hoffe, das schaffe ich dann alleine.
Grüße, Jens
Ich stehe vor einem kleinen Problem: Ich habe immer wieder mit CSV-Dateien zu tun, in denen die Werte mit einem Semikolon getrennt sind. Und da ich in jeder Datei in jeder Zeile das 13. Semikolon durch ein Leerzeichen ersetzen muss, um zwei Werte in ein Feld zu bekommen (genauer: Feld 13 ist der Vorname, Feld 14 der Nachname und beides soll nachher zusammen dastehen), ist das in Handarbeit echt mühsam.
Das Problem an der Sache ist, dass die absolute Position dieses 13. Semikolons nicht immer dieselbe ist. Mal sind 40 Zeichen davor, mal 140.
Der Dateiname ist immer gleich (export.csv) und soll dann in bearbeitet.csv gespeichert werden.
Da meine VBS-Kenntnisse = null sind und meine letzte Batch-Datei aus den Zeiten von Windows3.1 stammt, bin ich auf Hilfe angewisen.
Wer mag mir seine Lösungsvorschläge erläutern?
Ich müsste anschließend noch "Deutschland" mit "D" ersetzen, aber ich hoffe, das schaffe ich dann alleine.
Grüße, Jens
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 385764
Url: https://administrator.de/forum/13-semikolon-pro-zeile-in-textdatei-mit-leerzeichen-ersetzen-geht-das-385764.html
Ausgedruckt am: 06.04.2025 um 01:04 Uhr
21 Kommentare
Neuester Kommentar
Moin,
in vbs sucht man mit der instr-Funktion die liefert immer das nächste gefundene.
Du kannst also die Funktion in einer Schleife aufrufen um immer das nächste Semikolon pro Zeile zu bekommen.
Oder du verwendet ein Array und splittest die Zeile anhand des Semikolon und baust den String danach wieder so zusammen wie du ihn brauchst.
in vbs sucht man mit der instr-Funktion die liefert immer das nächste gefundene.
Du kannst also die Funktion in einer Schleife aufrufen um immer das nächste Semikolon pro Zeile zu bekommen.
Oder du verwendet ein Array und splittest die Zeile anhand des Semikolon und baust den String danach wieder so zusammen wie du ihn brauchst.
Moin,
dafür würde ich mir ein Powershell-Skript schreiben. Mal schnell hingeschrieben, ohne zu testen:
hth
Erik
dafür würde ich mir ein Powershell-Skript schreiben. Mal schnell hingeschrieben, ohne zu testen:
$old_data = Import-Csv "export.csv" -delimiter ";" -Encoding utf8 # Die Kodierung evtl. anpassen
foreach($dataset in $old_data) {
$row = New-Object PSObject -Property @{
Field1 = "$dataset.field1"
Field2 = "$dataset.field2" # und so weiter bis alle Felder verarbeitet wurden. Die Feldnamen musst Du natürlich anpassen.
fullname = "$dataset.vorname $dataset.nachname"
country = "D" # Sollten da auch andere stehen, dann muss da noch ein if hin.
}
$row | Export-Csv "bearbeitet.csv" -Delimiter ";" -Encoding utf8 -Append
}
hth
Erik
Hallo @jens-fi,
hier noch eine kommentierte VBScript-Lösung:
Ich bin mal davon ausgegangen, dass die Eingabe- und Ausgabedatei die Zeichencodierung Windows-1252 bzw. ANSI haben.
Das Script funktioniert nur, wenn es in der Eingabedatei keine Felder gibt, die als Nutzdaten Semikolons enthalten.
Grüße
Friemler
hier noch eine kommentierte VBScript-Lösung:
'Alle Variablen müssen vor ihrer Verwendung deklariert werden
Option Explicit
'*******************************************************************************
'Deklaration von Konstanten
'*******************************************************************************
Const InFileName = ".\Export.csv"
Const OutFileName = ".\Bearbeitet.csv"
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const AsSystemDefault = -2
Const AsUnicode = -1
Const AsAnsi = 0
'*******************************************************************************
'Deklaration von Variablen
'*******************************************************************************
Dim objFSO, objInFile, objOutFile
Dim strLine, arrLine, intCnt
'*******************************************************************************
'Hauptprogramm
'*******************************************************************************
'Benötigte Objekte erzeugen
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Quell- und Zieldatei öffnen
Set objInFile = objFSO.OpenTextFile(InFileName, ForReading, False, AsAnsi)
Set objOutFile = objFSO.OpenTextFile(OutFileName, ForWriting, True, AsAnsi)
'Quelldatei zeilenweise einlesen, bearbeiten und in die Zieldatei schreiben
Do While Not objInFile.AtEndOfStream
'Zeile einlesen
strLine = objInFile.ReadLine
'Zeileninhalt anhand der Semikolons zerlegen
arrLine = Split(strLine, ";")
strLine = ""
'Vor- und Nachname zusammenfügen
For intCnt = 0 To UBound(arrLine)
If intCnt <> 13 Then
If intCnt > 0 Then strLine = strLine & ";"
strLine = strLine & arrLine(intCnt)
Else
strLine = strLine & " " & arrLine(intCnt)
End If
Next
'Deutschland durch D ersetzen
strLine = Replace(strLine, "Deutschland", "D", 1, -1, vbTextCompare)
'Zeile in Ausgabedatei schreiben
objOutFile.WriteLine strLine
Loop
'Dateien schließen
objInFile.Close
objOutFile.Close
Ich bin mal davon ausgegangen, dass die Eingabe- und Ausgabedatei die Zeichencodierung Windows-1252 bzw. ANSI haben.
Das Script funktioniert nur, wenn es in der Eingabedatei keine Felder gibt, die als Nutzdaten Semikolons enthalten.
Grüße
Friemler
Moin,
Deshalb würde ich das auch immer mit einer Sprache machen, die csv beherrscht. Das splitten einer csv am Trennzeichen ist einfach gefährlich. Wenn man das wirklich sicher machen will, dann muss man mit einer regex prüfen, ob es zwischen zwei Anführungszeichen steht, sofern die Daten in solche eingeschlossen sind. Wenn nicht, dann dürfen in csv die Daten das Trennzeichen nicht enthalten. Deshalb macht man da ja auch immer welche drum, falls es doch mal vorkommt. All diese Gefahren nimmt Dir eine Sprache, die das kann, ab.
Liebe Grüße
Erik
Zitat von @Friemler:
Das Script funktioniert nur, wenn es in der Eingabedatei keine Felder gibt, die als Nutzdaten Semikolons enthalten.
Das Script funktioniert nur, wenn es in der Eingabedatei keine Felder gibt, die als Nutzdaten Semikolons enthalten.
Deshalb würde ich das auch immer mit einer Sprache machen, die csv beherrscht. Das splitten einer csv am Trennzeichen ist einfach gefährlich. Wenn man das wirklich sicher machen will, dann muss man mit einer regex prüfen, ob es zwischen zwei Anführungszeichen steht, sofern die Daten in solche eingeschlossen sind. Wenn nicht, dann dürfen in csv die Daten das Trennzeichen nicht enthalten. Deshalb macht man da ja auch immer welche drum, falls es doch mal vorkommt. All diese Gefahren nimmt Dir eine Sprache, die das kann, ab.
Liebe Grüße
Erik
Hallo @erikro,
ich habe das jetzt erstmal so gelöst (mit Hinweis auf die Einschränkung), weil es evtl. gar nicht notwendig ist, den Aufwand (in VBScript) zu betreiben, um das ganze allgemein verwendbar und damit sicher zu machen. Denn wenn die CSV-Datei keine Felder mit Semikolons in den Nutzdaten enthält, ist alles paletti, ansonsten arbeite ich eben noch mal nach.
Und zu "Sprache, die CSV beherrscht": An Bordmitteln gibt es da nur PowerShell. Der TO schrieb jedoch, dass seine VBScript-Kenntnisse gleich Null sind und er seine letzte Batchdatei vor mindestens 25 Jahren geschrieben hat. Da ist PowerShell sicherlich nicht die richtige Sprache für ein Script, dass er bei Bedarf selbst erweitern will.
Da der TO den genannten Hinweis gab, verstehe ich auch solche Postings nicht, indem ihm in Worten beschrieben wird, wie er ein Script schreiben muss, das sein Problem löst. Aber schon klar, wer Hilfe will, soll einen Dienstleister dafür bezahlen, gelle? Euch haben sie wohl das Modul mit dem Namen "Solidarität" aus dem Gehirn entfernt und durch eins mit der Aufschrift "Geldgeilheit" ersetzt...
Grüße
Friemler
ich habe das jetzt erstmal so gelöst (mit Hinweis auf die Einschränkung), weil es evtl. gar nicht notwendig ist, den Aufwand (in VBScript) zu betreiben, um das ganze allgemein verwendbar und damit sicher zu machen. Denn wenn die CSV-Datei keine Felder mit Semikolons in den Nutzdaten enthält, ist alles paletti, ansonsten arbeite ich eben noch mal nach.
Und zu "Sprache, die CSV beherrscht": An Bordmitteln gibt es da nur PowerShell. Der TO schrieb jedoch, dass seine VBScript-Kenntnisse gleich Null sind und er seine letzte Batchdatei vor mindestens 25 Jahren geschrieben hat. Da ist PowerShell sicherlich nicht die richtige Sprache für ein Script, dass er bei Bedarf selbst erweitern will.
Da der TO den genannten Hinweis gab, verstehe ich auch solche Postings nicht, indem ihm in Worten beschrieben wird, wie er ein Script schreiben muss, das sein Problem löst. Aber schon klar, wer Hilfe will, soll einen Dienstleister dafür bezahlen, gelle? Euch haben sie wohl das Modul mit dem Namen "Solidarität" aus dem Gehirn entfernt und durch eins mit der Aufschrift "Geldgeilheit" ersetzt...
Grüße
Friemler
Mein Code ist kein PowerShell, sondern VBScript. Der Code muss mit der Dateierweiterung
VBS
abgespeichert werden.Grüße
Friemler
Zitat von @jens-fi:
Aber um bei "blöd" zu bleiben: Ausführung per Doppelklick? Oder draufziehen? Weil in beiden Fällen ist das Ergebnis folgendes:
Zeile: 1
Zeichen: 1
Fehler: Ungültiges Zeichen
Code: 800A0408
Quelle: Kompilierungsfehler in VBScript
Aber um bei "blöd" zu bleiben: Ausführung per Doppelklick? Oder draufziehen? Weil in beiden Fällen ist das Ergebnis folgendes:
Zeile: 1
Zeichen: 1
Fehler: Ungültiges Zeichen
Code: 800A0408
Quelle: Kompilierungsfehler in VBScript
Die Box mit meinem Script-Code enthält in der oberen rechten Ecke das Wörtchen "Quelltext". Das ist ein Link, der ein neues Browser-Fenster öffnet, das nur den Quelltext ohne Zeilennummern enthält. In das Fenster klicken, CTRL+A und dann CTRL+C drücken, der Quelltext liegt dann in der Zwischenablage. Zum Fenster des Text-Editors wechseln (dafür bitte NICHT MS Word oder ein anderes Textverarbeitungsprogramm verwenden!! Nimm z.B. Windows Notepad) und CTRL+V drücken, dann abspeichern.
Grüße
Friemler
Moin,
Wie gesagt, war nicht getestet. ;) So gehts:
Zitat von @jens-fi:
@ erikro: Danke für die schnelle Antwort. Leider werden die Daten alle in eine Zeile geworfen, also alle ersten Felder, dann alle zweiten Felder ... alles fein säuberlich mit ; getrennt
@ erikro: Danke für die schnelle Antwort. Leider werden die Daten alle in eine Zeile geworfen, also alle ersten Felder, dann alle zweiten Felder ... alles fein säuberlich mit ; getrennt
Wie gesagt, war nicht getestet. ;) So gehts:
$old_data = Import-Csv "export.csv" -delimiter ";" -Encoding utf8 # Die Kodierung evtl. anpassen
foreach($dataset in $old_data) {
$row = New-Object PSObject -Property @{
Field1 = $dataset.field1
Field2 = $dataset.field2
fullname = $dataset.vorname + " " + $dataset.nachname
}
$row | Export-Csv "bearbeitet.csv" -Delimiter ";" -Encoding utf8 -Append
}
Moin,
Ziemlich unverschämt, was Du jemandem schreibst, der hier schon vielen funktionierende Skripts geliefert und mehr als genug beim Debuggen geholfen hat. Ziemlich unverschämt, wenn man dem TO, der keine Ahnung hat statt 12 Zeilen Skript 64 um die Ohren haut, die noch nicht einmal korrekt funktionieren, weil nicht getestet wird, ob ein Datenfeld unerlaubte Zeichen enthält. Wem haben sie hier wohl welches Modul aus dem Hirn entfernt.
PLOP
Erik
Zitat von @Friemler:
Da der TO den genannten Hinweis gab, verstehe ich auch solche Postings nicht, indem ihm in Worten beschrieben wird, wie er ein Script schreiben muss, das sein Problem löst. Aber schon klar, wer Hilfe will, soll einen Dienstleister dafür bezahlen, gelle? Euch haben sie wohl das Modul mit dem Namen "Solidarität" aus dem Gehirn entfernt und durch eins mit der Aufschrift "Geldgeilheit" ersetzt...
Da der TO den genannten Hinweis gab, verstehe ich auch solche Postings nicht, indem ihm in Worten beschrieben wird, wie er ein Script schreiben muss, das sein Problem löst. Aber schon klar, wer Hilfe will, soll einen Dienstleister dafür bezahlen, gelle? Euch haben sie wohl das Modul mit dem Namen "Solidarität" aus dem Gehirn entfernt und durch eins mit der Aufschrift "Geldgeilheit" ersetzt...
Ziemlich unverschämt, was Du jemandem schreibst, der hier schon vielen funktionierende Skripts geliefert und mehr als genug beim Debuggen geholfen hat. Ziemlich unverschämt, wenn man dem TO, der keine Ahnung hat statt 12 Zeilen Skript 64 um die Ohren haut, die noch nicht einmal korrekt funktionieren, weil nicht getestet wird, ob ein Datenfeld unerlaubte Zeichen enthält. Wem haben sie hier wohl welches Modul aus dem Hirn entfernt.
PLOP
Erik
Zitat von @jens-fi:
Einen kleinen Wunsch hätte ich noch: wenn ich immer die gleiche Datei öffnen will, dann brauche ich das mit dem Draufziehen ja nicht. Kann ich den Dateinamen dann fest einbauen?
Einen kleinen Wunsch hätte ich noch: wenn ich immer die gleiche Datei öffnen will, dann brauche ich das mit dem Draufziehen ja nicht. Kann ich den Dateinamen dann fest einbauen?
Ich habe das Script oben angepasst.
Grüße
Friemler
@erikro
Ich hätte wohl ausdrücklich schreiben müssen, wen ich mit meiner Aussage meinte - Dich jedenfalls nicht. Hatte vorausgesetzt, dass Du das selbst erkennst.
Und wie Du inzwischen wohl schon festgestellt hast, funktioniert mein Script beim TO und genügt auch seinen Ansprüchen.
12 Zeilen kompakter PowerShell-Code sind übrigens von jemandem, der nicht programmieren kann, nur schwer zu verstehen. Kurz ist nicht gleich klar verständlich.
Friemler
Ich hätte wohl ausdrücklich schreiben müssen, wen ich mit meiner Aussage meinte - Dich jedenfalls nicht. Hatte vorausgesetzt, dass Du das selbst erkennst.
Und wie Du inzwischen wohl schon festgestellt hast, funktioniert mein Script beim TO und genügt auch seinen Ansprüchen.
12 Zeilen kompakter PowerShell-Code sind übrigens von jemandem, der nicht programmieren kann, nur schwer zu verstehen. Kurz ist nicht gleich klar verständlich.
Friemler
Moin,
heißen Deine Felder denn so? Die Feldnamen musst Du schon anpassen und entsprechend mehr in den Block einfügen, in dem das Objekt erzeugt wird. Wenn Deine Datei z. B. diese Überschriften hat:
dann muss der Code so angepasst werden:
Liebe Grüße
Erik
heißen Deine Felder denn so? Die Feldnamen musst Du schon anpassen und entsprechend mehr in den Block einfügen, in dem das Objekt erzeugt wird. Wenn Deine Datei z. B. diese Überschriften hat:
Wert1;Zahl1;Wert2;Surname;GivenName
dann muss der Code so angepasst werden:
$row = New-Object PSObject -Property @{
Wert1 = $dataset.Wert1
Zahl1 = $dataset.Zahl1
Wert2 = dataset.Wert2
fullname = $dataset.GivenName + " " + $dataset.Surname
}
Liebe Grüße
Erik
Wenn Du nicht weiterkommst - auf dieser Seite gibt es unter der Überschrift "Microsoft Windows Script-Technologien - Hilfe" die Datei
script56.chm
zum Download. Das ist die Hilfe-Datei zu VBScript und JScript von Microsoft.Grüße
Friemler