tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルSplit関数について
記事No9956
投稿日: 2010/03/10(Wed) 11:11
投稿者従業員
VB2005 Xp

お世話になります。
スペース区切りのテキストデータが複数行ありまして、以下の方法でデータを配列に
入れようと思っております。1行のデータは配列に入りますが、テキストが複数行
あるために配列に入りません、配列に入れる方法がありましたら教えてください。
よろしくお願いいたします。

Dim separator As Char() = ""
Dim options As StringSplitOptions = StringSplitOptions.RemoveEmptyEntries
Dim returnValue As String()

For I = 1 To 5
     returnValue = ARRYStr2(I).Split(separator, options)
Next I

[ツリー表示へ]
タイトルRe: Split関数について
記事No9959
投稿日: 2010/03/10(Wed) 12:06
投稿者keisuke
こんにちは、です。
http://www.atmarkit.co.jp/fdotnet/dotnettips/317vbsplit/vbsplit.html
が、参考になるのでは?


>テキストが複数行あるために配列に入りません

ちょっと意味が解りかねます。素直に考えると
****** ****** *** ****
******  ******   **  ***
** *****  ***** *****   改行してある
ということですか?
これを配列12個に分けたいということですかね、
何か違うような。

もしかしてDim returnValue As String()は1次元配列なので
For I = 1 To 5
     returnValue = ARRYStr2(I).Split(separator, options)
Next I
では、  returnValue にはARRYStr2(5)の文字列しか残りませんが
ARRYStr2(I)にどうしたら複数行のデータを取り込めるかを知りたいのか
このところが、、、不明です。

[ツリー表示へ]
タイトルRe^2: Split関数について
記事No9960
投稿日: 2010/03/10(Wed) 12:29
投稿者従業員
keisuke 様

お世話になります。
ありがとうございます。

テキストがこのような、感じなのです。列数がバラバラなのが気になりますが、
こんなこと出来ますでしょうか?

A(1,1) A(1,2) A(1,3) A(1,4)          ***  ***  **** ***
A(2,1) A(2,2) A(2,3)                 **  **   *
A(3,1) A(3,2) A(3,3) A(3,4) A(3,5)   *    ***   *   **  **
よろしくお願いいたします。


> >テキストが複数行あるために配列に入りません
>
> ちょっと意味が解りかねます。素直に考えると
> ****** ****** *** ****
> ******  ******   **  ***
> ** *****  ***** *****   改行してある
> ということですか?
> これを配列12個に分けたいということですかね、
> 何か違うような。

[ツリー表示へ]
タイトルRe^3: Split関数について
記事No9961
投稿日: 2010/03/10(Wed) 12:49
投稿者keisuke
さらに意味不明ですが、A(1,1)="***" A(1,2)"***" A(1,3)="****"
というようにAの2次元配列に取り込むのでしょうか???
テキストデータはたとえばテキストファイルに複数行で入っているのでしょうか?
最終的にどの様にしたいかを明確に書いていないと答えようがありませんですよ、
たとえばAの2次元配列に入れたいとか


    Dim ARRYStr2(10) As String
        Dim separator As Char() = ""
        Dim options As StringSplitOptions = StringSplitOptions.RemoveEmptyEntries
        Dim returnValue As String()

        ARRYStr2(1) = "**** ** ***** ****"
        ARRYStr2(2) = "2222 888 9999 4444"
        ARRYStr2(3) = "111 99 857 65985*    "
        ARRYStr2(4) = "11 1 1111  111 1"
        ARRYStr2(5) = "*8888 8888 888 88"

        For I = 1 To 5
            returnValue = ARRYStr2(I).Split(separator, options)
        Next I

[ツリー表示へ]
タイトルRe^4: Split関数について
記事No9962
投稿日: 2010/03/10(Wed) 13:01
投稿者keisuke


>テキストが複数行あるために配列に入りません
この言葉が引っかかります、テキストが複数行てことは、合体させてもいいのかしら・
とりあえず、勝手に、、、、

