Anzeige
Archiv - Navigation
1956to1960
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Regex: nur störende Zeilenumbrüche entfernen

Regex: nur störende Zeilenumbrüche entfernen
21.12.2023 13:16:53
Dirk
Ich habe einen Kunden, der mir csv Daten zur Verarbeitung schickt. Leider hat er in manchen Artikelbezeichnungen Zeilenumbrüche, die massiv die csv-Verarbeitung stören.

Beispiel - Datensatz 3 ist falsch umgebrochen:
"Artikelnummer";"HAN";"EAN/Barcode";"Lagerbestand Gesamt";"Artikelname";"Länge";"Breite";"Höhe";"Inhalt/Menge";
"623456789";"";"123456789";"240,00";"Artikel 6";"62,00";"46,00";"40,00";"1";
"723456789";"";"223456789";"2,00";"Artikel 7";"69,00";"32,00";"75,50";"2";
"8freico_BC-SS-
NAVY-6";"";"323456789";"154,00";"Artikel 8";"69,00";"32,00";"75,50";"3";
"923456789";"";"323456789";"154,00";"Artikel 9";"69,00";"32,00";"75,50";"3";
"1023456789";"";"323456789";"154,00";"Artikel 10";"69,00";"32,00";"75,50";"3";

Ich hab das schon zeilenweise gelöst - kein Ding.
Aber ich möchte das performanter machen und auf einen Schlag erledigen. Mir schwebt eine Regex vor, und zwar in diesem Ansatz:

Option Explicit


Public Sub clear_crlf(i_filename As String)
Dim l_content As String

l_content = get_file_as_string(i_filename)
l_content = get_clean_content(l_content)
write_string_as_file i_filename, l_content

End Sub

Private Function get_file_as_string(i_filename As String) As String
Dim f As Long
Dim l_textlaenge As Long
On Error GoTo Fehler
f = FreeFile
Open i_filename For Input As #f
l_textlaenge = LOF(f)
get_file_as_string = Input(l_textlaenge, #f)
Close #f


Exit Function
Fehler:
MsgBox "Datei " & i_filename & " nicht gefunden.", vbCritical + vbOKOnly
End Function

Private Sub write_string_as_file(i_filename As String, i_content As String)
Dim f As Long
Dim l_origfile As String

On Error Resume Next
l_origfile = Left$(i_filename, Len(i_filename) - 4) & "_orig.csv"
Name i_filename As l_origfile
On Error GoTo 0

On Error GoTo Fehler
f = FreeFile
Open i_filename For Output As #f
Print #f, i_content
Close #f

Exit Function
Fehler:
MsgBox "Schreiben der Datei " & i_filename & " gescheitert", vbCritical + vbOKOnly

End Sub


Private Function get_clean_content(i_content As String) As String

' per Regex alle Zeilenumbrüche durch NICHTS ersetzen,
' denen nicht(!) links Anführungszeichen+Semikolon vorausgeht und rechts Anführungszeichen nachfolgt



End Function

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Regex: nur störende Zeilenumbrüche entfernen
21.12.2023 13:42:28
Yal
Hallo Dirk,

Du musst nur das RegEx Pattern herausfinden, das einen Zeilumbruch innerhalb zwei doppelte Hochkommas, also ohne Semikolon darin, abbildet.

Dann bindest Du die Bib Microsoft Regular Expression ein und setzst einen Replace durch nichts.

Pattern-Test unter https://regexr.com/

VG
Yal
AW: Regex: nur störende Zeilenumbrüche entfernen
21.12.2023 13:57:35
Yal
Es müsste ca
(?=\"[^\;]*)(\r)(?=[^\;]*\")
sein. Oder ähnliches.

Ist doch klar ;-)

VG
Yal
AW: Regex: nur störende Zeilenumbrüche entfernen
21.12.2023 14:02:42
Dirk
ChatGPT hat es für mich gelöst. Ich musste nur ganz leicht nacharbeiten:

Public Function GetCleanContent(ByVal i_content As String) As String

Dim regex As Object

' Erstelle ein Regex-Objekt
Set regex = CreateObject("VBScript.RegExp")
With regex
.Global = True
.MultiLine = True
.Pattern = "[^;""']" & vbCrLf & "[^;""']"
End With

' Überprüfe, ob das Muster im Inhalt vorhanden ist
While regex.Test(i_content)
' Ersetze den Zeilenumbruch durch nichts
i_content = regex.Replace(i_content, "")
Wend

' Gib den bereinigten Inhalt zurück
GetCleanContent = i_content
End Function

Anzeige
AW: Regex: nur störende Zeilenumbrüche entfernen
21.12.2023 19:01:34
Dirk
Finale Version:


Private Function GetCleanContent(ByVal i_content As String) As String
' per Regex alle Zeilenumbrüche durch NICHTS ersetzen,
' denen nicht(!) links Anführungszeichen+Semikolon vorausgeht und rechts Anführungszeichen nachfolgt
' Als Anführungszeichen sind Single- und Doublequotes zugelassen

Dim lo_regex As Object

'Die unten gewählte Regex nimmt leider das Semikolon am Dateiende mit raus!
'Egal, ob noch ein Linefeed, ein Linebreak oder auch nichts mehr folgt!
'Einige Versuche, das Pattern mit $ zu ergänzen, blieben erfolglos.
'Daher vermeiden wir den Fehler schon hier, indem wir alles wegschneiden, was nach dem letzten Semikolon folgt:
i_content = Mid$(i_content, 1, Len(i_content) - InStr(StrReverse(i_content), ";") + 1)

' Erstelle ein Regex-Objekt
Set lo_regex = CreateObject("VBScript.RegExp")
With lo_regex
.Global = True 'das ist laut ChatGPT der Schalter, mit dem gleich ALLE ERSETZUNGEN AUF EINMAL durchgeführt werden.
.MultiLine = True
.Pattern = "[^""'][^;]" & vbCrLf & "[^""']|[^""'][^;]" & vbLf & "[^""']"
End With

GetCleanContent = lo_regex.Replace(i_content, "")


End Function
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige