固定長textに全角文字(2バイト)が含まれている場合の取り出しで
投稿者 魔界の仮面弁士  (社会人)
投稿日時
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"が得られる。
固定長テキストファイルに日本語(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にはないのでしょうか!!
説明が十分でないかも知れませんが、何方かご教授をお願いします。