固定長textに全角文字(2バイト)が含まれている場合の取り出しで

タグの編集
投稿者 Fredee  (社会人) 投稿日時 2008/12/11 07:30:36
お世話になっております!!
固定長テキストファイルに日本語(2バイト)文字が有ると、フィールドの指定が変わってしまいます。
例えば、C:\text.txt に
12345あいアイウ678うえお
のレコードがあって、12345 , あいアイウ , 678 , うえお を取り出すのに次のようにしています。
'-----  ストリームリーダー定義  -----
Dim SrFile As StreamReader
Dim Sline As String

Dim A1 As String   '12345 を格納 ← 問題なし
Dim J1 As String   'あいアイウ を格納 ← 全角と半角が混在すると以降の指定が変わります
Dim A2 As String   '678 を格納したい ← 13桁目
Dim J2 As String   'うえお を格納したい ← 16桁目

SrFile = New StreamReader("C:\text.txt", Encoding.Default)
Sline = SrFile.ReadLine
While Not Sline Is Nothing
    If Sline.Length <> 0 Then
        A1 = Mid(Sline, 1, 5).ToString 
        J1 = Mid(Sline, 6, 5).ToString   '全角半角が混在したり、半角だけ等で以降の指定が
        A2 = Mid(Sline, 11, 3).ToString  '変わります
        J2 = Mid(Sline, 14, 3).ToString   
    End If
    Sline = SrFile.ReadLine
End While
この時、J1の部分に半角だけの時や全角の文字数が変わった場合に、A2,J2の取り出し位置が変わります。
全角は2バイトで数えて、フィールドの指定カラムを変えないで数える方法はありますか?
Excel VBAではバイトで数える関数がありますが、VB.NETにはないのでしょうか!!
説明が十分でないかも知れませんが、何方かご教授をお願いします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2008/12/11 08:00:52
固定長という事は、切り出すバイト位置も分かっているでしょうから、
いっそ、バイナリとして処理するのはどうでしょうか。

Dim A1 As String    ' 0~ 4 の5バイト:12345 
Dim J1 As String    ' 5~11 の7バイト:あいアイウ 
Dim A2 As String    '12~14 の3バイト:678 
Dim J2 As String    '15~20 の6バイト:うえお 

Dim bytes() As Byte = My.Computer.FileSystem.ReadAllBytes("C:\text.txt")
Dim enc As Encoding = Encoding.Default
If UBound(bytes) >= 20 Then
    A1 = enc.GetString(bytes, 0, 4)
    J1 = enc.GetString(bytes, 5, 7)
    A2 = enc.GetString(bytes, 12, 3)
    J2 = enc.GetString(bytes, 15, 6)
End If
投稿者 Fredee  (社会人) 投稿日時 2008/12/11 17:41:31
魔界の仮面弁士さん、ご教授有難う御座いました!!

具体的な記述のバイナリ処理説明で助かりました。
今回、バイナリ処理の方法を知ることが出来て感謝しています。
今後とも、宜しくお願い致します!
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2008/12/11 18:17:52
一ヶ所修正。

 Dim A1 As String    ' 0~ 4 の5バイト:12345  

' (中略) 

'A1 = enc.GetString(bytes, 0, 4)   'これだと"1234"しか取れない。 
 A1 = enc.GetString(bytes, 0, 5)   'これなら"12345"が得られる。