ページ 11

VC++での文字列の二次元配列について

Posted: 2010年4月25日(日) 13:05
by 真由美
VC++では文字列をString型で扱うみたいなのですがこれの二次元配列は可能なのでしょうか?
カンマ区切りのCSVファイルを読み込んで
二次元配列に格納すると言った処理をしたいのですがやり方がわかりません。

他の言語だったらexplode等で分割すればできるのですが
VCだとイマイチです・・・。
System::IO::StreamReader^ sr = 
                gcnew System::IO::StreamReader("test.csv",System::Text::Encoding::GetEncoding(932));
                sr->ReadLine();
                String^ Item;
                while((Item = sr->ReadLine()) != nullptr){
                    this->richTextBox1->Text += Item + "\r\n";
                }
                sr->Close();
読み込みは出来ます。

Re:VC++での文字列の二次元配列について

Posted: 2010年4月25日(日) 13:48
by たいちう
回答ではないのですが、古い質問について、解決しているならば
「解決!」マークにチェックしてもらえませんか?
解決していないならば、新しい質問をする前に、
古い質問に取り組んでください。

「解決!」マークに気付いてないだけなのだと思いますが、
質問を乱発しているような印象も受けます。

Re:VC++での文字列の二次元配列について

Posted: 2010年4月25日(日) 14:41
by 真由美
すみません・・・汗
直ちに全てつけます。

ご指摘ありがとうございます。

Re:VC++での文字列の二次元配列について

Posted: 2010年4月25日(日) 15:56
by Justy
>二次元配列は可能なのでしょうか
  array<String^, 2> でどうでしょうか?


>カンマ区切りのCSVファイル読み込み
 csvの中に ""で囲まれたものがないという条件を満たすなら、Stringクラスの Split関数を使えば
簡単に分割できます。

 その条件を満たすことができない場合は、""内にカンマが入っている可能性もあるので
自分で文字列を解析して区切りがどこにあるか調べる必要があります。

 一応サンプルを載せておきます。

[color=#d0d0ff" face="monospace]
// 行毎に分割して読み込む
array<String^>^ lines_str = System::IO::File::ReadAllLines("test.csv", System::Text::Encoding::GetEncoding(932));

// 1つめの方法 : ','で区切る
array<array<String^>^>^ strArr1 = gcnew array<array<String^>^>(lines_str->Length);
for (int i = 0; i < lines_str->Length; i++)
strArr1 = lines_str->Split(',');

// 2つめの方法 : 正規表現で分割する
Regex ^re = gcnew Regex("((?<=,(?=(([^\"]*\"){2})*[^\"]*$))|^)([^\",]+|\"([^\"]|\"\")+\")");
array<Generic::List<String^>^> ^strArr2 = gcnew array<Generic::List<String^>^>(lines_str->Length);
for(int n=0; n<lines_str->Length; ++n)
{
MatchCollection ^matches = re->Matches(lines_str[n]);
List<String^>^ list = gcnew List<String^>;
for each(Match ^m in matches)
list->Add(m->Value);
strArr2[n] = list;
}
[/color]

 尚、このサンプルでは File::ReadAllLines()で一気に読み込んでいますが、大容量の csvを読み込むと
メモリを圧迫するので当初のコードの通り ReadLine()で1行ずつ読み込む方が無難ですね。