【改行コードの変換「LF」→「CR」】【ファイルサイズが大きな場合】【エクセル2013,VBA】
改行コードがLFでファイルサイズが大きいテキストファイルをVBAで扱う方法を説明する。
WindowsとLinuxでは、改行コードが異なる。
Windows→CRLF(キャリッジリターン+ラインフィード)
Linux →LF(ラインフィード)
Linuxで作成したテキストファイルをエクセルVBAで利用するときに改行コードを置換したい場合があるのだがいくつ方法がある。
1.Linux側でLFをCRLFに置換する。
2.適当なソフトを使用しWindows側でLFをCRLFに置換する。
3.VBAでLFをCRLFに置換する。
今回のケースはネットからWindowsマシンに落としてきたファイル(NCBIのGeneBank形式ファイル)の改行コードがLFで、これをVBAでアクセスまたはエクセルに取り込むことが目的である。余計なステップが入るので2は除外だし、いきなりWindowsマシンなので1もない。
ファイルサイズが小さな場合
改行コードがLFだと1行しかないとみなされるので、どのような読み込み方しても結果的にはかわらないが、ふつうにLine Inputか何かで読み込んでLFをCRLFにReplaceしてしまうかLFでSplitしてしまえばよい。
LFコードで改行したファイルを読み込む:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
ファイルサイズが大きな場合
ファイルサイズが大きな場合、メモリが足りなくなるのでLine Inputではテキスト型に読み込めなくなる。
そこで
1.Getステートメントでバイト型配列にバイナリデータとして読み込む
2. LFをCRに置換したテキストファイルを一時的に作成
3.このファイルをLine Inputで読み込む
以上の手順でNCBIのGeneBank形式ファイルをアクセスやエクセルに取り込むことができた。
以下置換ファイルを作成するコード。ただし、本当にこれでいいのかがよくわからない。他にVBAのみで解決する簡単な方法があればご教授願いたい。いちおう300MB程度でも動作はしている。
==============================================================
Sub 置換()
Dim buffer() As Byte
Dim tmp As Variant, tmp2 As Variant
Dim i As Long
Open ファイル名1 For Binary As #1 'バイナリーで開き読み込み
ReDim buffer(1 To LOF(1)) 'ファイルのサイズ分だけ領域確保
Get #1, ,buffer 'バイト型配列に読み込み
Close #1
'バイト型配列を順に置換していく
For i = 1 to ubound(buffer)
if buffer(i)=10 then 'LFなら
buffer(i)=13 'CRに置換
End if
Next
Open ファイル名2 For Binary As #1 'バイナリーで開き書き込み
Put #1,1 ,buffer 'バイト型配列を書き込み
Close #1
'ファイル名2はLine Inputで一行ごとに読み込めるので何とでもなる。
End Sub