質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

2370閲覧

vb.net Mid関数やLeft関数で指定した文字数分の文字列を取得できない

matsutake

総合スコア34

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/01/23 02:24

編集2020/01/23 02:38

お世話になります。
現在、Visual Studio 2008を使用して文字列データの取得プログラムを作成しております。
対象となるデータに電話番号が入っているのですが、
複数の電話番号が登録されている場合、連結された状態で登録がされております。
そのため、連結した状態で保存されている電話番号を最終的に別々の変数に分けて登録したいと考えております。
尚、複数の電話番号が登録されている場合、固定電話番号と携帯電話番号がランダムで連結されているので
連結されている電話番号の組み合わせとしては以下があります。
固定電話番号+固定電話番号
固定電話番号+携帯電話番号
携帯電話番号+固定電話番号
携帯電話番号+携帯電話番号

現状ですが、作成したプログラムでは文字列の最初の3文字を取得し、
それで携帯電話番号かどうかを判別し、その結果を最初の変数に代入します。
その後、今取得した番号はREPLACEにて削除して、残った文字列を再度チェックし、
変数に代入するという流れで考えております。

しかし、実際のプログラムを実行しますと、最初のLeft関数では指定した文字数分の文字を取得し、
その後のチェックにより1個目の電話番号が固定電話番号か携帯電話番号かも正しく取得できるのですが、
2個目の電話番号のチェック時にLeft関数で取得する文字数を3文字と指定しても
実際に取得される文字数が2文字だけとなってしまうのです。
何が起きているのかわからず、とりあえずチェックでは3文字の文字列が必要なので
仮にLeft関数で引数を4文字とすると見た目上は3文字取得できているのですが、
「090」と取得できていても携帯電話番号とは判別せず、固定電話と判別されてしまいます。

Left関数ではなく、Mid関数を使用してもやはり同様の状況です。

宜しくお願い致します。

VB.NET

1Dim strCheckPhone AS String = "0120-11-2222090-9999-4444" 2Dim strCharCheck AS String 3Dim strPhone1 AS String 4Dim strPhone2 AS String 5 6’1個目電話番号を取得する 7strCharCheck = Microsoft.VisualBasic.Left(strCheckPhone, 3) ’正しく3文字取得できている 8’携帯電話番号かのチェック 一致する場合は携帯番号 9If strCharCheck = "090" Or strCharCheck = "080" Or strCharCheck = "070" Or strCharCheck = "050" Then 10  strPhone1 = Microsoft.VisualBasic.Mid(strCheckPhone, 1, 13) 11  strCheckPhone = Microsoft.VisualBasic.Replace(strCheckPhone, strPhone1 , "") 12’固定電話番号 13Else 14  strPhone1 = Strings.Mid(strCheckPhone, 1, 12) 15  strCheckPhone = Microsoft.VisualBasic.Replace(strCheckPhone, strPhone1 , "") 16End If 17 18’2個目電話番号を取得する 19strCharCheck = Microsoft.VisualBasic.Left(strCheckPhone, 3) ’2文字しか取得できない 20If strCharCheck = "090" Or strCharCheck = "080" Or strCharCheck = "070" Or strCharCheck = "050" Then 21  strPhone2 = Microsoft.VisualBasic.Mid(strCheckPhone, 1, 13) 22  strCheckPhone = Microsoft.VisualBasic.Replace(strCheckPhone, strPhone2 , "") 23Else 24  strPhone2 = Strings.Mid(strCheckPhone, 1, 12) 25  strCheckPhone = Microsoft.VisualBasic.Replace(strCheckPhone, strPhone2 , "") 26End If 27

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

2個目の電話番号のチェック時にLeft関数で取得する文字数を3文字と指定しても

実際に取得される文字数が2文字だけとなってしまうのです。

2文字だけではなく"90-"の3文字が取得されているのでは?

ここ↓が意図通りの実装になってないからですね。
※"0120-11-2222090-9999-4444"の1桁目から13文字は"0120-11-22220"ですよ。

VB

1’固定電話番号 2Else 3  strPhone1 = Strings.Mid(strCheckPhone, 1, 13) 4 ' strPhone1="0120-11-22220" 5  strCheckPhone = Microsoft.VisualBasic.Replace(strCheckPhone, strPhone1 , "") 6 ' strCheckPhone="90-9999-4444" 7 8'略 9Else 10  strPhone2 = Strings.Mid(strCheckPhone, 1, 13)

投稿2020/01/23 02:44

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matsutake

2020/01/23 06:32

ご指摘ありがとうございました。 ソースも編集させて頂きました。 結果的に私が取得していたデータにASCIIのグループセパレーター(GS)が含まれていたのが原因でした。 また、機会がございましたら、ぜひお力をお貸しください。 この度はご回答頂き、ありがとうございました。
guest

0

ベストアンサー

デバッガの使い方を学習してください。

