CSVファイルを読み込む場合、保存方法等で問題が起こることがあります。
目次
保存方法の違い
文字コードを変えて保存した csvファイル です。
- 上:ANSI
- 下:UTF-8
このファイルをダブルクリックで開いた場合
文字コードの問題ではないですが、両方とも先頭が0で始まる数字は0なしで表示されます。
参考:CSVファイルを開くと0で始まるデータが0なしで表示される
- 上:ANSI
- 下:UTF-8
UTF-8の問題点
- 文字化け:UTF-8
- 5列で表示されるデータだが4列で表示されている
- データがずれている
Line Input # ステートメントでデータを配列に格納した場合の問題
次のマクロを実行した場合、UTF-8で保存したcsvファイルは問題があります。
コードの最後に「stop」を入れています。
Sub sample() Dim fName As String Dim lastR As Long, lastC As Long Dim buf As String, tmp As Variant, ary() As Variant Dim r As Long, c As Long, i As Long, cnt As Long fName = "F:\sample\csvコンマ区切り.csv" lastR = CreateObject("Scripting.FileSystemObject").OpenTextFile(fName, 8).Line ReDim ary(lastR - 2, 4) As Variant Open fName For Input As #1 Do Until EOF(1) Line Input #1, buf tmp = Split(buf, ",") For c = LBound(tmp) To UBound(tmp) ary(r, c) = tmp(c) Next c r = r + 1 Loop Close #1 stop End Sub
8行目
最終行のデータがわからない前提です。次のコードで最終行を取得します。
lastR = CreateObject("Scripting.FileSystemObject").OpenTextFile(fName, 8).Line
9行目
4行目の「dim ary() As Variant」の動的配列のサイズ変更です。
ReDim ary(lastR - 2, 4) As Variant
ファイルの末尾は6行目の「EOF」です。配列は0からはじまるので、行数は「lastR - 2」で列数は固定という前提で「4」にしています。
ANSI
ローカルウィンドウで確認すると、問題なく配列に格納されています。
UTF-8
文字化けしたまま配列に格納されます。
ローカルウィンドウ
もう一つの問題は、3行目と4行目を1行として読込んでいるので、配列「ary」の大きさを超えてしまってます。