RegEx para remover CRLF da exportação CSV do Excel

RegEx para remover CRLF da exportação CSV do Excel

Exportei um arquivo Excel para CSV e tenho muitas linhas múltiplas. Marquei o início de cada linha com *** e o final com ###.

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

Alguém poderia me ajudar com alguma expressão RexEx para remover o CRLF deste arquivo de texto para obtê-lo

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

Responder1

Fiz isso com uma macro:

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

Responder2

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

Isso substituirá globalmente quaisquer espaços, retornos de carro e novas linhas) [\n\r ]+por um espaço ( ).


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

Esta é uma versão da anterior que suspeita que sua frase comece ***e termine com ###.


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

Esta é uma versão da anterior que também garante que ***começa no início de uma linha e ###termina no final da linha. Um deles deve corresponder ao que você deseja.


s/MATCH/REPLACE/OPTIONS

ésedsintaxe, você pode querer ter apenas /MATCH/OPTIONSou MATCHe substituí-lo por REPLACE. Depende de como você planeja usar a expressão regular. Acredito que o do meio funcionaria melhor, dada a sua descrição.

Responder3

não tenho ideia se alguma implementação real de regex suporta lookbehind de comprimento variável, mas em teoria o regex ficaria assim (o segundo argumento de uma função de substituição seria um espaço):

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

na prática, os analisadores csv diferenciam entre novas linhas dentro de strings (entre aspas duplas) e novas linhas entre linhas, então isso não deve ser um problema...

entretanto, é possível marcar o final das linhas com uma sequência de caracteres especial (por exemplo, "@@@"), depois substituir todas as novas linhas \npor espaços e, em seguida, substituir @@@por novas linhas \n...

Responder4

Que tal um VBS que recebe a entrada de um arquivo CSV e gera o arquivo, mas com linhas começando em *** e terminando em ### unidas?

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

Salve-o em um arquivo e execute-o na linha de comando da seguinte maneira:

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

Exemplo de arquivo de entrada:

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

Produz a seguinte saída:

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

informação relacionada