Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Regex: nur störende Zeilenumbrüche entfernen

Forumthread: 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
Anzeige

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
Anzeige
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
Anzeige
Anzeige

Infobox / Tutorial

Störende Zeilenumbrüche mit Regex in Excel entfernen


Schritt-für-Schritt-Anleitung

Um störende Zeilenumbrüche in Artikelbezeichnungen zu entfernen, kannst Du die folgende Schritt-für-Schritt-Anleitung befolgen:

  1. VBA-Editor öffnen: Drücke ALT + F11 in Excel, um den VBA-Editor zu öffnen.

  2. Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (deinWorkbookName)" und wähle Einfügen > Modul.

  3. Code einfügen: Kopiere den folgenden Code in das Modul:

    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
       Dim lo_regex As Object
       Set lo_regex = CreateObject("VBScript.RegExp")
       With lo_regex
           .Global = True
           .MultiLine = True
           .Pattern = "[^""'][^;]" & vbCrLf & "[^""']|[^""'][^;]" & vbLf & "[^""']"
       End With
       get_clean_content = lo_regex.Replace(i_content, "")
    End Function
  4. Datei speichern: Speichere die Datei im CSV-Format.

  5. Makro ausführen: Führe das clear_crlf-Makro aus, indem Du es im VBA-Editor über F5 startest.


Häufige Fehler und Lösungen

  • Fehler: Datei nicht gefunden
    Mögliche Ursache: Der angegebene Dateipfad ist falsch. Überprüfe den Pfad und die Dateinamen.

  • Fehler: Schreiben der Datei gescheitert
    Lösung: Stelle sicher, dass Du Schreibrechte für den Speicherort hast und dass die Datei nicht schreibgeschützt ist.

  • Regex funktioniert nicht wie erwartet
    Überprüfe das Regex-Muster. Es sollte die Zeilenumbrüche korrekt identifizieren. Der Regex für den Zeilenumbruch könnte in Deinem Fall so aussehen: (?=\"[^\;]*)(\r)(?=[^\;]*\").


Alternative Methoden

Falls Du mit VBA nicht arbeiten möchtest, kannst Du auch folgende Methoden in Betracht ziehen:

  • Power Query: Importiere die CSV-Datei in Power Query und nutze die Funktion "Ersetzen", um Zeilenumbrüche zu entfernen.
  • Excel-Formeln: Nutze die WECHSELN-Funktion, um Zeilenumbrüche in Zellen zu ersetzen. Beispiel:

    =WECHSELN(A1;CHAR(10);"")

Praktische Beispiele

Angenommen, Du hast folgende CSV-Zeilen:

"Artikel 1";"Beschreibung mit
Zeilenumbruch";"Preis"
"Artikel 2";"Ein weiterer
Artikel";"20,00"

Nach Anwendung des oben genannten VBA-Codes sollten die Zeilen folgendermaßen aussehen:

"Artikel 1";"Beschreibung mit Zeilenumbruch";"Preis"
"Artikel 2";"Ein weiterer Artikel";"20,00"

Tipps für Profis

  • Regex leerzeichen entfernen: Kombiniere die Regex-Funktionen, um auch überflüssige Leerzeichen zu entfernen. Beispiel:

    .Pattern = "\s+" ' Entfernt mehrere Leerzeichen
  • Sicherungskopien: Erstelle immer Sicherungskopien Deiner CSV-Dateien, bevor Du das Makro ausführst.

  • Testen von Regex: Nutze Online-Tools wie regexr.com, um Deine Regex-Pattern zu testen, bevor Du sie in VBA implementierst.


FAQ: Häufige Fragen

1. Wie kann ich Zeilenumbrüche in einer Excel-Tabelle finden?
Du kannst die SUCHE-Funktion verwenden, um nach CHAR(10) oder CHAR(13) zu suchen.

2. Was ist der Unterschied zwischen vbCrLf und vbLf?
vbCrLf steht für einen Wagenrücklauf und Zeilenumbruch, während vbLf nur für den Zeilenumbruch steht.

3. Kann ich das Regex auch in anderen Programmiersprachen verwenden?
Ja, die meisten Programmiersprachen unterstützen Regex. Du musst nur die jeweilige Syntax anpassen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige