Exporté un archivo de Excel a CSV y tengo muchas líneas múltiples dentro. Marqué el comienzo de cada línea con *** y el final con ###.
*** some
text within
my cell to
export ###
¿Alguien podría ayudarme con alguna expresión RexEx para eliminar el CRLF de este archivo de texto para que quede así?
*** some text within my cell to export ###
Respuesta1
Lo hice con una 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
Respuesta2
s/[\n\r ]+/ /g
Esto reemplazará globalmente cualquier espacio, retorno de carro y nueva línea) [\n\r ]+
por un espacio ( ).
s/\*\*\(*.*)[\n\r ]+(.*)###/$1 $2/g
Esta es una versión de la anterior que sospecha tu frase al principio ***
y al final ###
.
s/^\*\*\*(.*)[\n\r ]+(.*)###$/$1 $2/g
Esta es una versión de la anterior que también se asegura de que ***
comience al principio de una línea y ###
termine al final de la línea. Uno de estos debe coincidir con lo que desea.
s/MATCH/REPLACE/OPTIONS
essedsintaxis, es posible que desee tener solo /MATCH/OPTIONS
o MATCH
y reemplazarlo por REPLACE
. Depende de cómo planees utilizar la expresión regular. Creo que el del medio funcionaría mejor dada tu descripción.
Respuesta3
No tengo idea si alguna implementación real de expresiones regulares admite la búsqueda hacia atrás de longitud variable, pero en teoría la expresión regular se vería así (el segundo argumento de una función de reemplazo sería un espacio):
(?<=\*\*\*[^#]*)\n(?=[^#]*###)
en la práctica, los analizadores csv diferencian entre líneas nuevas dentro de cadenas (entre comillas dobles) y líneas nuevas entre filas, por lo que esto no debería ser un problema...
sin embargo, es posible marcar los finales de las filas con una secuencia de caracteres especiales (por ejemplo, "@@@"), luego reemplazar todas las líneas nuevas \n
con espacios y luego reemplazar
@@@
con líneas nuevas \n
...
Respuesta4
¿Qué tal un VBS que toma la entrada de un archivo CSV y genera el archivo pero con líneas que comienzan en *** y terminan en ### 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
Guárdelo en un archivo y ejecútelo desde la línea de comando de la siguiente manera:
cscript //NOLOGO nameofscript.vbs <name of csv file> > <new file>
Archivo de entrada de muestra:
the quick brown
*** some
text within
my cell to
export ###
fox jumps
***over
the
lazy###
dog
one two three
Produce el siguiente resultado:
the quick brown
sometext withinmy cell toexport
fox jumps
overthe lazy
dog
one two three