Excel からの CSV エクスポートから CRLF を削除する正規表現

Excel からの CSV エクスポートから CRLF を削除する正規表現

Excel ファイルを CSV にエクスポートしましたが、その中には複数行が多数あります。各行の先頭を *** でマークし、末尾を ### でマークしました。

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

誰か、このテキストファイルからCRLFを削除して次のようになるRexEx式を教えてもらえませんか?

*** 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

正規表現の実際の実装が可変長の後読みをサポートしているかどうかはわかりませんが、理論的には正規表現は次のようになります (置換関数の 2 番目の引数はスペースになります)。

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

実際には、csv パーサーは文字列内の新しい行 (二重引用符の間) と行間の新しい行を区別するため、これは問題にならないはずです...

\nただし、行の終わりを特殊な文字シーケンス (例: "@@@") でマークし、すべての新しい行をスペースに置き換えてから、@@@新しい行に置き換えることは可能です\n...

答え4

CSV ファイルの入力を受け取り、*** で始まり ### で終わる行を結合してファイルを出力する VBS はどうでしょうか?

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

関連情報