Dim ARRYStr2(5) As String
        Dim A(5, 5) As String
        Dim separator As Char() = ""
        Dim options As StringSplitOptions = StringSplitOptions.RemoveEmptyEntries
        Dim returnValue As String()
        Dim s As Integer


        ARRYStr2(1) = "**** ** ***** ****"
        ARRYStr2(2) = "2222 888 9999 4444"
        ARRYStr2(3) = "111 99 857 65985*    "
        ARRYStr2(4) = "11 1 1111  111 1"
        ARRYStr2(5) = "*8888 8888 888 88"

        For I = 1 To 5
            returnValue = ARRYStr2(I).Split(separator, options)
            For s = 1 To 4
                A(I, s) = returnValue(s - 1)
            Next
        Next I

[ツリー表示へ]
タイトルRe^5: Split関数について
記事No9964
投稿日: 2010/03/10(Wed) 13:15
投稿者従業員
keisuke 様

ご回答下さいましてありがとうございます。
以下のように2次元に取り込みたかったのです。
色々考えましたが、下記のようなことは思いつきませんでした。
VB6より移行で苦労しています。
ありがとうございました。
>
>  Dim ARRYStr2(5) As String
>         Dim A(5, 5) As String
>         Dim separator As Char() = ""
>         Dim options As StringSplitOptions = StringSplitOptions.RemoveEmptyEntries
>         Dim returnValue As String()
>         Dim s As Integer
>
>
>         ARRYStr2(1) = "**** ** ***** ****"
>         ARRYStr2(2) = "2222 888 9999 4444"
>         ARRYStr2(3) = "111 99 857 65985*    "
>         ARRYStr2(4) = "11 1 1111  111 1"
>         ARRYStr2(5) = "*8888 8888 888 88"
>
>         For I = 1 To 5
>             returnValue = ARRYStr2(I).Split(separator, options)
>             For s = 1 To 4
>                 A(I, s) = returnValue(s - 1)
>             Next
>         Next I

[ツリー表示へ]
タイトルRe^4: Split関数について
記事No9963
投稿日: 2010/03/10(Wed) 13:05
投稿者従業員
keisuke 様

申し訳ございません。
記述が不明瞭でした。ごめんなさい。
テキストデータには複数行で入っているのです。
2次元配列に取り込みたいと思っています。
ご指導下さい。
どうぞよろしくお願いいたします。

> さらに意味不明ですが、A(1,1)="***" A(1,2)"***" A(1,3)="****"
> というようにAの2次元配列に取り込むのでしょうか???
> テキストデータはたとえばテキストファイルに複数行で入っているのでしょうか?
> 最終的にどの様にしたいかを明確に書いていないと答えようがありませんですよ、
> たとえばAの2次元配列に入れたいとか

[ツリー表示へ]
タイトルRe^3: Split関数について
記事No9965
投稿日: 2010/03/10(Wed) 14:17
投稿者魔界の仮面弁士
> 列数がバラバラなのが気になりますが、
> こんなこと出来ますでしょうか?
> A(1,1) A(1,2) A(1,3) A(1,4)          ***  ***  **** ***
> A(2,1) A(2,2) A(2,3)                 **  **   *
> A(3,1) A(3,2) A(3,3) A(3,4) A(3,5)   *    ***   *   **  **
> よろしくお願いいたします。

二次元配列の代わりに、ジャグ配列を使うのは如何でしょうか。
たとえば、このような結果を得ることができます。

 A(0)(0) = "***"
 A(0)(1) = "***"
 A(0)(2) = "****"
 A(0)(3) = "***"

 A(1)(0) = "**"
 A(1)(1) = "**"
 A(1)(2) = "*"

 A(2)(0) = "*"
 A(2)(1) = "***"
 A(2)(2) = "*"
 A(2)(3) = "**"
 A(2)(4) = "**"


-------------------------
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    TextBox1.Multiline = True
    TextBox1.Height = 80
    TextBox1.Text = "***  ***  **** ***" & vbNewLine & "**  **   *" & vbNewLine & "*    ***   *   **  **"
End Sub

Private Function GetArray(ByVal s As String) As String()()
    Dim options As StringSplitOptions = StringSplitOptions.RemoveEmptyEntries
    Dim lines As New List(Of String())
    For Each line As String In Split(s, vbNewLine)
        lines.Add(line.Split(New String() {}, options))
    Next
    Return lines.ToArray()
End Function

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    Dim A()() As String = GetArray(TextBox1.Text)

End Sub

