質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

6135閲覧

C# ジャグ配列の要素数拡張について

inari_ken

総合スコア34

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/06/01 03:10

###前提・実現したいこと
こんにちは。c#初心者です。
csv形式のテキストを読み込んで、内容を全てジャグ配列に落とし込もうと考えています。
テキストファイルのレイアウトが、

6/1,Aさん,Bさん,Cさん
6/2,Aさん,Bさん
6/3,Bさん

とすれば、ジャグ配列Fは
F[0][0] ・・・ "6/1"
F[0][1] ・・・ "Aさん"
F[0][2] ・・・ "Bさん"
F[0][3] ・・・ "Cさん"
F[1][0] ・・・ "6/2"
F[1][1] ・・・ "Aさん"
F[1][2] ・・・ "Bさん"
F[2][0] ・・・ "6/3"
F[2][1] ・・・ "Bさん"

となって欲しいのです。
###発生している問題・エラーメッセージ
上記のように、csvファイルの項目数はバラバラです。
Array.Resizeを使用すれば親配列の要素数は拡張できるのですが、子配列の要素数は下記のプログラムでは3項目数と固定で入れています。しかし、項目数は変動するのでこのままではエラーになってしまいます。
###該当のソースコード

c#

1 string file = @"c:\a.txt"; 2 int rec = 0; // テキストファイルの読み込み件数 3 string[][] F = new string [1][]; 4 StreamReader sr = new StreamReader(file, Encoding.GetEncoding("SHIFT_JIS")); 5 while (sr.EndOfStream == false) 6 { 7 string line = sr.ReadLine(); 8 string[] linef = line.Split(','); 9 F[rec] = new string[] { linef[0], linef[1], linef[2] }; // 1レコードを子配列へ格納 10 rec += 1; 11 Array.Resize<string[]>(ref F, rec+1); // 親配列の拡張 12 13 } 14 sr.Close();

###試したこと
Array.Resize<string[][]>(ref F, linef.Length);
とやっても駄目でした。(そもそも根本的におかしい???)

###補足情報(言語/FW/ツール等のバージョンなど)
visualstudio2015を使用しています。
是非ともご回答のほど宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

そもそもこういう、要素数が特に決まっていない場合は
string[][]ではなく
List<List<string>>にすればいいと思います。

どうしてもジャグ配列で子要素の要素数を変えたいのなら
Resize()はFではなくF[i]に対してでしょう。

投稿2016/06/01 03:29

編集2016/06/01 03:37
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

レコード数が最初に決められない場合はListクラスを使った方が良いですね。
それと、

string[] linef = line.Split(',');
F[rec] = new string[] { linef[0], linef[1], linef[2] };

これは、Splitメソッドによりカンマ区切りで分割されたstring[]オブジェクトがlinefに返されているので、次の行のnew string[]{~}は不要で、linefをそのままFに突っ込めば良いです。

整理すると、変数FList<string[]>とし、レコード追加はF.Add(linef);とやれば良いです。

投稿2016/06/01 04:50

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

inari_ken

2016/06/01 10:53

List<string[]> F = new List<string[]>()で定義して F.Add(linef);で格納ですね!できました! 今まで配列しか使ってこなかったのでListは敬遠していたのですが、 いざ使ってみると面白いですね。
Zuishin

2016/06/01 15:07

この質問に関してはozwkさんの方が適切ですよ。 失礼ながらこのお答はリストの中身が要素数固定の配列なのであなたの問の答えにはなっていません。 同じ問題を抱えています。
catsforepaw

2016/06/01 15:19

Zuishinさん 要素数固定の意味が判りません。リストに格納されるstring[]オブジェクトの要素数は、CSVファイルに書かれている各行のフィールド数と同じになるはずなので、本件の意図に反しないと思います。
Zuishin

2016/06/01 16:12

そうですか。 それでは私が問題を見誤っているのでしょう。 余計なことを言って失礼しました。
guest

0

次のコードを試してみてください。
お望みの結果が得られるのではないかと思います。

string file = @"c:\a.txt";
string[][] F = System.IO.File.ReadLines(file)
.Select(s => s.Split(new char[] { ',' }).ToArray())
.ToArray();

投稿2016/06/01 06:35

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問