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/OPTIONS
oder“ verwenden MATCH
und 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 \n
durch 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