VBScriptでローカルファイルの読み書きを行う場合、以下の2つのオブジェクトを利用することができます。
- FileSystemObject(ファイルシステムオブジェクト)
- ADODB.Streamオブジェクト
両者の違いは、簡単にいうと扱える文字コードが違います。FileSystemObjectでは、ファイルを読み書きする際の文字コードとして、Shift_JISとUTF-16をサポートしています。一方、ADODB.Streamオブジェクトでは、Shift_JIS、EUCやUTF-8などの文字コードもサポートしています。
ファイル読み込む際に文字コードを自動判定する
ファイルを読み込む際に、文字コードを自動的に判定して読み込むには、ADODB.StreamオブジェクトのCharsetプロパティに"_autodetect_all"を指定します。これにより、ADODB.Streamがファイルの文字コードを自動判定して、適切な文字コードでオープンしてくれるそうです。*1
With CreateObject("ADODB.Stream") .Open .Charset = "_autodetect_all" .LoadFromFile("xxx.txt") data = .ReadText .Close End With
また、_autodetect_allを指定した場合に、lineseparatorの指定でうまくいかないことがありました。lineseparatorプロパティは、adCR、adCRLF、adLFの3つの値を指定することができますが、Windos標準のadCRLFを指定した場合でも、適切な箇所でデータを分割することができませんでした。
このため、以下のような改行コードを返す関数を作成し、ReadText関数で取得した全テキストデータに対して、改行コードでsplitを行い、1行分のデータを取得するようにしました。
Function GetLineSeparator(str) If Instr(str, vbCrLf) <> 0 Then GetLineSeparator = vbCrLf ElseIf Instr(str, vbLf) <> 0 Then GetLineSeparator = vbLf Else GetLineSeparator = vbCr End If End Function
参考サイト
*1:UTF-16など一部の保存形式で、誤判定するみたい。データによって誤判定するみたいで、たまに文字化けして正しく読み込めない場合がありました。