- ベストアンサー
VB2008の文字列の操作について
- VB2008で一行の長い文字列を指定の文字数で分割する方法について教えてください。
- 左関数やMid関数を利用して分割する方法では文字数がずれてしまいます。解決策を教えてください。
- 文字数と桁数の違いについて調べたところ、全体の文字数もずれているようです。どうすれば正確な文字数を取得できるでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
* Shift_Jisの固定長データでは、いわゆる「全角文字」通常2桁、「半角文字」は1桁として扱うが、VBのStringでは両方とも1文字として扱われるというのは理解してます? * 日本語項目で、余白は全角スペースで埋められているのか?それとも半角スペース2つで埋められているのか? →全角スペースなら「文字数」は一定になるはずです。 とりあえずこのあたりが参考になる? http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8700&forum=7
その他の回答 (3)
- chuchuo
- ベストアンサー率45% (99/217)
内容とは少しずれますが >具体的には約300万桁くらいの文字列を 300万文字を一度に文字変数として扱えるのでしょうか? ちょっと無理な気もしますが。 最大でせいぜい6万文字程では?
お礼
お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。 説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。 ご回答頂いた皆様ありがとうございました。
- chuchuo
- ベストアンサー率45% (99/217)
はじめまして >データの無い部分にはスペースが含まれています。 スペースは一文字(全角スペース、半角スペースともに一文字)として 認識されます。 改行文字も一文字として認識されます。 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, 指定文字数)
お礼
はじめまして。 回答いただきありがとうございます。私の知識不足かもしれませんがReplace関数で空文字列と入れ替えてみたのですが思っていたような結果が得られませんでした。 実は、スペースにについても、情報として扱いたいのでそのまま残しておきたいんです。指定文字数で分けた後にそれぞれのデータの持っている値を、作成したマスタを元に変換します。(例えば35番目から48番目のデータは名前(漢字)など)エクセルの固定長のデータ取り込みのイメージに近いかと思います。 具体的には約300万桁くらいの文字列を2000前後の文字列に分解して3000前後で一単位のデータとして扱います。 詳しくは、私のいる業界の関係者であればたぶん分かってしまいますので伏せさせていただきますが。簡単に例を書いてみます。 ※データの中身(....の部分には同じようなデータが入ります。) (ここから→) HB00000100010 0 1 00 ...{...}物流 太郎.........ブツリュウ タロウ.000101000.....(←ここで一単位)GM00000100010 0 1 00 ...{...}物流 花子.........ブツリュウ ハナコ.000101000..... 上記の様な形式のデータになります。それぞれ一文字がスペースも含めて意味を持っています。指定文字数(桁数?)で分割すればどのデータについても同じ形式になります。 LeftやMid関数ではスペースの文字数を数えているはずなのでずれるはずが無いと思っていたのですがなぜかずれてしまいます。 改行コード等含んで数えるのであれば尚のことですがデータ全体の桁数が実際あるべき桁数から減るのはおかしいかなと素人ながら考えます。増えるなら分かるのですが・・・何か特殊なデータの形式を使用しているケースというのは考えられますでしょうか。 ちなみに物流系の業界ではありませんのであしからず^^;
補足
お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。 説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。 ご回答頂いた皆様ありがとうございました。
- tom11
- ベストアンサー率53% (134/251)
C:\testtex.DAT のファイルに、コントロールコードが入っていませんか 改行コードでも、一文字にカウントされますよ。 例えば以下のコードでは三文字になります。 Dim mes As String = vbCr + vbCrLf Debug.Print(Len(mes)) ノートパッドでは、何も表記されないかも
お礼
早速のご回答ありがとうございます。 コントロールコードについてですが桁数には含まれず文字数だけに含まれるという理解でよろしいでしょうか。(桁数より文字数のほうが多いので) ということはLen、Length、Left、Right、Mid等の関数に関しては、文字数ではなく、桁数をカウントしているということなりますかね・・・ コントロールコードを含んで文字数の指定をしたいので自身でも何かしら方法を探してみます。もしご存知でございましたらご教授願えると非常にありがたいです。
補足
お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。 説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。 ご回答頂いた皆様ありがとうございました。
お礼
お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。 説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。 ご回答頂いた皆様ありがとうございました。