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/OPTIONS
ou MATCH
e 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 \n
por 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