![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_05.png?5a7ff87)
TextFieldParserによる固定長テキストファイルの読込で、
桁数を文字数ではなく「byte数」で指定する方法を教えてください。
(FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です)
以下に、文字数指定による読込のコードを記述します。
よろしくお願いします。
'VBのコード-----------------------------------------------
Public Shared Sub Main()
Using reader As New TextFieldParser("C:\test.txt", Encoding.GetEncoding("SHIFT_JIS"))
reader.TextFieldType = FieldType.FixedWidth
reader.SetFieldWidths(2, 7, 2)
Dim currentFields() As String
While Not reader.EndOfData
Try
currentFields = 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) '関数名は適当
このように指定できないか、と考えています。
No.1ベストアンサー
- 回答日時:
もしかすると的外れかもしれないですが……
要するに「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
回答いただきありがとうございます。
やはりTextFieldParser自体には、SHIFT_JISでの全角を2byteで扱えるような機能はないという事のようですね。
固定長やCSVを読み込むことに特化したクラスなのでもしや、
と思ったのですが…
しかし、x415f484fさんに提示していただいたコードは代替案として
たいへん参考になります。
TextFieldParserにこだわらず、一行丸々読み込んでから
バイト配列に入れてしまえばよかったんですね。
VBFixedStringとFileOpenを使う方法などを模索していましたが、
こちらのほうがしっくりきそうです。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
【VB.Net】バイト型配列に読み込んで改行区切り
Visual Basic(VBA)
-
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
-
4
Access:固定長文字列ファイルのインポートが正しく行われない
SQL Server
-
5
データグリッドビューの一番最初の行に列を追加したい
Visual Basic(VBA)
-
6
VB.NETにて、構造体へデータをセットするにはどうすればよいですか?
Visual Basic(VBA)
-
7
1行ごとに取得して、その改行文字が何か知る方法
Visual Basic(VBA)
-
8
CloseとDisposeの違い
Visual Basic(VBA)
-
9
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
10
【VB.NET】日付型の列にNULLを登録する方法について
SQL Server
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル名の一部削除について
-
EXCELのVBAでLenB関数について
-
CString型 全角半角を意識せず...
-
アクセス ステータスバーの文...
-
【Excel VBA】セル内テキストの...
-
VB6.0 文字列のファイル書...
-
VB.NET ListBox内の前方一致で...
-
機種依存文字と特殊文字について
-
文字列から、null値を除去する方法
-
一番右のスペース以降の文字列...
-
「シフトJIS X 0213」形式の文...
-
エクセルで13,410円を数値の134...
-
StrConvでUnicodeに変換出来な...
-
テキストファイルのフィールド...
-
VBA 変数名に変数を使用したい。
-
VBとアクセスでSQL文に変...
-
accessでフィールド追加のあと...
-
C#でbyte配列から画像を表示さ...
-
【C#】textBoxの指定行のデータ...
-
COBOLの基本的な事なので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
ファイル名の一部削除について
-
StrConvでUnicodeに変換出来な...
-
CString型 全角半角を意識せず...
-
TextFieldParserの固定長桁数を...
-
アクセス ステータスバーの文...
-
VBからID3タグをいじる方法
-
一番右のスペース以降の文字列...
-
VB6のテキストボックスに入力し...
-
文字列から、null値を除去する方法
-
エクセルで13,410円を数値の134...
-
VB6.0 文字列のファイル書...
-
ワードのVBAで
-
「シフトJIS X 0213」形式の文...
-
VBScriptで半角カナと半角英数...
-
【Excel VBA】セル内テキストの...
-
機種依存文字と特殊文字について
-
VB.NET ListBox内の前方一致で...
-
バイナリデータの取り方
-
ASC関数
おすすめ情報