|
▼kanabun さん:
メール確認していなくて、お礼遅くなりました。
詳細にありがとうございます。
私の知識では
ゆっくりゆっくり読み解かないとすぐには理解できないのですが^_^;
とにかくバグる可能性があるということですね。
ありがとうございます!
またよろしくお願いいたします。
>▼es さん:
>>▼UO3 さん:
>
>解決後ですが、今しがた気づいたことで失礼します。
>
>> temp = Space(FileLen(myfilenames(i)))
>>
>> Open myfilenames(i) For Binary As #i
>>
>> Get #i, , temp
>>
>> Close #i
>>
>> d = Split(temp, vbCrLf)
>
>ですが、ちょっとまずいと思います。
>例として、
>---------------------------------------
>ABCDE<改行>
>あいうえお<改行>
>---------------------------------------
>のような2行のテキストファイルを例として考えてみます。
>
>まず、
>> temp = Space(FileLen(myfilenames(i)))
>により、このファイルの長さの分だけのスペースが 文字列型変数temp
>にセットされます。ファイルの長さ(FileLen)はバイト長で表示されます。
>例に挙げたテキストファイルでいえば このファイルの長さすなわちバイト長は
> 1行目が 5バイト+2
> 2行目が 10バイト+2 (+2 は改行コード分)
>で 合計 19バイトです。
>ですので、上の一行は 今回の例では
> temp = Space$(19)
>ということになります。
>で、(ここが重要なのですが)Space$(19) ということは 19個のスペース
>を確保という意味で、19バイト確保ではない----これが第1のポイントです。
>Windowsのテキストファイルは 文字コードが ShiftJIS ですが、VBA内では
>文字コードは Unicode で処理されます。
>どういうことかというと、
>ファイル上の "A" は1バイトですが Unicode に変換されると "A" は2バイト
>になるということです。ファイル上の1バイトが2バイトになるということです。
>ですから、バイト単位でスペースを用意すると考えると、
>半角英数字のばあいは "A" という1バイトが VBA上で "A"という2バイトに変換
>されるから、問題ないのですが、
>全角コードのばあい たとえば「あ」という1文字2バイト が Unicode でも文字
>数・バイト数ともに変わらなく 1文字2バイト のままなので、上のテキストファ
>イルを
> temp = Space$(19)
>で19文字分のスペースを用意して読み込むと、「あいうえお」の分だけスペース
>が余ってきます。
>
> テキストファイル メモリ (Unicode)
>char バイト char バイト
>-------- ---- ---- -------
>A 1 A 2
>B 1 B 2
>C 1 C 2
>D 1 D 2
>E 1 E 2
><改行> 2 <改行> 4
>あ 2 あ 2
>い 2 い 2
>う 2 う 2
>え 2 え 2
>お 2 お 2
><改行> 2 <改行> 4
>
>上の表から分かる通り、Unicodeとして必要なのは19文字38バイトではなく、
>「14文字 28バイト」なのです。
>Unicode変換するのに必要な長さは バイト長ではなく、実は文字長なのです。
>ところが、ファイルの長さ情報は 文字数ではなく、FileLenで得られるような
>バイト長しかありませんから、そもそも String型の変数をスペースで文字数分
>初期化しておいて、そこにUnicode変換した文字を埋め込むという方法は
>テキストが2バイトコードを含むときには うまくいきません。(用意されたス
>ペースは必要な数より漢字の個数分、余ってきます)
>
>
>あと、もうひとつ。
>
>> d = Split(temp, vbCrLf)
>
>> .Cells(1, "A").Resize(UBound(d)).Value = _
> WorksheetFunction.Transpose(d)
>ですが、
>たとえば、
>"ABCDE▼1234▼あいうえお▼"
>という文字列を Split(temp, "▼") で 分割しますと、
>添字は (0) から始まりますから、
>
>(0) "ABCDE"
>(1) "1234"
>(2) "あいうえお"
>(3) ""
>
>となります。UBbound(d) は 3 なのです。 もっとも UBound(d) である (3)
>は 最後の改行コード▼ のさらにあとで、Empty ですから、これは シートに
>貼り付ける必要はないので、 (0)〜 (2) までの 3行を貼り付ける、というこ
>とになるので、
>> .Resize(UBound(d))
>というのは 結果オーライ ではあるのですが。
>
>なので、文字列型変数にGet# はしなくて、バイト型配列に Get# してから
>あとで Unicode文字列に変換します。こうすれば、お尻に余分なスペースが
>つくことはありませんし、スピードもずっと速いです。
>
> Dim buf() As Byte
> Dim Filename As String
> Dim io As Integer
> Dim strArry As Variant
> Dim i As Long
>
> io = FreeFile()
> Open Filename For Binary As io
> ReDim buf(1 To LOF(io))
> Get io, , buf
> Close io
> strArry = Split(StrConv(buf, vbUnicode), vbCrLf)
>
> For i = 0 To UBound(strArry) - 1
> Debug.Print strArry(i)
> Next
|
|