[ツリー表示へ]
タイトルRe^4: Split関数について
記事No9966
投稿日: 2010/03/10(Wed) 14:36
投稿者keisuke
お〜っと、素晴しいです。
これは凄く役に立つソースコードです、ありがとうございます。
大変ためになります、感謝です。^^)/

[ツリー表示へ]
タイトルRe^4: Split関数について
記事No9967
投稿日: 2010/03/10(Wed) 17:34
投稿者従業員
魔界の仮面弁士 様
keisuke 様

こんにちは、
大変お世話になります。

配列の列数がバラバラで、
更に数10行あるテキストファイルで困っていました。
下記に記載の件、拝見いたしました。
すごいことができるのですね。
自分なりに考えてみます。


> 二次元配列の代わりに、ジャグ配列を使うのは如何でしょうか。
> たとえば、このような結果を得ることができます。
>
>  A(0)(0) = "***"
>  A(0)(1) = "***"
>  A(0)(2) = "****"
>  A(0)(3) = "***"
>
>  A(1)(0) = "**"
>  A(1)(1) = "**"
>  A(1)(2) = "*"
>
>  A(2)(0) = "*"
>  A(2)(1) = "***"
>  A(2)(2) = "*"
>  A(2)(3) = "**"
>  A(2)(4) = "**"
>

[ツリー表示へ]
タイトルRe^5: Split関数について
記事No9968
投稿日: 2010/03/11(Thu) 00:15
投稿者従業員
こんばんは、
お世話になります。

下記の方法で行う場合、1行の配列数を知る必要があります。
テキストデータのスペースのカラム数がランダムでかつ倍角文字があったりと
厄介で頭を抱えてしまいました。

例えば、
Dim str1 As String = "最大   2   ○  0    1    1   2.67  2.06  1.38   "
このような感じです。

1行中の配列数を知る方法はありませんでしょうか。
良い方法がありましたら教えてください。。

>
> > 二次元配列の代わりに、ジャグ配列を使うのは如何でしょうか。
> > たとえば、このような結果を得ることができます。
> >
> >  A(0)(0) = "***"
> >  A(0)(1) = "***"
> >  A(0)(2) = "****"
> >  A(0)(3) = "***"
> >
> >  A(1)(0) = "**"
> >  A(1)(1) = "**"
> >  A(1)(2) = "*"
> >
> >  A(2)(0) = "*"
> >  A(2)(1) = "***"
> >  A(2)(2) = "*"
> >  A(2)(3) = "**"
> >  A(2)(4) = "**"
> >

[ツリー表示へ]
タイトルRe^6: Split関数について
記事No9969
投稿日: 2010/03/11(Thu) 02:02
投稿者魔界の仮面弁士
> 下記の方法で行う場合、1行の配列数を知る必要があります。

分割後に、配列の要素数を調べてやれば良いと思います。
調べる方法は幾つかありますので、お好きな方法でどうぞ。

・UBound 関数
・Length プロパティ
・GetUpperBound メソッド
・GetLength メソッド

[ツリー表示へ]
タイトルRe^7: Split関数について
記事No9970
投稿日: 2010/03/11(Thu) 14:15
投稿者従業員
魔界の仮面弁士 様

こんにちは、
大変お世話になります。

その後、UBound 関数等を使用して、1行の配列要素数を調べてみたのですが、
スペース区切りの場合、正確な要素数を返してくれません。
少なめに出てきます。
カンマ区切りでなけれないけないのでしょうか?

> ・UBound 関数
> ・Length プロパティ
> ・GetUpperBound メソッド
> ・GetLength メソッド

[ツリー表示へ]
タイトルRe^8: Split関数について
記事No9971
投稿日: 2010/03/11(Thu) 15:24
投稿者魔界の仮面弁士
> その後、UBound 関数等を使用して、1行の配列要素数を調べてみたのですが、
> スペース区切りの場合、正確な要素数を返してくれません。
UBound は、配列の要素数を調べるだけなので、元データの内容とは無関係です。
疑うべきは、Split 処理のところでしょう。

> カンマ区切りでなけれないけないのでしょうか?
具体的には、どういうデータが、どのように分割されることを期待していますか?

[ツリー表示へ]
タイトルRe^9: Split関数について
記事No9972
投稿日: 2010/03/11(Thu) 18:52
投稿者従業員
魔界の仮面弁士 様

