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

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

ただいまの
回答率

90.51%

  • C#

    9041questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,482

inari_ken

score 7

前提・実現したいこと

こんにちは。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項目数と固定で入れています。しかし、項目数は変動するのでこのままではエラーになってしまいます。

該当のソースコード

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

            }
            sr.Close();

試したこと

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

補足情報(言語/FW/ツール等のバージョンなど)

visualstudio2015を使用しています。
是非ともご回答のほど宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

レコード数が最初に決められない場合は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 19:53

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

    キャンセル

  • 2016/06/02 00:07

    この質問に関してはozwkさんの方が適切ですよ。

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

    キャンセル

  • 2016/06/02 00:19

    Zuishinさん

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

    キャンセル

  • 2016/06/02 01:12

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    9041questions

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