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

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

ただいまの
回答率

89.54%

C# CSVファイルを配列に格納し、配列をグローバル変数として、別クラスで、使用したい。

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 11K+

KKcambodia

score 12

以下のコードで、CSVファイルを配列に格納して、
別クラスで、配列を使用したいのですが、
どのようにすればよいのでしょうか?

c#歴1か月の初心者ですので、○○を参照というよりは、
コードを書いていただけると助かります。

よろしくお願いいたします。

using System;
using System.Windows.Forms;

namespace xxxxxx
{
    public partial class CSVmasterRaead
    {
        public Form1()
        {
            stArrayData;  //読み込めないです・・・・
        }
}

using System;
using System.Windows.Forms;

namespace csvedit
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("処理を開始します");
            ReadCsv();
        }
        static void ReadCsv()
    {
        try
        {
                // csvファイルを開く
                System.IO.DirectoryInfo dirPath = 
                    new System.IO.DirectoryInfo(@"E:/Desktop/Study/StudyProject/IN/");
                System.IO.FileInfo[] files =
                     dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories);

                // 指定フォルダからCSVを取得し、配列に格納する。
                foreach (System.IO.FileInfo filePath in files)
                {
                    using (var readCsv = new System.IO.StreamReader(filePath.FullName))
                    {
                        //ヘッダを読み捨てる。
                        readCsv.ReadLine();
                        // ストリームの末尾まで繰り返す
                        while (!readCsv.EndOfStream)
                        {
                            // ファイルから一行読み込む
                            string line = readCsv.ReadLine();
                            // カンマ区切りで分割して配列に格納する
                            string[] stArrayData = line.Split(',');
                        }
                    }
                }
            }
        catch (System.Exception e)
            {
            // ファイルを開くのに失敗したとき
            MessageBox.Show(e.ToString());
            }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/06/19 14:10

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • KKcambodia

    2016/06/19 20:20

    超初心者なので、丸投げの質問になります。
    なにが出来なくて、実現できないのかの切り分けもできません。。。
    ご容赦頂きたく。

    キャンセル

  • KKcambodia

    2016/06/19 20:58

    超初心者なので、丸投げの質問になります。 なにが出来なくて、実現できないのかの切り分けもできません。。。 ご容赦頂きたく。

    キャンセル

回答 5

checkベストアンサー

+2

手っ取り早いのは、publicstaticフィールドとしてList<string[]>を定義して、そこにCSVファイルの内容を格納していけば良いと思います。

// stArrayDataをpublicなstaticフィールドとして定義すれば、別クラスから参照可能
public static List<string[]> stArrayData = new List<string[]>();

ファイル読み込み部分はこのようにしてください。

// カンマ区切りで分割して配列に格納する
string[] record = line.Split(',');
stArrayData.Add(record);

