RegEx для удаления CRLF из экспорта CSV из Excel

RegEx для удаления CRLF из экспорта CSV из Excel

Я экспортировал файл Excel в CSV и в нем много многострочных данных. Я пометил начало каждой строки ***, а конец — ###.

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

Может ли кто-нибудь помочь мне с выражением RexEx, чтобы удалить CRLF из этого текстового файла и получить его как

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

решение1

Сделал это с помощью макроса:

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

решение2

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

Это глобально заменит все пробелы, возвраты каретки и символы новой строки [\n\r ]+на пробел ( ).


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

Это версия предыдущей, которая предполагает, что ваше предложение начинается с . ***и заканчивается на ###.


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

Это версия предыдущей, которая также гарантирует, что ***начинается в начале строки и ###заканчивается в конце строки. Один из них должен соответствовать тому, что вам нужно.


s/MATCH/REPLACE/OPTIONS

являетсяседсинтаксис, вы можете захотеть иметь просто /MATCH/OPTIONSили MATCHи заменить его на REPLACE. Зависит от того, как вы планируете использовать регулярное выражение. Я считаю, что средний вариант будет работать лучше, учитывая ваше описание.

решение3

Я понятия не имею, поддерживает ли какая-либо реальная реализация регулярных выражений просмотр назад переменной длины, но в теории регулярное выражение будет выглядеть так (вторым аргументом функции замены будет пробел):

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

на практике анализаторы csv различают новые строки внутри строк (между двойными кавычками) и новые строки между строками, так что это не должно быть проблемой...

Однако можно пометить концы строк специальной последовательностью символов (например, «@@@»), затем заменить все новые строки \nпробелами , а затем заменить @@@новыми строками \n...

решение4

А как насчет VBS, который принимает на вход CSV-файл и выводит файл, но со строками, начинающимися с *** и заканчивающимися на ###, соединенными вместе?

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

Сохраните его в файл и запустите из командной строки следующим образом:

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

Пример входного файла:

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

Выводит следующий результат:

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

Связанный контент