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
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
理解した上で説明しなおしてください。
No.4
- 回答日時:
配列に入れて添え字何個か数える?。
プログラミング的にいうと区切りを数える、でも解決します。
『","』の出現数=2
1バイトずつ見て、2バイト前、1バイト前とともに判定する。
配列ARRAYの知識いりません。
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 …
No.1
- 回答日時:
簡単なコード(split関数)ではむつかしいですね。
レベル(優先度)をつけて一遍には出来ないでしょう。Instr関数で文字の出現位置を順次探り、抽選順位を判別ロジックで組まないといけないように思う。
しかし当初の文字列の内容があいまいなので下記補足を乞う。
ーーー
>VB初心者です
VBA、VB6,VB.NETのうちのどれですか?
>MOJI="A","B","C,D,E"
これをそのままコード(代入文)として載せるとエラーになると思う。
実際に動く、プログラムの代入文の表現ではどうなりますか?内容を正確に知りたいため。
分割単位の意味が不明のところが出るようにおもう。
代入する特はARRAY(0)="A"でも、Msgbox で表示すると A であり、本当はAと表示したいのか、”A"と表示したいのか
質問では紛らわしいから。
ーーー
Arrayという変数は、別にArray関数というのがあり、紛らわしいので避けるべきでしょう。
--
単なる思い付きで疑問に思った例ですか?
実際に実務などしていて、ぶつかった例ならもう少し詳しく、直面したケースを広く教えてください。
この回答への補足
回答ありがとうございます。
細くしますと
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- C言語・C++・C# c言語について array[i]-‘0’ これってどーゆー意味ですか? (ちなみに16進数を10進数 5 2022/12/06 18:39
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- Visual Basic(VBA) 型が一致しませんとエラー 6 2023/07/06 20:14
- JavaScript java keyを配列で表記したい 10 2022/12/01 17:53
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/02/07 09:58
- Visual Basic(VBA) VBA シート上にドロップダウンリストを作り、予め指定値をセットしたいのですが 1 2023/03/25 15:15
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
二次元配列のインデックスについて
-
エクセルVBAでTransposeの不思議
-
リストボックスに縦スクロール...
-
Dim flag(4) as boolean で配列...
-
VBAのautofilter、criteriaの配...
-
マクロ Publicでの配列定義
-
バイナリデータの検索(VB.NET2008)
-
Strawberry Perl for Windows ...
-
チェックボックスのperlでの値...
-
perl 配列の要素数について
-
Perlで<select multiple>の複数...
-
perlで配列の要素が空なのを知...
-
参照配列の要素数の求め方は?
-
DBIを使ってSelect文 複数のカ...
-
VBA 多次元配列を用いてグルー...
-
vb.netです。2次元配列の要素を...
-
VB2010でCSVファイルの読み込み
-
ボタンが押された時にループか...
-
VBAでの一時停止と再開の方法
-
列挙型と連想配列の違いを教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAでTransposeの不思議
-
マクロ Publicでの配列定義
-
Excel VBA ユーザーフォームの...
-
リストボックスに縦スクロール...
-
VBAのautofilter、criteriaの配...
-
クラスに配列を渡す方法
-
perlで配列の要素が空なのを知...
-
Dim flag(4) as boolean で配列...
-
二次元配列のインデックスについて
-
文字の整列(printf)
-
二次元配列における要素数のは...
-
N88互換BASICで「メッセージの...
-
VBA 多次元配列を用いてグルー...
-
チェックボックスのperlでの値...
-
VBScript 配列
-
VBA 二次元配列の1つ目を増...
-
DataGridViewに配列の値を表示...
-
jcode->jfold で禁則処理
-
重複しない乱数発生
-
perl 配列の要素数について
おすすめ情報