ステップ実行して各変数をチェックしていけば分かりますが、1つ目の電話番号の取得が1桁多いです。
このため、2回目のチェック前に2個目の電話番号の最初の0がなくなっています。
正確には2文字しか取得できていないのではなく"90-"と3文字取得できているはずです。

投稿2020/01/23 02:33

編集2020/01/23 02:42
YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matsutake

2020/01/23 02:44

早々のご回答、ありがとうございます。 ソース内のご指摘頂きました部分につきましては、入力ミスでございました。 申し訳ございません。 編集させて頂きました。 Left関数の取得できない原因は何かわかりそうでしょうか。 またお力添えをお願い致します。
YAmaGNZ

2020/01/23 02:49

変更後のソースを実行してみましたが、2回目の電話番号も正しく取得でき、提示されている現象が発生しません。
matsutake

2020/01/23 02:56

度々、ありがとうございます。 普通に考えれば仰っておられる結果になるのは当然だと思います。 今までも同じ関数は何度も使用しておるのですが、こんな結果になるのは初めてなので・・・。 ソースに問題がないとすれば何が考えられるのかわかりませんよね。 引き続き、調べてみます。 ありがとうございました。
matsutake

2020/01/23 03:25

お世話になっております。 先ほどお伝えさせて頂きましたソース内で”0120-11-2222090-9999-4444”の電話番号を 直接変数に代入してご説明させて頂いておりましたが、 実際のプログラム内ではSQLserver 2005を使用した上でテーブルから電話番号を取得して代入しております。 最初にご提示させて頂きましたソースの前にstrCheckPhoneに代入するソースがありますが、 自作しておるソース内で直接電話番号をstrCheckPhoneに代入し、デバッグしますとLeft関数では 問題なく3文字分の文字列が取得できるのですが、SQL文を実行し取得したデータをstrCheckPhoneに代入すると質問させて頂きました現象が発生してしまっておるようです。 何かが違っているのかとは思いますが、SQL文にて取得したデータを見ても何か変わっているようにも 見えないのです。 発生する条件はわかりましたが、今のところ原因まではわかっておりません。 ```VB.NET Dim strSQL As String Dim dstTest As DataSet strSQL = "SELECT * FROM TestTable" dstTest = mclsDBAcc.GetDst(strSQL) strCheckPhone = dstTest.Tables(0).Rows(i)("Phone") ```
YAmaGNZ

2020/01/23 03:38

表示できない文字コードが入っているなど考えられます。 既存のシステムでは、その表示できないコードの文字をデリミタとして扱っていたとかありませんか? Debug.Print(BitConverter.ToString(System.Text.Encoding.ASCII.GetBytes(strCheckPhone ))) で確認してみてください。
matsutake

2020/01/23 05:31

お世話になっております。 先ほどはありがとうございました。 しかし、申し訳ございませんが、イミディエイトウィンドウに表示された結果を調べてみたのですが、 イマイチ判別の仕方がわかっておらず、どうしたら判別できるのかわかりません。 取得した結果をどのようにすれば確認ができるのでしょうか。
YAmaGNZ

2020/01/23 05:39

先ほどの私が提示したものだと、格納されている全ての文字がASCIIコードで表示されているはずです。 "0120-11-2222090-9999-4444"ですと 30-31-32-30-2D-31-31-2D-32-32-32-32-30-39-30-2D-39-39-39-39-2D-34-34-34-34 このように表示されるはずです。 これが 30-31-32-30-2D-31-31-2D-32-32-32-32-00-30-39-30-2D-39-39-39-39-2D-34-34-34-34 みたいに文字数より多く表示される等格納されていると思っている文字と比較し異なる部分があるかです。
matsutake

2020/01/23 05:50

ありがとうございました。 取得しているデータで試してみたところ、取得したデータの桁数より9桁分多くコードが表示されておりました。1Dというグループ区切りの文字が電話番号と電話番号の間に1つと最後に8個分含まれているのがわかりました。 ですので、Left関数で取得時に3文字分の指定をしましたが2文字しか取得できていなかったのは"1D"が含まれていたからですね。 となるとこの不要なものを削除する方法を考えないといけないことになるわけですね。
YAmaGNZ

2020/01/23 06:02 編集

もし、電話番号と電話番号の間に必ず'1D'があるのでしたら、下記のようにそれで分割するというのも手です。 Dim TelNumber As String() = strCheckPhone.Split(Chr(&H1D)) ちなみに、ASCIIの1Dはグループセパレータと呼ばれるものです。 電話番号の区切りとして入っている可能性が高いです。 また、最後に8個ということは、電話番号が最大10個格納できる仕様なのではないでしょうか?
matsutake

2020/01/23 06:30

最終的にはASCIIの1Dを全て削除した状態に置き換えることにさせて頂きました。 Left関数で3文字分の文字列を取得することもできるようになりました。 ようやく解決することが出来ました。 本当に本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問