こんばんは、
大変お世話になります。

配列要素が取得できない件はやはり、Splitのところで変なことをやっていました。
見直しましたら正確に取得できました。

> 疑うべきは、Split 処理のところでしょう。

ジャグ配列に戻りますが、
 IK:配列要素数としますと、A()()に値が代入されているようですが、
その後、A()()を Debug したり 文字列に代入したりすることができません。
この3行は自分でも怪しいと思っています。
どのように、A()()に ARRYStr2(J) を代入してあげればよいのでしょうか?
度々申し訳ございませんがご指導下さい。

     For J = 0 To IK
        Dim A()() As String = GetArray(ARRYStr2(J))
     Next J

     Debug.Print(A(1)(3)) だめ
     M = A()() だめ

[ツリー表示へ]
タイトルRe^10: Split関数について
記事No9974
投稿日: 2010/03/11(Thu) 21:02
投稿者魔界の仮面弁士
ちなみに VB6 においても、同様の配列を作成することができます。

 ReDim A(2) As Variant
 A(0) = Array("11", "22", "33", "44")
 A(1) = Array("aa", "bb")
 A(2) = Array("xx", "yy", "zz")

 Debug.Print A(0)(3)     '44
 Debug.Print A(1)(0)     'aa
 Debug.Print A(2)(1)     'yy
--------------------


> その後、A()()を Debug したり 文字列に代入したりすることができません。

個々の要素は、
 Dim Cols() As String = A(0)    '0行目の内容
 Dim Cell As String = Cols(2)   'その行の2列目の内容
のように取り出せます。これを一行で書くと、
 Dim Cell As String = A(0)(2)
となります。
(もちろん、配列上に存在しない要素番号を指定するとエラーになります)

データの書き換えも同様で、
 A(0)(0) = "new Data"    '0行目の0列目を書き換え
とか、
 A(2) = New String() { "aaaa", "bbbb", "cccc" }   '2行目の内容をまるごと差し替え
のように記述できます。


> どのように、A()()に ARRYStr2(J) を代入してあげればよいのでしょうか?
ARRYStr2 のデータ型は何ですか? また、
ARRYStr2(J) のデータ型は何ですか?

[ツリー表示へ]
タイトルRe^11: Split関数について
記事No9980
投稿日: 2010/03/12(Fri) 10:29
投稿者従業員
魔界の仮面弁士 様

おはようございます。大変お世話になります

ARRYStr2(1)の値は  "***  ***  **** ***" です。
これを数行のテキストイメージにするために、ARRYStr2(1)を配列に入れました。

        Dim ARRYStr2(5) As String
        Dim separator As Char() = ""
        Dim options As StringSplitOptions = StringSplitOptions.RemoveEmptyEntries
        Dim returnValue As String()
        Dim ColValue(10) As String
        Dim I As Integer
        Dim J As Integer
        'Dim A(10)
        ARRYStr2(1) = "***  ***  **** ***"
        ARRYStr2(2) = "**  **   *"
        ARRYStr2(3) = "*    ***   *   **  **"
        For I = 1 To 3
            returnValue = ARRYStr2(I).Split(separator, options)
            Debug.WriteLine(Microsoft.VisualBasic.UBound(returnValue))
            ColValue(I) = Microsoft.VisualBasic.UBound(returnValue)’要素数
        Next I
        For J = 1 To 3
            Dim A()() As String = GetArray(ARRYStr2(ColValue(J)))
        Next J
        Dim Cols() As String = A(0)    '0行目の内容
        Dim Cell As String = Cols(2)   'その行の2列目の内容
        Dim Cell As String = A(0)(2)
    End Sub
    Private Function GetArray(ByVal s As String) As String()()
        Dim options As StringSplitOptions = StringSplitOptions.RemoveEmptyEntries
        Dim lines As New List(Of String())
        For Each line As String In Split(s, vbNewLine)
            lines.Add(line.Split(New String() {}, options))
        Next
        Return lines.ToArray()
    End Function

> 個々の要素は、
>  Dim Cols() As String = A(0)    '0行目の内容
>  Dim Cell As String = Cols(2)   'その行の2列目の内容
> のように取り出せます。これを一行で書くと、
>  Dim Cell As String = A(0)(2)

[ツリー表示へ]