
プログラムを最近、始めなければならなくなった初心者です。
一行の長い文字列を指定の文字数で分割するプログラムを書かなければならないのですが。どうしても文字数がずれてしまいます。
webを参考に下記のようなプログラムを書いてみました。
Public Class Form1
Public NN As Long = 1
Dim sR As New IO.StreamReader("C:\testtex.DAT",System.Text.Encoding.GetEncoding("shift_jis"))
Dim AR As String, AT As String
AT = sR.ReadToEnd
NN = NN + 指定文字数
AR = Strings.Mid(AT, NN, 指定文字数)
TextBox1.Text = AR
sR.Close()
文字列は(Shift_jis)型のようです。データの無い部分にはスペースが含まれています。これが原因かは分かりませんが
Left関数や、Mid関数を利用して分割する方法では文字数がずれてしまいます。
Textpad等のテキスト編集アプリを利用して文字数を調べたところ文字数と桁数に違いがあるようです。
文字数と桁数の違いに何かあるような気がするのですが検索してもそれらしきがみつかりません。
LenやLengthで全体の文字数を調べてみたところ全体の文字数もずれているようです。(指定文字数の倍数にならない。TextPadで調べた桁数と1違います。)
.DATという拡張子ですが、送られてくるデータがDATという拡張子で送られてくるため原因かもしれないのでそのままにしています。
指定文字数ごとに分割することは可能なのでしょうか。可能であればどのような方法でもいいのでご教授ください。よろしくお願いします。
No.3ベストアンサー
- 回答日時:
* Shift_Jisの固定長データでは、いわゆる「全角文字」通常2桁、「半角文字」は1桁として扱うが、VBのStringでは両方とも1文字として扱われるというのは理解してます?
* 日本語項目で、余白は全角スペースで埋められているのか?それとも半角スペース2つで埋められているのか?
→全角スペースなら「文字数」は一定になるはずです。
とりあえずこのあたりが参考になる?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。
説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。
ご回答頂いた皆様ありがとうございました。
No.4
- 回答日時:
内容とは少しずれますが
>具体的には約300万桁くらいの文字列を
300万文字を一度に文字変数として扱えるのでしょうか?
ちょっと無理な気もしますが。
最大でせいぜい6万文字程では?
お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。
説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。
ご回答頂いた皆様ありがとうございました。
No.2
- 回答日時:
はじめまして
>データの無い部分にはスペースが含まれています。
スペースは一文字(全角スペース、半角スペースともに一文字)として
認識されます。
改行文字も一文字として認識されます。
ReadToEnd で読み出したテキストの中のこういったものは
Replace関数を使って取り除きます。
--略--
AT = sR.ReadToEnd
'-----改行文字の除去------
AT=AT.Replace(VbCrLf,"")
AT=AT.Replace(Cr,"")
AT=AT.Replace(Lf,"")
'-----スペースの除去------
AT=AT.Replace(" ","") '半角スペース除去
AT=AT.Replace(" ","")'全角スペース除去
NN = NN + 指定文字数
AR = Strings.Mid(AT, NN, 指定文字数)
sR.Close()
改行文字にはテキストエディタやMacやLinuxなどによって
CRとLf VBではVbCrLfなど違いがあります。
改行文字を認識させないために
ReadToEndではなく
ReadLineで一行づつ読み込み
AT=AT+sR.ReadLine
としたほうが間違いがないかも知れません。
--略--
Do While Not sR.EndOfStream
AT=AT+sR.ReadLine
Loop
sR.Close()
'-----スペースの除去------
AT=AT.Replace(" ","") '半角スペース除去
AT=AT.Replace(" ","")'全角スペース除去
NN = NN + 指定文字数
AR = Strings.Mid(AT, NN, 指定文字数)
この回答への補足
お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。
説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。
ご回答頂いた皆様ありがとうございました。
はじめまして。
回答いただきありがとうございます。私の知識不足かもしれませんがReplace関数で空文字列と入れ替えてみたのですが思っていたような結果が得られませんでした。
実は、スペースにについても、情報として扱いたいのでそのまま残しておきたいんです。指定文字数で分けた後にそれぞれのデータの持っている値を、作成したマスタを元に変換します。(例えば35番目から48番目のデータは名前(漢字)など)エクセルの固定長のデータ取り込みのイメージに近いかと思います。
具体的には約300万桁くらいの文字列を2000前後の文字列に分解して3000前後で一単位のデータとして扱います。
詳しくは、私のいる業界の関係者であればたぶん分かってしまいますので伏せさせていただきますが。簡単に例を書いてみます。
※データの中身(....の部分には同じようなデータが入ります。)
(ここから→) HB00000100010 0 1 00 ...{...}物流 太郎.........ブツリュウ タロウ.000101000.....(←ここで一単位)GM00000100010 0 1 00 ...{...}物流 花子.........ブツリュウ ハナコ.000101000.....
上記の様な形式のデータになります。それぞれ一文字がスペースも含めて意味を持っています。指定文字数(桁数?)で分割すればどのデータについても同じ形式になります。
LeftやMid関数ではスペースの文字数を数えているはずなのでずれるはずが無いと思っていたのですがなぜかずれてしまいます。
改行コード等含んで数えるのであれば尚のことですがデータ全体の桁数が実際あるべき桁数から減るのはおかしいかなと素人ながら考えます。増えるなら分かるのですが・・・何か特殊なデータの形式を使用しているケースというのは考えられますでしょうか。
ちなみに物流系の業界ではありませんのであしからず^^;
No.1
- 回答日時:
C:\testtex.DAT
のファイルに、コントロールコードが入っていませんか
改行コードでも、一文字にカウントされますよ。
例えば以下のコードでは三文字になります。
Dim mes As String = vbCr + vbCrLf
Debug.Print(Len(mes))
ノートパッドでは、何も表記されないかも
この回答への補足
お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。
説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。
ご回答頂いた皆様ありがとうございました。
早速のご回答ありがとうございます。
コントロールコードについてですが桁数には含まれず文字数だけに含まれるという理解でよろしいでしょうか。(桁数より文字数のほうが多いので)
ということはLen、Length、Left、Right、Mid等の関数に関しては、文字数ではなく、桁数をカウントしているということなりますかね・・・
コントロールコードを含んで文字数の指定をしたいので自身でも何かしら方法を探してみます。もしご存知でございましたらご教授願えると非常にありがたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA初心者です 検索した数字の行に色をつける 5 2023/02/13 14:22
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Excel(エクセル) LEFT関数で文字数を指定しないで取りだす方法 7 2023/06/30 09:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 文字に半角が含まれて...
-
JISの全角判定処理について
-
cmdの日本語入力
-
英数字のみ全角から半角に変換
-
全角英数字を半角にしたいんです。
-
住宅にカナを入力する際に丁目...
-
引用符(コーテーション)が勝...
-
全角英数字の必要性が理解できない
-
VBで「全角」文字を「半角」に...
-
HTMLでスペース部分を作るには
-
ログインする際のIDやパスワー...
-
i-podのアーティスト名の重複
-
ソニーミュージックアーティス...
-
Ddreamweaver MX&8 コーディン...
-
全角数字、アルファベット大小...
-
Format関数でこんなにカンタン...
-
excel 通貨表記を全角で・・・
-
LEN関数について。
-
Excel VBAでオートシェイプ内の...
-
OpenOfficeにおいての全角スペ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
住宅にカナを入力する際に丁目...
-
英数字のみ全角から半角に変換
-
VBA 文字に半角が含まれて...
-
IEからEdgeへの移行に伴うIMEの...
-
全角英数字の必要性が理解できない
-
COBOL・全角判定
-
word差し込み印刷 半角カタカ...
-
エクセルにMicrosoft Barcode C...
-
プログラミングでは、半角括弧...
-
メモ帳の段落の揃え方
-
エクセルの検索が正しくできな...
-
エクセルでの”々”の扱い
-
char型全角数字から、int型半角...
-
CString Format にて全角空白文...
-
.NET3.5におけるキーボードの「...
-
半角/全角文字混在データの分...
-
Accessで日付や数値を全角で表...
-
[Excel VBA] ODBCによる外部デ...
-
VB.net、テキストボックス入力...
-
改行のないテキストを指定バイ...
おすすめ情報