![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_05.png?8acaa2e)
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
CloseとDisposeの違い
Visual Basic(VBA)
-
8
1行ごとに取得して、その改行文字が何か知る方法
Visual Basic(VBA)
-
9
VBの「As String * 128」とは?
Visual Basic(VBA)
-
10
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
11
【VB.NET】日付型の列にNULLを登録する方法について
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列から、null値を除去する方法
-
EXCELのVBAでLenB関数について
-
ファイル名の一部削除について
-
StrConvでUnicodeに変換出来な...
-
WSTRINGとは?
-
「シフトJIS X 0213」形式の文...
-
VB6.0 文字列のファイル書...
-
C言語とWin32APIで全角かなの...
-
ASC関数
-
CString型 全角半角を意識せず...
-
一番右のスペース以降の文字列...
-
HEX
-
文字の並び替え
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
Accessのフィールド名に半角括...
-
VBとアクセスでSQL文に変...
-
INT64対応のprintf系関数はあり...
-
Accessで別mdbのテーブルをコピー
-
C#で文字列を数値に変換する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル名の一部削除について
-
EXCELのVBAでLenB関数について
-
CString型 全角半角を意識せず...
-
TextFieldParserの固定長桁数を...
-
文字列から、null値を除去する方法
-
一番右のスペース以降の文字列...
-
StrConvでUnicodeに変換出来な...
-
エクセルで13,410円を数値の134...
-
機種依存文字と特殊文字について
-
アクセス ステータスバーの文...
-
VB6.0 文字列のファイル書...
-
VB6のテキストボックスに入力し...
-
「シフトJIS X 0213」形式の文...
-
ワードのVBAで
-
【Excel VBA】セル内テキストの...
-
VB.NET ListBox内の前方一致で...
-
HEX
-
8進数文字、16進数文字とは
-
WSTRINGとは?
-
VBからID3タグをいじる方法
おすすめ情報