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

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

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

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

4 ответа4

2

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

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
1
s/[\n\r ]+/ /g

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


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

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


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

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


s/MATCH/REPLACE/OPTIONS

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

0

Как насчет некоторого 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
0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .