![](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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
【VB.Net】バイト型配列に読み込んで改行区切り
Visual Basic(VBA)
-
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
VB.NETにて、構造体へデータをセットするにはどうすればよいですか?
Visual Basic(VBA)
-
-
4
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
5
VB.NETでファイル名順にファイルを読む方法
Visual Basic(VBA)
-
6
データグリッドビューの一番最初の行に列を追加したい
Visual Basic(VBA)
-
7
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
8
Access:固定長文字列ファイルのインポートが正しく行われない
SQL Server
-
9
1行ごとに取得して、その改行文字が何か知る方法
Visual Basic(VBA)
-
10
CloseとDisposeの違い
Visual Basic(VBA)
-
11
【VB.NET】日付型の列にNULLを登録する方法について
SQL Server
-
12
配列の重複する値とその個数を取得したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル名の一部削除について
-
CString型 全角半角を意識せず...
-
機種依存文字と特殊文字について
-
EXCELのVBAでLenB関数について
-
一番右のスペース以降の文字列...
-
StrConvでUnicodeに変換出来な...
-
TextFieldParserの固定長桁数を...
-
VB.NET ListBox内の前方一致で...
-
Err.Number
-
文字列から、null値を除去する方法
-
VB6のテキストボックスに入力し...
-
エクセルのセル内の文字列から...
-
C言語とWin32APIで全角かなの...
-
VB6.0 文字列のファイル書...
-
VBA 変数名に変数を使用したい。
-
「Nullの使い方が不正です」の...
-
AccessからExcelへエクスポート...
-
VBAでアクセスDBからデータの取...
-
C#でbyte配列から画像を表示さ...
-
DataTableに特定のフィールドが...
マンスリーランキングこのカテゴリの人気マンスリー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関数
おすすめ情報