改行コードCRLFとLFが混在するファイルからLFだけ削除したい時

些細なTipsですが。

Windows環境なら大体が改行コード「CRLF」で統一されているけれど、たまに「CRLF」と「LF」が混在するファイルがあります。そんな時に「LF」の改行コードだけ削除する方法です。

CONTEMTS

1.削除する方法の種類
2.テキストエディタの正規表現で置換
3.vbsなどのスクリプトで置換
4.用途
5.まとめ

1. 削除する方法の種類

今回紹介する方法は以下の2種類です。

 ①テキストエディタの正規表現で置換

 ②vbsなどのスクリプトで置換

2. テキストエディタの正規表現で置換

大体の高機能テキストエディタは正規表現と置換の機能があるので、この二つの機能を使います。今回はサクラエディタでやっていますが、TeraPadでも秀丸でも同じですね。

「CRLF」と「LF」が混在しているファイルをサクラエディタで開き、「CTRL」キー + 「R」キーで置換ウィンドウを表示。

これで「LF」の改行コードが削除されます。
ただ、改行コード「CRLF」に含まれている「LF」の部分まで消えて「CR」の改行コードになってしまうので、同じ要領で「CR」を「CRLF」に置換して戻します。

もう一度「CTRL」キー + 「R」キーで置換ウィンドウを表示。
置換前の欄に「\r」を、置換後の欄に「\r\n」にして、正規表現(E)のチェックをオンにして「ALT」キー + 「A」キー で全て置換を実行。

これで「CR」に変わってしまった箇所が「CRLF」改行コードに戻ります。

3. vbsなどのスクリプトで置換

スクリプトにも色々ありますけれど、Windows環境ならvbsが使えますので
ここでは、Windowsのbatスクリプトと、VbsでLF改行コードを削除します。
流れはテキストエディタでやった方法と同じで、LFを削除してから、残ったCRをCRLFに置換します。

置換するファイル[改行コード混在.txt]

用意するbatスクリプトファイル
[LFDEL.bat]

@echo off
@rem ----------------------------------------------------------
@rem -
@rem - 入力ファイルから改行コード「LF」を削除
@rem -
@rem ----------------------------------------------------------
@rem カレントディレクトリ設定
set CMD_PATH=%~dp0

@rem ファイルディレクトリ設定
set FILEDIR=%CMD_PATH%

@rem 入力ファイル設定 ※ここの入力ファイル名は適宜変えてください。
set IFILE001=改行コード混在.txt

@rem 出力ファイル設定
set OFILE001=改行コードLF削除.txt

@rem ----------------------------------------------------------
@rem LFDEL:LF改行コードの削除
@rem ----------------------------------------------------------
cscript //nologo LFDEL.vbs %FILEDIR%%IFILE001% > %FILEDIR%%OFILE001%

@rem ----------------------------------------------------------
@rem NOTEPAD:出力ファイル オープン(メモ帳)
@rem ----------------------------------------------------------
NOTEPAD %FILEDIR%%OFILE001%

@rem ----------------------------------------------------------
@rem EXIT:終了処理
@rem ----------------------------------------------------------

EXIT

用意するvbsファイル
[LFDEL.vbs]

Option Explicit
' -------------------------------------------------------------
' 入力ファイルから改行コードLFを削除して出力
' 引数 入力ファイル(フルパス)
' -------------------------------------------------------------
Dim objArgs
Dim objFS
Dim objText

Dim argTextFile
Dim strData

' 入力ファイル設定(フルパス指定)
Set objArgs = WScript.Arguments
argTextFile = objArgs(0)

Set objFS = CreateObject("Scripting.FIleSystemObject")
Set objText = objFS.OpenTextFile(argTextFile)

If objText.AtEndOfStream = False Then
strData = objText.ReadALL

' -------------------
' LF改行コードの削除
' -------------------
' 一旦、LFコードを空欄に置換することで削除。
strData = Replace(strData, vbLf, "")

' LFコードを削除したことで、CRLF部分がCRコードのみになるので
' CRコードをCRLFに再度置換することにより、
' 結果的に元々LFコードのみだった箇所が消える。
strData = Replace(strData, vbCr, vbCrLf)

' ファイルを出力
WScript.echo strData

End If

' 終了処理
objText.Close
Set objArgs = Nothing
Set objText = Nothing
Set objFS = Nothing

上記の3ファイル(置換するファイル、batファイル、vbsファイル)を同じフォルダに配置します。
ここでは「LFDEL」というフォルダをデスクトップに作って配置してます。

配置したbatファイル「LFDEL.bat」を実行すると、入力ファイルからLFコードを削除した内容が出力ファイルとして作成されます。
ここで記述したbatファイルだと、処理の終了前に出力ファイルをメモ帳で開くようになっており、メモ帳を閉じるとプロンプトが終了します。

メモ帳のオープンが必要なければ「NOTEPAD」の行を消してください。

4. 用途

LFコードを削除する方法については今回の2パターンを使っていますが、大体はテキストエディタで済ませてます。
僕が良く使うシーンとしては、エクセルのセル内で改行しているデータをテキストファイルに起こす時ですね。


こんな風にセルの中で改行しているデータをコピーしてテキストファイルにすると。


こんな感じ(今回、手順の説明で使ったファイルも同じ方法で作ったファイルです)で、変なところで改行されちゃうのでこれを整形するのにはテキストエディタでやるのが手軽です。

じゃあ、わざわざスクリプトを用意する方法はどんな時に使うの?ってところなんですけど、これは簡単なチェックを自動化した際、結果ログに改行が混在しちゃう時とか、高機能テキストエディタとかソフトを勝手にインストール出来ない端末とかの作業などで使ってます。

5.まとめ

今回の方法。そのまま使うと、改行コードCRが混在してるパターンだと、うまく使えないのでそこは変える必要があります。たぶん正規表現のパターンも、もっといいパターンあるかもですけどとりあえずは使えるんじゃないかと。

あと下図みたいにCRLF、CR、LFの3種類の改行コードが混在してるファイルにも使えないですね。仕事上でそんなファイルは今まで見たことないですけどね。


VBScriptポケットリファレンス