プログラムを最近、始めなければならなくなった初心者です。
一行の長い文字列を指定の文字数で分割するプログラムを書かなければならないのですが。どうしても文字数がずれてしまいます。
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
英数字のみ全角から半角に変換
-
エクセルでの”々”の扱い
-
住宅にカナを入力する際に丁目...
-
VBA 文字に半角が含まれて...
-
Excelの中に全角ひらがな、漢字...
-
COBOL・全角判定
-
メモ帳の段落の揃え方
-
C言語のコンパイルエラーなん...
-
IEからEdgeへの移行に伴うIMEの...
-
char型全角数字から、int型半角...
-
\\はエクセルでは全角?
-
VB.net、テキストボックス入力...
-
エクセルの検索が正しくできな...
-
【ExcelVBA】英数記号の半角変換
-
ACCESS VBA でのバイナリデー...
-
差し込み印刷について教えてく...
-
VBA Shift-JISをJISに変換する...
-
Accessで日付や数値を全角で表...
-
ダブルコーテーションの置換
-
大文字と全角文字は同じ意味で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
英数字のみ全角から半角に変換
-
住宅にカナを入力する際に丁目...
-
VBA 文字に半角が含まれて...
-
COBOL・全角判定
-
エクセルにMicrosoft Barcode C...
-
プログラミングでは、半角括弧...
-
IEからEdgeへの移行に伴うIMEの...
-
word差し込み印刷 半角カタカ...
-
全角英数字の必要性が理解できない
-
封筒の宛先で縦書きの書き方
-
メモ帳の段落の揃え方
-
エクセルの検索が正しくできな...
-
ダブルコーテーションの置換
-
VB.net、テキストボックス入力...
-
CString Format にて全角空白文...
-
.NET3.5におけるキーボードの「...
-
エクセルでの”々”の扱い
-
VBで、String型のデータが、...
-
「一角」って何でしょうか
-
コマンドプロンプト 全角を含ん...
おすすめ情報