読者です 読者をやめる 読者になる 読者になる

DuKiccoの雑記

My Life Is Myself

【改行コードの変換「LF」→「CR」】【ファイルサイズが大きな場合】【エクセル2013,VBA】

改行コードがLFでファイルサイズが大きいテキストファイルをVBAで扱う方法を説明する。

 

WindowsLinuxでは、改行コードが異なる。


 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