C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

csvから配列格納方法について

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■98841 / inTopicNo.1)  csvから配列格納方法について
  
□投稿者/ 初心者 (11回)-(2022/01/02(Sun) 07:54:25)

分類:[C#] 

初心者のため、C#に詳しくなくご相談します。

いま、CSVファイルがあり、3列目までが説明変数、
4列目が目的変数として、4組のデーターを解析したいと思っています。


・「inputfile.csv」

 0.00625, 0.03448276, 0.0483871, 0.04
 0.21875, 0.2068966,  0.2580645, 0.24
 0.46875, 0.4137931,  0.5483871, 0.52
 1,     1,	       1,	  1

これを、コンボボックス1に次の通り埋め込んでコンパイルすると計算が成功します。

comboValue == "1"


  trainData.Add(new NData(new List<double>() { 0.00625, 0.03448276, 0.0483871 }, new List<double>() { 0.04 }));
  trainData.Add(new NData(new List<double>() { 0.21875, 0.2068966, 0.2580645 }, new List<double>() { 0.24 }));
  trainData.Add(new NData(new List<double>() { 0.46875, 0.4137931, 0.5483871 }, new List<double>() { 0.52 }));
  trainData.Add(new NData(new List<double>() { 1, 1, 1 }, new List<double>() { 1 }));


上述の方法では、データー毎に埋め込んでコンパイルしないといけません。
汎用的にCSVファイルを読み込んで、説明変数をX、目的変数をYとしてCSV形式で読み込んで、
実施するコンボボックス「FILE」を作成しました。

説明変数X、目的変数Yは正しく読み込まれていることを確認出来ましたが、最後にXData、YDataに格納する際に、
comboValue == "1"のように、Xが3配列、Yが1配列になりません。
さらに、i,jが読み取れないとエラーになります。

  trainData.Add(new NData(new List<double>() { XData[i, j] }, new List<double>() { YData[i, j7] }));

 単純なCSVファイルを読み込んで、格納するだけの処理ですが、初心者のため失敗続きでした。
ご助言頂けますと有難く存じます。


            記


namespace NNet{
    public partial class Form1 : Form{              

        private NTrainer trainer;

        public Form1()
        {
            InitializeComponent();

            comboBox1.Items.AddRange(new string[]{ "1", "2", "3", "File" });
            comboBox1.SelectedIndex = 3;

        }

        private void button1_Click( object sender, EventArgs e ) {
         


                List<NData> trainData = new List<NData>();

            if(comboBox1.SelectedIndex == -1) return;

            if(trainer == null) {
                var comboValue = comboBox1.Items[comboBox1.SelectedIndex].ToString();
                if (comboValue == "1")
                {
                    trainData.Add(new NData(new List<double>() { 0.00625, 0.03448276, 0.0483871 }, new List<double>() { 0.04 }));
                    trainData.Add(new NData(new List<double>() { 0.21875, 0.2068966, 0.2580645 }, new List<double>() { 0.24 }));
                    trainData.Add(new NData(new List<double>() { 0.46875, 0.4137931, 0.5483871 }, new List<double>() { 0.52 }));
                    trainData.Add(new NData(new List<double>() { 1, 1, 1 }, new List<double>() { 1 }));
                }
                else if (comboValue == "2")


                  ・・・・・・(途中省略)・・・・・・


                else if (comboValue == "File")
                {

                    List<double> numbers = new List<double>();
                    foreach (string line in File.ReadAllLines("inputfile.csv"))
                    {
                        foreach (string word in line.Split(',')){
                            numbers.Add(Double.Parse(word));


                            //確認用 
                   
                            string[] cols = word.Split(',');
                            for (int n = 0; n < cols.Length; n++)

                                MessageBox.Show(cols[n]);

                            //確認用終了

                        }
                    }

                    //確認用

                    using (StreamWriter sWriter = new StreamWriter("output.csv", false, Encoding.GetEncoding("Shift_JIS")))

                        foreach (var s in numbers)
                        {
                            sWriter.WriteLine("{0} ", s);  
                        }

                    //確認用終了


                    int NDP = 4;
                    int Input_Unit = 3;
                    int Output_Unit = 1;

                    double[,] XData = new double[NDP, Input_Unit];
                    double[,] YData = new double[NDP, Output_Unit];

                    int line_count = 4; 
                    int col_count = 4; 

                    // 2次元配列の定義
                    double[,] InData = new double[line_count, col_count];
                    int a = 0, b = 0;
                    foreach (string line in File.ReadAllLines("inputfile.csv"))
                    {
                        foreach (string word in line.Split(','))
                        {                         
                            InData[a, b] = Convert.ToDouble(word);
                            b++;
                        }


                        //確認用

                        using (StreamWriter sWriter2 = new StreamWriter("output2.csv", false, Encoding.GetEncoding("Shift_JIS")))

                            foreach (var t in InData)
                            {
                                sWriter2.WriteLine("{0} ", t);  
                            }

                        //確認用終了


                        for (int i = 0; i < NDP; i++)
                        {
                            for (int j = 0; j < Input_Unit; j++)
                            {
                                XData[i, j] = InData[i, j];                                
                            }

                            using (StreamWriter sWriter3 = new StreamWriter("outputX.csv", false, Encoding.GetEncoding("Shift_JIS")))

                                foreach (var t in XData)
                                {
                                    sWriter3.WriteLine("{0} ", t); 
                                }

                            int jb = Input_Unit;

                            for (int j7 = 0; j7 < Output_Unit; j7++)
                            {
                                YData[i, j7] = InData[i, jb + j7];

                                using (StreamWriter sWriter4 = new StreamWriter("outputY.csv", false, Encoding.GetEncoding("Shift_JIS")))

                                    foreach (var t in YData)
                                    {
                                        sWriter4.WriteLine("{0} ", t);  
                                    }

                                trainData.Add(new NData(new List<double>() { XData[i, j] }, new List<double>() { YData[i, j7] }));

                             }

                        }

                        b = 0;
                        a++;
                    }


                }
            } else {
                trainData = trainer.NData;
            }

            if(trainData.Count > 0){
                Run(trainData);
            }
        }


引用返信 編集キー/
■98842 / inTopicNo.2)  Re[1]: csvから配列格納方法について
□投稿者/ Hongliang (1207回)-(2022/01/02(Sun) 14:00:02)
単純に、ReadLineで1行読んで、Splitして、前3要素と最後1要素でそれぞれList<double>を作ってNDataにする、ではいけないのでしょうか。

ファイル出力するにしても、いったんList<NData>を完成させてから、改めて出力に必要なデータをList<NData>から構成するようにした方が分かりやすいのではないかと思います。
引用返信 編集キー/
■98843 / inTopicNo.3)  Re[2]: csvから配列格納方法について
□投稿者/ ロッテモナ王 (12回)-(2022/01/02(Sun) 15:12:16)
LINQ使うとよいかも
https://paiza.io/projects/x9oYU4B-ZMZoufgYgEBD8g
引用返信 編集キー/
■98844 / inTopicNo.4)  Re[3]: csvから配列格納方法について
□投稿者/ 初心者 (12回)-(2022/01/02(Sun) 16:16:40)
ロッテモナ王 様