追記
Form1のコードを載せます。★マークが追加・変更部分です。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("処理を開始します");
        ReadCsv();
    }

    public static List<string[]> stArrayData = new List<string[]>();    // ★

    static void ReadCsv()
    {
        try
        {
            // csvファイルを開く
            System.IO.DirectoryInfo dirPath =
                new System.IO.DirectoryInfo(@"E:/Desktop/Study/StudyProject/IN/");
            System.IO.FileInfo[] files =
                 dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories);

            // 指定フォルダからCSVを取得し、配列に格納する。
            foreach(System.IO.FileInfo filePath in files)
            {
                using(var readCsv = new System.IO.StreamReader(filePath.FullName))
                {
                    //ヘッダを読み捨てる。
                    readCsv.ReadLine();
                    // ストリームの末尾まで繰り返す
                    while(!readCsv.EndOfStream)
                    {
                        // ファイルから一行読み込む
                        string line = readCsv.ReadLine();
                        // カンマ区切りで分割して配列に格納する
                        string[] record = line.Split(',');  // ★
                        stArrayData.Add(record);            // ★
                    }
                }
            }
        }
        catch(System.Exception e)
        {
            // ファイルを開くのに失敗したとき
            MessageBox.Show(e.ToString());
        }
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/19 17:55

    catsforepawさま

    アドバイスありがとうございます。
    しかし、私は、低レベルな人間であるため、
    上記ヒントだけだと、わからないのです・・・

    LISTにする意味はいまでも理解できませんが、
    Staticにする意味はわかりました。

    しかし、コードを記載している箇所が悪いようで、
    ビルドエラーから抜け出せません。
    そんなレベルなのです。。。
    _| ̄|○

    キャンセル

  • 2016/06/19 18:17

    Form1のコードは回答の方に追記します。
    CSVmasterRaeadクラスの中からstArrayDataを参照する際は`csvedit.Form1.stArrayData`と書いてください。

    CSVは複数レコードで構成されているので、そのすべてのレコードを保存するためにListを使います。1レコードは複数フィールドで構成されているためstring[]にデータを保存しますが、それが複数レコードあるので、List<string[]>となります。

    キャンセル

  • 2016/06/19 19:35

    catsforepawさま

    ご回答ありがとうござます。
    LISTの意味もよくわかりました。

    しかしビルドエラーになります。。。_| ̄|○
    別クラスで、LIST変数を読み込みたいのと、
    別クラスでメソッドを呼べるかの実験もしたかったので、
    Form1のclassのメソッド部分をpublicに変更
    旧:static void ReadCsv()
    新:public static void ReadCsv()

    そして、別classに以下のようにコーディング
    をしても、static変数の箇所でビルドエラーになります。。。
    ”割り当て、呼び出し、インクリメント、デクリメント、新しいオブジェクトの式のみがステートメントとして使用できます。”
    ググってもさっぱりです。。。

    //名前空間は同じ
    static class Program
    {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
    // staticメソッド
    Form1.ReadCsv();
    // static変数が読み込めない??
    Form1.stArrayData;
    }
    }

    キャンセル

  • 2016/06/19 20:14

    static変数を読み込むところで、
    LIST型定義をしてあげたら、読み込めました。
    ありがとうございました。
    たったこんだけのソースで丸一日かかりました。。。
    情けない。。。
    catsforepawさまの支援がなければ、徹夜でした。

    ありがとうございました。


    // static変数が読み込めない
    List<string[]> csvedit = new List<string[]>(); //追加
    csvedit = Form1.stArrayData;

    キャンセル

+1

初心者ならばこそ結果だけもらうのではなく勉強しましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/19 14:14

    stArrayData は ReadCsv のローカル変数なので、これを外からアクセスすることはできません。ローカル変数を外から読めるようにするには、おおまかに次の四つの方法があります。

    1 戻り値として出力する、つまり return で返す。
    2 out を使った参照渡しの引数として返す。
    3 グローバル変数に入れる。
    4 ファイルなどにシリアライズして読み込む。

    このうち、推奨されるのは 1 2 です。
    まず、ここまで理解してください。
    わからないところはキーワードを Google で検索してください。

    キャンセル

  • 2016/06/19 14:33

    Zuishinさま
    日曜日なのにお付き合い頂きまして、ありがとうございます。
    ↑のヒントは理解できました。

    参照渡しというのも理解が乏しいので、頂いたヒントをもとに
    2の方法で実験してみます。

    また、初めのご指摘の
    CSVの仕様ですが、とりあえず
    SJISで、”編集なしのカンマ区切り、ヘッダーあり(ヘッダーチェックはしない)
    でやろうと思います。
    こちらの味付けは、ある程度あたりがついているので、後回しと思っています。

    お付き合い頂きまして感謝しております。

    キャンセル

  • 2016/06/19 20:17

    Zuishinさま

    グローバル変数を参照する形で、実現できました。
    ただ参照渡しは、必要なので、勉強してみます。
    ありがとうございました。

    キャンセル

0

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/19 15:58

    dojikkoさま

    いつも回答をありがとうございます。
    上記のVBのやり方は既に知っていました。

    なんとかC#でのみの解決を探っています。

    後学の為に、参考にさせていただきます。

    CCcambodia

    キャンセル

