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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
真由美

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

#1

投稿記事 by 真由美 » 15年前

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++での文字列の二次元配列について

#2

投稿記事 by たいちう » 15年前

回答ではないのですが、古い質問について、解決しているならば
「解決!」マークにチェックしてもらえませんか?
解決していないならば、新しい質問をする前に、
古い質問に取り組んでください。

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

真由美

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

#3

投稿記事 by 真由美 » 15年前

すみません・・・汗
直ちに全てつけます。

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

Justy

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

#4

投稿記事 by Justy » 15年前

>二次元配列は可能なのでしょうか
  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行ずつ読み込む方が無難ですね。

閉鎖

“C言語何でも質問掲示板” へ戻る