• ベストアンサー

文字列の分割について

VB初心者です。 以下のように文字列を分割したいのですが <やりたいこと> MOJI="A","B","C,D,E" ↓ ARRAY(0)="A" ARRAY(1)="B" ARRAY(2)="C,D,E" ARRAY=SPLIT(MOJI,",") ではだめですよね。 何か、簡単なやり方はありますか? よろしくお願いします。

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

大概の場合はうまくいくと思います。 Function csv(source) As Variant Dim reg As New RegExp Dim mc As MatchCollection Dim buf Dim i Dim bobj As Object Dim arry() If Len(source) > 0 And Left(source, 1) <> "," Then buf = buf & "," Else csv = "" Exit Function End If reg.Pattern = "(""[^""]*""),|([^""]*)," reg.Global = True Set mc = reg.Execute(source) If mc.Count <> 0 Then reg.Pattern = ",$" ReDim arry(mc.Count) For i = 0 To mc.Count - 1 arry(i) = reg.Replace(mc(i), "") Next End If csv = arry End Function

tatotu
質問者

お礼

ありがとうございます。 試してみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.5

補足の説明が。。。回答者の意図を分かってないですね。 VB6で > MOJI="A","B","C,D,E" は文法エラーです。この時点でVB6の文法で文字列を 理解していない事になります。ダブルクォーテーションは 文法として意味を持ちます。 データのダブルクォーテーションと、VB6の文法の ダブルクォーテーションを区別して説明して下さい。 「CSV形式でデータの中にカンマを含む場合」でいいですか? VB6の文法としてそのようなデータを変数に入れるなら、 MOJI = """A"",""B"",""C,D,E""" となります。 変数、MOJI に「"A","B","C,D,E"」というデータを入れる という意味です。ダブルクォーテーションが文法としての 意味を持っているため、2つ重ねてエスケープします。 ここで、CSV形式は「データ中にカンマを含まない場合」 はダブルクォーテーションで囲まないでも成り立つ事が 重要です。 CSV形式のデータを正しく読み取るには、データとして 「A,B,"C,D,E"」も「A」「B」「C,D,E」と解釈できる 必要があります。更に「データ中にダブルクォーテーション を含む場合」も許可されています。「A,B,"C,""D,E"」は 「A」「B」「C,"D,E」と解釈します。 http://www.kasai.fm/wiki/rfc4180jp 理解した上で説明しなおしてください。

全文を見る
すると、全ての回答が全文表示されます。
  • layy
  • ベストアンサー率23% (292/1222)
回答No.4

配列に入れて添え字何個か数える?。 プログラミング的にいうと区切りを数える、でも解決します。 『","』の出現数=2 1バイトずつ見て、2バイト前、1バイト前とともに判定する。 配列ARRAYの知識いりません。

全文を見る
すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

簡単なやり方はありません。 憶えておくと便利な正規表現を使います。 【理論】 (1)引用符で囲まれた部分を配列に記録 (2)引用符で囲まれた部分を非表示文字で置換 (3)カンマで分割 (4)分割した内容に置換文字があれば   配列に記録した元の文字列で復元 【プログラム例】 Function 分割(ByVal MOJI) Dim 編集後文字列 Dim 正規表現 Dim 一致集合 Dim 要素 Dim 添字 Dim 分割配列 ReDim 引用符内部(0) '正規表現オブジェクトをインスタンス化する Set 正規表現 = CreateObject("VBScript.RegExp") '置換対象を「全て」にする 正規表現.Global = True '引用符で囲まれた文字列を示す正規表現パターン 正規表現.Pattern = """.*?""" '上記に一致する集合を得る Set 一致集合 = 正規表現.Execute(MOJI) '引用符で囲まれた部分を記録する配列の要素数を初期化 添字 = -1 '一致集合から一つずつ取り出して配列に記録する For Each 要素 In 一致集合     '要素数をインクリメントする     添字 = 添字 + 1     '配列の要素数を以前の内容を残して拡張する     ReDim Preserve 引用符内部(添字)     '拡張した要素に記録     引用符内部(添字) = 要素 Next '引用符で囲まれた部分をBackSpaceで置換する 編集後文字列 = 正規表現.Replace(MOJI, vbBack) 'カンマで区切る 分割配列 = Split(編集後文字列, ",") '検出/置換の範囲を「最初だけ」にする 正規表現.Global = False 'BackSpaceの正規表現パターン 正規表現.Pattern = "\x08" '復元用添字を初期化する 添字 = -1 '分割した配列を一つずつ処理する For 要素 = 0 To UBound(分割配列)     'データにBackSpaceが含まれる限りループする     Do While 正規表現.Test(分割配列(要素))         '復元用添字をインクリメントする         添字 = 添字 + 1         'BackSpaceを復元する         分割配列(要素) = _            正規表現.Replace(分割配列(要素), _            引用符内部(添字))     Loop Next '戻り値として配列を返す 分割 = 分割配列 End Function 【実行例】 Dim MOJI, 結果, 要素 MOJI = """A"",""B"",""C,D,E""" 結果 = 分割(MOJI) Debug.Print MOJI For Each 要素 In 結果     Debug.Print 要素 Next 尚、引用符内に引用符を置く可能性がある場合は 先にその部分(二重引用符とかエスケープ指定)を 置換しておいてから同じ操作を行います。 正規表現は以下を参照してください。 http://msdn.microsoft.com/ja-jp/library/cc392487.aspx