ご丁寧な回答有難うございます。

> LINQ使うとよいかも
> https://paiza.io/projects/x9oYU4B-ZMZoufgYgEBD8g

全くの初心者でしたので、LINQも初めて聞きました。

見よう見まねで、下記のソースにHello.csを追加してみたのですが、
やはりエラーが出てしまいました。「Visual Studio 2019」で実施しました。

CSV形式のinputファイルを下記のコードから読み取れるようにしたいのですが、
加筆修正が可能でしたら、ご助言頂けますと有難く存じます。


            記

https://firestorage.jp/download/faa797fa70dab6effc724287aefaf9ee2b8da8a4


引用返信 編集キー/
■98845 / inTopicNo.5)  Re[4]: csvから配列格納方法について
□投稿者/ ロッテモナ王 (13回)-(2022/01/02(Sun) 17:30:25)
No98844 (初心者 さん) に返信

はえーすごい、グラフが表示された
機械学習っぽいですね、青が期待値で赤が予測値ですかね

> else if (comboValue == "File")
> {
> 
>   List<double> numbers = new List<double>();
> 
>   trainData.Add(new Hello(new List<double>() { List1 }, new List<double>() { List2 }));
> 
> }

↑ これを ↓ こんな感じにすればいいです

else if (comboValue == "File")
{
  var xs = File.ReadLines(@"C:\Users\a\Downloads\source\NeuralNet\inputfile.csv")
    .Select(x => x.Split(','))
    .Select(x => x.Select(y => Double.Parse(y)))
    .Select(x => new NeuralData(
        x.Take(x.Count() - 1).ToList(),
        x.Skip(x.Count() - 1).ToList()
    ));

  foreach (var x in xs)
  {
    trainData.Add(x);
  }
}

ファイルパスは私のローカルパスなので書き換えてもらってHello.csはただのサンプルなので削除してください

引用返信 編集キー/
■98846 / inTopicNo.6)  Re[5]: csvから配列格納方法について
□投稿者/ 初心者 (13回)-(2022/01/02(Sun) 18:57:56)
ロッテモナ王 様


早速のご回答有難うございます。


> はえーすごい、グラフが表示された
> 機械学習っぽいですね、青が期待値で赤が予測値ですかね

お見込みのとおりです。

成功しました!有難うございます。動いたので感動しました!

お陰様で汎用化出来そうです。

出力値が1つの場合でしたが、2つ以上になる際には、

「x.Count() - 1」

の「1」を、OutPutUit数とすれば良いのではと感じました。


.Select(x => new NeuralData(
x.Take(x.Count() - 1).ToList(),
x.Skip(x.Count() - 1).ToList()

「x =>」の処理の仕方も分からなく初めて見ました。
勉強してマスターしたいと思います。

取り急ぎお礼のメールでした。

新年早々良いスタートを切れて嬉しいです!



解決済み
引用返信 編集キー/
■98847 / inTopicNo.7)  Re[6]: csvから配列格納方法について
□投稿者/ WebSurfer (2394回)-(2022/01/02(Sun) 21:29:42)
マルチポスト
https://ja.stackoverflow.com/questions/85439/csv%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e4%bb%bb%e6%84%8f%e3%81%ae%e5%88%97%e3%81%a7%ef%bc%92%e3%81%a4%e3%81%ae%e9%85%8d%e5%88%97%e3%81%ab%e5%88%86%e5%89%b2%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