質問: reader.readfields() ' 一行読込 dim currentfield as string for each currentfield in currentfields trace.writeline(currentfield) next catch ex as malformedlineexception messagebox.show(ex.message) end try end while end using end sub 'vbのコード ここまで------------------------------------ <読み込む固定長ファイル> 01やまだいちろう26 02やまだじろう 23 <実行結果> 01 やまだいちろう 26 02 やまだじろう 23 >reader.setfieldwidths(2, 7, 2) この部分を >reader.setfieldbytes(2,14,2) '関数名は適当 このように指定できないか、と考えています。
回答: もしかすると的外れかもしれないですが...... 要するに「02やまだ じろう 23」とか、半角が混じっているとおかしく なるので全角は二バイト文字として処理したいということでしょうか? > fileopen関数などではなく、あくまでもtextfieldparserを使用するのが前提です utf-8 などの必ずしも全角文字が 2 バイトと限らない文字コードを扱う 時点で「全角は 2 バイト」というのは破綻してしまうと思います。 # たしかに shift_jis なので全角は 2 バイトですが...... # 文字は全角も半角も一文字と数えるという仕様なのだと思われます。 一旦、一行全て読み込み、文字列をバイト配列に変換して処理するのは いかがでしょうか? 取り敢えず、こんな感じで貼られていたコードを部分的に変更してみま した。 ※ 見栄え上、全角文字列でインデントしてあります。 拙いコードですのが、ご容赦下さい。 rem 動作確認した時に関数にしたのでそのままです。 sub readfile() using reader as new textfieldparser("c:\test.txt", encoding.getencoding("shift_jis")) rem reader.textfieldtype = fieldtype.fixedwidth rem reader.setfieldwidths(2, 7, 2) reader.textfieldtype = fieldtype.delimited dim currentfields() as string while not reader.endofdata try rem currentfields = reader.readfields() ' 一行読込 rem 読み込みと同時に関数へ渡す currentfields = getfieldstring(reader.readline, "shift_jis", 2, 14, 2) dim currentfield as string for each currentfield in currentfields trace.writeline(currentfield) next catch ex as malformedlineexception messagebox.show(ex.message) end try end while end using end sub function getfieldstring(byref str as string, byref strencode as string, byval paramarray prams() as integer) as string() dim ipram as integer dim iindex as integer = 0 dim istrp as integer = 0 dim strarray as string() = {""} rem バイト配列に変換 dim bytearray as byte() = encoding.getencoding(strencode).getbytes(str) for each ipram in prams rem 文字列に変換して文字列の配列に格納 strarray(istrp) = encoding.getencoding(strencode).getstring(bytearray, iindex, ipram) istrp = istrp + 1 redim preserve strarray(istrp) iindex = iindex + ipram next rem 余分な配列を除く redim preserve strarray(istrp - 1) return strarray end function