tatotu
質問者

お礼

ありがとうございます。 試してみます。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

簡単なコード(split関数)ではむつかしいですね。レベル(優先度)をつけて一遍には出来ないでしょう。 Instr関数で文字の出現位置を順次探り、抽選順位を判別ロジックで組まないといけないように思う。 しかし当初の文字列の内容があいまいなので下記補足を乞う。 ーーー >VB初心者です VBA、VB6,VB.NETのうちのどれですか? >MOJI="A","B","C,D,E" これをそのままコード(代入文)として載せるとエラーになると思う。 実際に動く、プログラムの代入文の表現ではどうなりますか?内容を正確に知りたいため。 分割単位の意味が不明のところが出るようにおもう。 代入する特はARRAY(0)="A"でも、Msgbox で表示すると A であり、本当はAと表示したいのか、”A"と表示したいのか 質問では紛らわしいから。 ーーー Arrayという変数は、別にArray関数というのがあり、紛らわしいので避けるべきでしょう。 -- 単なる思い付きで疑問に思った例ですか? 実際に実務などしていて、ぶつかった例ならもう少し詳しく、直面したケースを広く教えてください。

tatotu
質問者

補足

回答ありがとうございます。 細くしますと VB6 で、例がよくなかったですね。 MOJI="A","B","C,D,E" ↓ TempAry(0) = "A" "A"の文字列として扱いたい。 TempAry(1) = "B" TempAry(2) = "C,D,E" で分割した配列の個数を知りたいのですが? たとえば、 MOJI="A","B","C" ↓ TempAry=Aplit(MOJI,",") UBOUND(TempAry) → 2ですよね、上記も同様のことがしたいのですが? すいません、簡単に書きすぎました。 よろしお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Perlでの文字列操作について

    Perlを使用しての文字列操作について教えてください。 たとえば以下のような数字とアルファベットが順に並ぶ文字列があるとします。 11A4C555D67B114B9423C アルファベットは1文字ですが、数字は何個でも連続で並びます。 この文字列を「数字アルファベット」の部分で分割し、配列に格納したいのですが、うまくいきません。 @array=('11A','4C','555D','67B','114B','9423C') どなたか教えてください。よろしくお願いいたします。

  • 複雑な/による文字列の分割について

    $str = "hello/$(hoge/$(hoge/good)/id)/namae"; このような文字列を/で以下のように分割して配列に入れようと考えています。 Array ( [0] => hello [1] => $(hoge/$(hoge/good)/id) [2] => namae ) しかし単にsplitで分割してもこのようにならないので正規表現でやりたいんですがどのようにしたらこのように分割できるでしょうか??

    • ベストアンサー
    • PHP
  • splitしない文字列について

    split("\t",$moji) で$mojiを分割しているのですが、タブ区切りなのに分割しない文字列があります。 企業秘密な所もあり、問題の文字列そのままを報告できないのですが、分割をキャンセルするような文字コードってあるのでしょうか? その文字コードであやしい物は 「 」:スペース 「!」、「♪」 などが含まれています。 通常であれば10個に分割される文字列がまったく分割されなく分割数は1と出ます。もちろんタブ区切りになっています。 1つの文字列だけの事なのです。原因はまったく不明。よろしくお願いします。

    • ベストアンサー
    • PHP
  • タグ混じりの文字列を、タグの前後で分割して配列に格納したい

    Flash8使用です。 XMLファイルから読み込んだ、タグ混じりの文字列を、 タグの前後で分割して、配列に格納したいと考えています。 <a>我が輩は<b kana="ねこ">猫</b>である。</a> という文字列を、 <a>,我が輩は,<b kana="ねこ">,猫,</b>,である,</a> という配列にしたいのです。 最初の文字列(変数lineに代入)をsplitを使って「<」で分割し、 次に生成された配列の要素をに、1つずつ消された「<」を補うということをして、 ,<a>我が輩は,<b kana="ねこ">猫,</b>である,</a> という配列は作れました。 しかしここからさらに「>」で分割する方法がわかりません。 どのような方法がありますでしょうか。 特にsplitを使う方法にこだわっているわけではないので、 最初からまったく異なる方法でももちろん大歓迎です。 よろしくお願いします。 以下、現在のコードです。 var temp:Array = line.split("<"); for ( var n = 1; n<temp.length; n++) { temp[n] = "<" + temp[n]; }

    • ベストアンサー
    • Flash
  • 文字列の取得について

    Accessのモジュールを使ってある文字列から指定した文字数の文字列を取得しようとしています。 A:"あああああ" & vbcrlf B:"いいいいい" & vbcrlf C:"うううううう" & vbcrlf D:"えええええ" & vbcrlf A~Dまでフィールドがあり、vbcrlfは改行です。 この文字列に対して以下の処理を実行します。 (1)変数mojiにA & B & C & Dを代入 (2)mojiを全角に変換 (3)Left(moji,20)で左から20文字取得します。 (4)mojiをテキストボックスに登録します。 (5)入力チェック処理  ・フィールドサイズが20文字以内か?  ・全角で登録されているか? →登録後のイメージ ---------------- あああああ いいいいい ううううう ---------------- テキストボックスには全角でしっかり登録されているようにみえるのですが、 どうしても全角で登録してくださいというメッセージが表示されてしまいます。 うううううの次の改行を削除すると、メッセージはでなくなります。 この改行が半角になっているのでしょうか? アドバイスよろしくお願いいたします。

  • VBスクリプト 文字列操作

    VBスクリプト(全くの初心者です)について教えてください。 例えば "test.csv" にて 1,a 1,b 1,c 1,d 2,a 2,b 3,d 3,e 4,a 4,f 4,g のファイルがあるとします。 最初の1列目の数字(文字列)の行数は可変です。 最終的に "test2.csv" 1,a,b,c,d 2,a,b 3,d,e 4,a,f,g というファイルを作りたいのですが,ずばりコードを教えていただけないでしょうか。

  • 文字列になっている配列を‥

    以下の値がDBに文字列の項目に登録されています。 DB から値を取得したのはいいのですが文字列なので foreach でグルグルしようとすると怒られてしまいます。 配列の型に変換できればいいのですが(array)だとうまく行かないしどうすればいいかどなたかご教授願えないでしょうか。 よろしくお願いします。 ■値(文字列でDBに格納されてます‥) array( 1=>'a', 2=>'b', 3=>'c', 10=>array( 'A'=>1, 'B'=>'hoge1', ), 11=>array( 'A'=>2, 'B'=>'hoge2', ), 12=>array( 'A'=>3, 'B'=>'hoge3', ), )

    • 締切済み
    • PHP
  • 文字列を分割して、分割した文字の一番右側を表示するにはどうしたら良いのでしょうか?

    Sub test2() Dim moji() As String Dim a As Range Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row Set a = Cells(行, 1) moji() = Split(a, "-") On Error GoTo moji Cells(行, 2) = moji(3) Next 行 moji: Cells(行, 2) = moji(2) End Sub で A列 B列 1-2-3-4 4 10-11-11-12 12 1-2-3-10 10 1-2-10-3 3 1-2-3 3 1-2 1-13 11-14 11-3 の結果になりますが1-2,11-14,11-3の部分が表示できません。 どなたかよいほうほうをお願いします。

  • Excel マクロ VBA セル内で改行された文字列の分割

    はじめまして。 ExcelのVBA初心者で、ちょっと困っています。 (例) (1) セルA1に以下のような改行された文字列が入力されています。 【セルA1】 a aa aaa b bb bbb (2) セルA1内の文字列を3行毎に分割し、セルA2以降に表示させたい。 【セルA2】 a aa aaa 【セルA3】 b bb bbb ※ 今回の例ではセルA1に6行しかありませんが、実際に行数は決まっていません。 そこで以下のようなVBAを見よう見まねで作り、1行毎の分割はうまくいったのですが、『3行毎に分割』ができません。 Sub 分割() Dim A, B, C A = Split(Range("A1"), Chr(10)) B = 0 For Each C In A B = B + 1 Range("A2").Offset(B - 1, 0).Value = C Next End Sub ご教授いただけると助かります。 よろしくお願い致します。

  • 配列から網羅的な文字列を生成するには?

    perlの配列を使った、網羅的な文字列生成について質問です。 ある特定の種類の文字のレパートリをつかった、n文字の文字列すべての組み合わせを生成したいと考えています。 例えば文字 A, B, C の三種類をつかった2文字の文字列なら AA,AB,AC,BA,BB,BC,CA,CB,CC 3x3 =9 種類というふうになります。 n=2の場合、 @array = qw(A B C); foreach $moji(@array){ $moji1 = $moji; foreach $moji(@array){ $moji2 = $moji; $mojiretu = $moji1.$moji2; push (@mojiretuset , $mojiretu ); }} print @mojiretuset; とするとforeachをふたつ重ねることで文字の組み合わせすべてを生成できました。 問題なのは、問題なのは、今私がしたいのは文字数nを(ループの)外から指定して(例えば$mojisuu = 6 などとして)n文字の場合の網羅的な文字の組み合わせを生じさせることなのです。 毎回自分でforeachを必要なだけ重ねて書き直す、というのは現実的ではありませんし、n個のforeachの入ったperlのコードを書くコードというのも避けたいのです。 文字数を自由に後から設定して、特定の配列から網羅的な組み合わせを生じさせるにはどのようなコードを書けばよいでしょうか?

    • ベストアンサー
    • Perl