0

'stArrayData' はコントロールが現在のメソッドを抜ける前に割り当てられる必要があります。
のエラーのコードになります。
get setを指定するような記述のサイトもありましたが、
うまくいきませんでした。

using System;
using System.Collections;
using System.Windows.Forms;

namespace StudyProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("処理を開始します");
            string[] stArrayData;
            ReadCsv(out stArrayData);
        }

        public static void ReadCsv(out string[] stArrayData)
        {
        try
            {
                // csvファイルを開く
                System.IO.DirectoryInfo dirPath = 
                    new System.IO.DirectoryInfo(@"E:/Desktop/Study/StudyProject/IN/");
                System.IO.FileInfo[] files =
                     dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories);

                // 指定フォルダからCSVを取得し、配列に格納する。
                foreach (System.IO.FileInfo filePath in files)
                {
                    using (var readCsv = new System.IO.StreamReader(filePath.FullName))
                    {
                        //ヘッダを読み捨てる。
                        readCsv.ReadLine();
                        // ストリームの末尾まで繰り返す
                        while (!readCsv.EndOfStream)
                        {
                            // ファイルから一行読み込む
                            string line = readCsv.ReadLine();
                            // カンマ区切りで分割して配列に格納する

                            stArrayData = line.Split(',');
                        }
                    }
                }
            }
        catch (System.Exception e)
            {
            // ファイルを開くのに失敗したとき
            MessageBox.Show(e.ToString());
            }
        }
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/19 15:55

    途中経過ですが、
    out パラメーター 'stArrayData' はコントロールが現在のメソッドを抜ける前に割り当てられる必要があります。
    といったエラーがでて、MSDNをみても意味が分かりません。
    _| ̄|○

    もう少し、調べてみます。

    キャンセル

0

参照渡しのコードについて、
foreachでループしているところを
stArrayData = new List<string>();
stArrayData.Add("data1");
stArrayData.Add("data2");
のように手入力するとうまく参照できるのですが、
以下のようにforreachを使うとうまくいきません。

リスト変数の定義場所だと思っているのですが、
場所をいろいろ変えてもうまくいきません。
↑まったく見当ちがいのところを見ているのでしょうか?

List<string[]> stArrayData

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace StudyProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("処理を開始します");
            // out を使った場合、変数を初期化不要
            List<string> stArrayData;
            CsvEdit.ReadCsv(out stArrayData);
            MessageBox.Show("ここでブレークポイントでチェック");
        }
    }

    public static class CsvEdit
    {
        public static void ReadCsv(out List<string> stArrayData)
        {
            try
            {
                // csvファイルを開く
                System.IO.DirectoryInfo dirPath =
                    new System.IO.DirectoryInfo(@"E:/StudyProject/IN/");
                System.IO.FileInfo[] files =
                     dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories);

                // 指定フォルダからCSVを取得し、配列に格納する。
                foreach (System.IO.FileInfo filePath in files)
                {
                    using (var readCsv = new System.IO.StreamReader(filePath.FullName))
                    {
                        //ヘッダを読み捨てる。
                        readCsv.ReadLine();
                        // ストリームの末尾まで繰り返す
                        while (!readCsv.EndOfStream)
                        {
                            // ファイルから一行読み込む
                            string line = readCsv.ReadLine();
                            // カンマ区切りで分割して配列に格納する
                            string[] record = line.Split(',');
                            public static List<string[]> stArrayData = new List<string[]>();
                            stArrayData.Add(record);
                        }
                    }
                }
                MessageBox.Show("読み込み完了しました。");
    }
            catch (System.Exception e)
            {
                // ファイルを開くのに失敗したとき
                MessageBox.Show(e.ToString());
            }
}
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 89.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • C#に関する質問
  • C# CSVファイルを配列に格納し、配列をグローバル変数として、別クラスで、使用したい。