この記事では、UTF-8形式のCSVファイルがBOM付きか特定する方法についてご説明します。
【動画】UTF-8形式のCSVファイルがBOM付きか特定する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
CSVファイルの1バイト目が「EF」、2バイト目が「BB」、3バイト目が「BF」か確認することでUTF-8形式のCSVファイルがBOM付きかを特定しています。
マクロ作成の流れ
1バイト目が「EF」、2バイト目が「BB」、3バイト目が「BF」である場合、BOM付きであることが分かります。
コードの例
Option Explicit Sub test() Dim chkFile As String 'BOMの有無を確認するファイル Dim fileNum As Integer 'ファイル番号用変数 Dim dataAry() As Byte 'ファイルからデータを格納するための配列 'BOMの有無を確認するファイル名を取得する chkFile = Worksheets("top").Range("chkFile").Value 'ファイル番号を取得する fileNum = FreeFile() 'ファイルをバイナリモードで開く Open chkFile For Binary Access Read As #fileNum '3バイト分で配列を再定義する(BOMの有無を特定するのに、1バイト目から3バイト目までのデータを確認するため) ReDim dataAry(1 To 3) '指定されたファイルハンドルで開かれたファイルから、先頭からバイト配列byteAryにデータを読み込ませる Get #fileNum, , dataAry If dataAry(1) = &HEF And _ dataAry(2) = &HBB And _ dataAry(3) = &HBF Then '①1バイト目がEFの場合 '②2バイト目がBBの場合 '③3バイト目がBFの場合 '以上の3つの条件を全て合致する場合 'BOM付きであることを知らせる旨のメッセージを出力する Worksheets("top").Range("BOMCheck").Value = "BOM付き" Else '3つの条件に合致していない場合 'BOM無しであることを知らせる旨のメッセージを出力する Worksheets("top").Range("BOMCheck").Value = "BOM無し" End If ' ファイルを閉じる Close #fileNum End Sub
注目すべきコード①
最初に見て頂きたいのは16行目です。
'ファイルをバイナリモードで開く Open chkFile For Binary Access Read As #fileNum
コードの説明
BOM付きか確認したいファイルをバイナリモードで開く処理のコードです。
BOM付きかどうかを確認するのにバイナリモードで開く必要があるため、Openメソッドを使ってファイルを開く際バイナリモードを指定します。
注目すべきコード②
次に見て頂きたいのは19行目から22行目です。
'3バイト分で配列を再定義する(BOMの有無を特定するのに、1バイト目から3バイト目までのデータを確認するため) ReDim dataAry(1 To 3) '指定されたファイルハンドルで開かれたファイルから、先頭からバイト配列byteAryにデータを読み込ませる Get #fileNum, , dataAry
コードの説明
以上のコードは、CSVデータの先頭から3バイトを取得して配列dataAryに格納する処理のコードです。
コードの詳細
19行目では、CSVデータの先頭から3バイトを取得して格納するための配列dataAryの要素を再定義しています。
22行目では、CSVデータの先頭から3バイトを取得して配列dataAryに格納しています。
注目すべきコード③
次に見て頂きたいのは24行目から43行目です。
If dataAry(1) = &HEF And _ dataAry(2) = &HBB And _ dataAry(3) = &HBF Then '①1バイト目がEFの場合 '②2バイト目がBBの場合 '③3バイト目がBFの場合 '以上の3つの条件を全て合致する場合 'BOM付きであることを知らせる旨のメッセージを出力する Worksheets("top").Range("BOMCheck").Value = "BOM付き" Else '3つの条件に合致していない場合 'BOM無しであることを知らせる旨のメッセージを出力する Worksheets("top").Range("BOMCheck").Value = "BOM無し" End If
コードの説明
以上のコードは、CSVファイルのデータから取得した3バイトを確認してBOMかどうかを特定する処理のコードです。
コードの詳細
24行目から26行目のコードは、1バイト目が「EF」、2バイト目が「BB」、3バイト目が「BF」かどうかを判定しているIF文です。
この1バイト目から3バイト目の判定条件に合致していればBOM付きなので34行目でBOM付きであることを知らせる旨のメッセージを出力しています。
もし1バイト目から3バイト目の判定条件に合致していなければBOM付きではないので、41行目でBOM無しであることを知らせる旨のメッセージを出力しています。
動作確認
今回は次のExcelファイルを用意しました。
A2の黄色のセルにはBOM付きか特定したいUTF-8形式のCSVファイル名をフルパスで入力します。
A5の黄色のセルには、BOM付きか特定した結果を出力します。
BOM付きなら「BOM付き」、BOMなしなら「BOMなし」と出力されます。
また、BOM付きか特定したいUTF-8形式のCSVファイルを以下の5つ用意しました。
- file1.csv:BOM付き
- file2.csv:BOMなし
- file3.csv:BOM付き
- file4.csv:BOM付き
- file5.csv:BOMなし
file2.csv:BOMなし
file3.csv:BOM付き
file4.csv:BOM付き
file5.csv:BOMなし
マクロ実行後
file1.csv:BOM付き「BOM付き」と出力されました。
file2.csv:BOMなし「BOMなし」と出力されました。
file3.csv:BOM付き「BOM付き」と出力されました。
file4.csv:BOM付き「BOM付き」と出力されました。
file5.csv:BOMなし最後に
この記事では、UTF-8形式のCSVファイルがBOM付きか特定する方法についてご説明しました。
UTF-8形式のCSVファイルがBOM付きなのか確認したい時は本記事を参考にしてみてくださいね。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。