こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VB2008の文字列の操作について

プログラムを最近、始めなければならなくなった初心者です。
一行の長い文字列を指定の文字数で分割するプログラムを書かなければならないのですが。どうしても文字数がずれてしまいます。
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という拡張子で送られてくるため原因かもしれないのでそのままにしています。

指定文字数ごとに分割することは可能なのでしょうか。可能であればどのような方法でもいいのでご教授ください。よろしくお願いします。

投稿日時 - 2010-03-22 04:16:01

QNo.5770045

すぐに回答ほしいです

質問者が選んだベストアンサー

* Shift_Jisの固定長データでは、いわゆる「全角文字」通常2桁、「半角文字」は1桁として扱うが、VBのStringでは両方とも1文字として扱われるというのは理解してます?
* 日本語項目で、余白は全角スペースで埋められているのか?それとも半角スペース2つで埋められているのか?
 →全角スペースなら「文字数」は一定になるはずです。

とりあえずこのあたりが参考になる?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8700&forum=7

投稿日時 - 2010-03-23 10:09:45

お礼

お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。
説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。

ご回答頂いた皆様ありがとうございました。

投稿日時 - 2012-09-14 02:47:50

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

内容とは少しずれますが
>具体的には約300万桁くらいの文字列を
300万文字を一度に文字変数として扱えるのでしょうか?
ちょっと無理な気もしますが。
最大でせいぜい6万文字程では?

投稿日時 - 2010-03-23 11:40:52

お礼

お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。
説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。

ご回答頂いた皆様ありがとうございました。

投稿日時 - 2012-09-14 02:46:30

ANo.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, 指定文字数)

投稿日時 - 2010-03-22 15:18:37

補足

お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。
説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。

ご回答頂いた皆様ありがとうございました。

投稿日時 - 2012-09-14 02:48:11

お礼

はじめまして。
回答いただきありがとうございます。私の知識不足かもしれませんがReplace関数で空文字列と入れ替えてみたのですが思っていたような結果が得られませんでした。


実は、スペースにについても、情報として扱いたいのでそのまま残しておきたいんです。指定文字数で分けた後にそれぞれのデータの持っている値を、作成したマスタを元に変換します。(例えば35番目から48番目のデータは名前(漢字)など)エクセルの固定長のデータ取り込みのイメージに近いかと思います。
具体的には約300万桁くらいの文字列を2000前後の文字列に分解して3000前後で一単位のデータとして扱います。
詳しくは、私のいる業界の関係者であればたぶん分かってしまいますので伏せさせていただきますが。簡単に例を書いてみます。

※データの中身(....の部分には同じようなデータが入ります。)
(ここから→) HB00000100010 0 1 00 ...{...}物流 太郎.........ブツリュウ タロウ.000101000.....(←ここで一単位)GM00000100010 0 1 00 ...{...}物流 花子.........ブツリュウ ハナコ.000101000.....

上記の様な形式のデータになります。それぞれ一文字がスペースも含めて意味を持っています。指定文字数(桁数?)で分割すればどのデータについても同じ形式になります。

LeftやMid関数ではスペースの文字数を数えているはずなのでずれるはずが無いと思っていたのですがなぜかずれてしまいます。

改行コード等含んで数えるのであれば尚のことですがデータ全体の桁数が実際あるべき桁数から減るのはおかしいかなと素人ながら考えます。増えるなら分かるのですが・・・何か特殊なデータの形式を使用しているケースというのは考えられますでしょうか。

ちなみに物流系の業界ではありませんのであしからず^^;

投稿日時 - 2010-03-23 00:03:55

ANo.1

C:\testtex.DAT

のファイルに、コントロールコードが入っていませんか
改行コードでも、一文字にカウントされますよ。

例えば以下のコードでは三文字になります。


Dim mes As String = vbCr + vbCrLf

Debug.Print(Len(mes))

ノートパッドでは、何も表記されないかも

投稿日時 - 2010-03-22 11:46:39

補足

お礼が遅くなってしまし申し訳ありません。LenBやLeftB、等の関数がVB6時代には存在していたのを調べているうちに知りました。Bit単位に変換して長さを測ると正確に分割することができました。
説明不足、知識不足、技術不足等多々自身の未熟さゆえに今、質問を読み返してみると恥ずかしい限りです。

ご回答頂いた皆様ありがとうございました。

投稿日時 - 2012-09-14 02:48:32

お礼

早速のご回答ありがとうございます。

コントロールコードについてですが桁数には含まれず文字数だけに含まれるという理解でよろしいでしょうか。(桁数より文字数のほうが多いので)
ということはLen、Length、Left、Right、Mid等の関数に関しては、文字数ではなく、桁数をカウントしているということなりますかね・・・

コントロールコードを含んで文字数の指定をしたいので自身でも何かしら方法を探してみます。もしご存知でございましたらご教授願えると非常にありがたいです。

投稿日時 - 2010-03-22 12:38:11

あなたにオススメの質問