RegEx para eliminar CRLF de la exportación CSV desde Excel

RegEx para eliminar CRLF de la exportación CSV desde Excel

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/OPTIONSo MATCHy 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 \ncon 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

información relacionada