我将 Excel 文件导出为 CSV,其中确实有很多行。我用 *** 标记每行的开头,用 ### 标记每行的结尾。
*** some
text within
my cell to
export ###
有人能帮我用一些 RexEx 表达式从这个文本文件中删除 CRLF 吗
*** some text within my cell to export ###
答案1
使用宏来完成:
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
答案2
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
。取决于您计划如何使用正则表达式。我相信根据您的描述,中间一个最适合。
答案3
我不知道正则表达式的任何实际实现是否支持可变长度后视,但理论上正则表达式看起来像这样(替换函数的第二个参数将是一个空格):
(?<=\*\*\*[^#]*)\n(?=[^#]*###)
实际上,csv 解析器确实区分字符串内的新行(双引号之间)和行之间的新行,所以这应该不是问题......
但是,可以用特殊字符序列(例如“@@@”)标记行尾,然后\n
用空格替换所有新行,然后
@@@
用新行替换\n
...
答案4
那么,一些 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