RegEx zum Entfernen von CRLF aus dem CSV-Export aus Excel

RegEx zum Entfernen von CRLF aus dem CSV-Export aus Excel

Ich habe eine Excel-Datei als CSV exportiert und sie enthält viele mehrzeilige Zeilen. Den Anfang jeder Zeile habe ich mit *** und das Ende mit ### markiert.

*** some
text within
my cell to
export ###

Könnte mir jemand mit einem RexEx-Ausdruck helfen, das CRLF aus dieser Textdatei zu entfernen, um es so zu bekommen

*** some text within my cell to export ###

Antwort1

Habe es mit einem Makro gemacht:

Dim pobjCell As Range
Dim plCharCounter As Long
Dim psCellText As String



For Each pobjCell In Selection
psCellText = pobjCell.Text
Do While InStr(psCellText, vbLf) > 0
psCellText = Replace$(psCellText, vbLf, " ")
Loop
pobjCell.Value = psCellText
Next

Antwort2

s/[\n\r ]+/ /g

Dadurch werden sämtliche Leerzeichen, Wagenrückläufe und Zeilenumbrüche global [\n\r ]+durch ein Leerzeichen ( ) ersetzt.


s/\*\*\(*.*)[\n\r ]+(.*)###/$1 $2/g

Dies ist eine Version der vorherigen, bei der Ihr Satz mit beginnt ***und endet ###.


s/^\*\*\*(.*)[\n\r ]+(.*)###$/$1 $2/g

Dies ist eine Version der vorherigen, die ebenfalls sicherstellt, dass ***am Anfang einer Zeile beginnt und ###am Ende der Zeile endet. Eines davon sollte Ihren Wünschen entsprechen.


s/MATCH/REPLACE/OPTIONS

IstsedSyntax: Vielleicht möchten Sie einfach „ /MATCH/OPTIONSoder“ verwenden MATCHund es durch ersetzen REPLACE. Hängt davon ab, wie Sie den regulären Ausdruck verwenden möchten. Ich glaube, der mittlere Ausdruck würde Ihrer Beschreibung entsprechend am besten funktionieren.

Antwort3

ich habe keine Ahnung, ob irgendeine echte Implementierung von Regex Lookbehind mit variabler Länge unterstützt, aber theoretisch würde der Regex so aussehen (das zweite Argument einer Ersetzungsfunktion wäre ein Leerzeichen):

(?<=\*\*\*[^#]*)\n(?=[^#]*###)

in der Praxis unterscheiden CSV-Parser zwischen neuen Zeilen innerhalb von Zeichenfolgen (zwischen Anführungszeichen) und neuen Zeilen zwischen Zeilen, daher sollte dies kein Problem sein ...

Es ist jedoch möglich, die Zeilenenden mit einer speziellen Zeichenfolge (z. B. „@@@“) zu markieren, dann alle neuen Zeilen \ndurch Leerzeichen zu ersetzen und dann @@@durch neue Zeilen zu ersetzen \n...

Antwort4

Wie wäre es mit einem VBS, das die Eingabe einer CSV-Datei entgegennimmt und die Datei ausgibt, wobei die Zeilen mit *** beginnen und mit ### enden und zusammengefügt sind?

Option Explicit
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim bStripNewline, sOutput, sLine : bStripNewline = False
If WScript.Arguments.Count = 0 Then
    WScript.Echo "Usage: " & WScript.ScriptName & " <file>"
    WScript.Quit
End If
Dim oFile : Set oFile = fso.OpenTextFile(Wscript.Arguments(0), 1)
Do Until oFile.AtEndOfStream
    sLine = oFile.ReadLine
    If Left(sLine, 3) = "***" Then
        bStripNewLine = True
        sLine = Mid(sLine, 4, Len(sLine))
    ElseIf Right(sLine, 3) = "###" and bStripNewLine = True Then
        bStripNewline = False
        sLine = Left(sLine, Len(sLine)-3)
    End If
    sOutput = sOutput & sLine
    If bStripNewline = False Then sOutput = sOutput & VbCrLf
Loop
oFile.Close
Set fso = Nothing
WScript.Echo sOutput

Speichern Sie es in einer Datei und führen Sie es wie folgt von der Befehlszeile aus:

cscript //NOLOGO nameofscript.vbs <name of csv file> > <new file>

Beispiel-Eingabedatei:

the quick brown
*** some
text within
my cell to
export ###
fox jumps
***over
the 
lazy###
dog
one two three

Erzeugt die folgende Ausgabe:

the quick brown
 sometext withinmy cell toexport 
fox jumps
overthe lazy
dog
one two three

verwandte Informationen