C#でcsvファイルを読み込みについて

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

C#でcsvファイルを読み込みについて

#1

投稿記事 by leaf8429 » 10年前

お久しぶりです。
C言語からCSharpに言語を変えて、勉強を兼ねて別のプログラムを書いています。
学校でjavaは習っていましたが,それほど知識があるわけではありません。
本題ですが,「csvファイルを読み込んで数字として配列に入れる」方法が分かりません。
「csvファイルを読み込めば,プログラム内で配列を書かなくて済むからプログラムを短くできる」と思い、
インターネットで拾ったプログラムをコピー,実行してみたのですが,
(URL: ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1496945284)
例外処理を挟まないと途中で止まってしまいます。
また,例外処理を挟むと配列にデータが入りません。
2つプログラムと環境を書きますので,
①どう直したらいいのか
②もし動くのであれば,環境に足りない物
を教えていただけるとありがたいです。
PC:Windows7 Home Premium(インターネット接続なし)
開発ソフト:Microsoft Visual C# 2010 Express 10.040219 SP1Main.cs

コード:

 
using DxLibDLL;

namespace Test
{
    public class Game{

        static void Main(){
            int i,j;
            DX.ChangeWindowMode(DX.TRUE); DX.SetGraphMode(1120,630, 32); 
            DX.DxLib_Init(); 
            if (DX.DxLib_Init() == -1) { return; }
            load.test();
            while (DX.ScreenFlip() == 0 && DX.ProcessMessage() == 0 && DX.ClearDrawScreen() == 0 )
            {
                for (i = 0; i < 4; i++){
                    for(j=0;j<4;j++){
                        DX.DrawString(50 + i * 50, 150 + j * 20, load.matA[i, j] + ",", DX.GetColor(255, 255, 0));
                        DX.DrawString(400 + i * 50, 150 + j * 20, load.matB[i, j] + ",", DX.GetColor(255, 255, 0));
                        DX.DrawString(700 + i * 50, 150 + j * 20, load.matAns[i, j] + ",", DX.GetColor(255, 255, 0));
                    }
                }
                DX.DrawString(50 ,500, load.b + "", DX.GetColor(255, 255, 0));
                DX.DrawString(400 , 500, load.c + "", DX.GetColor(255, 255, 0));
            }/*→*/ DX.DxLib_End();
            return;
        }
    }
}

 
Load.cs

コード:

 
using System;
using System.IO;
using System.Text;
using DxLibDLL;
namespace Test
{
    public class load{
       public static int u, v;
       public static double[,] matA = new double[4, 4];
       public static double[,] matB = new double[4, 4];
       public static double[,] matAns = new double[4, 4];
       public static string b, c;
       public static string[] a = new string[] { "読み込みに成功しました!", "読み込みに失敗しました…" };
        public static void test()
        {

            // ,区切りのCSVを開きデータを読む
            StreamReader sr = new StreamReader("test.csv", Encoding.GetEncoding("Shift_JIS"));

            //4x4を読んでみる
            for (u = 0; u < 4; u++)
            {
                string text = sr.ReadLine();
                //Console.Write("Read:" + text + "\n");
                string[] data = text.Split(',');
            //    DX.DrawString(50, 150+u*50  , data[0] + ",", DX.GetColor(0, 0, 0));
                //数値に
                for (v = 0; v < 4; v++){
                    try { matA[u, v] = Double.Parse(data[v]); b = a[0]; } //コピーしたコードではここと
                    catch{ b=a[1]; }
                    DX.DrawString(50+v*50, 150 + u * 20, matA[u,v] + ",", DX.GetColor(255, 255, 0));
                }
            }

            //4x4を読んでみる
            for (u = 0; u < 4; u++)
            {
                string text = sr.ReadLine();
                //Console.Write("Read:" + text + "\n");
                string[] data = text.Split(',');
                //数値に
                //    DX.DrawString(50, 150+u*50  , data[0] + ",", DX.GetColor(0, 0, 0));
                for (v = 0; v < 4; v++)
                {
                    try { matB[u, v] = Double.Parse(data[v]); c = a[0]; } //ここで止まります。
                    catch { c = a[1]; }
                    DX.DrawString(50 + v * 50, 250 + u * 20, matB[u, v] + ",", DX.GetColor(255, 255, 0));
                }
            }
            sr.Close();

            //加算してみる
            matAns = add(matA, matB);

            //結果

        }

        // Matrixの加算の例
        static double[,] add(double[,] matA, double[,] matB)
        {
            int len0 = matA.GetLength(0);
            int len1 = matA.GetLength(1);
            double[,] ans = new double[len0, len1];
            for (int u = 0; u < len0; u++)
                for (int v = 0; v < len1; v++)
                    ans[u, v] = matA[u, v] + matB[u, v];
            return ans;
        }
    }
}
 
なお,

コード:

 
 matA[u, v] = Double.Parse(data[v]); 
を,

コード:

 
 matA[u, v] = 1;
とするとエラーを吐かないようです。matBも同様にするとエラーを吐かず,matAnsの要素がすべて計算されます。

…長くなりましたが,どうかご教示よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C#でcsvファイルを読み込みについて

#2

投稿記事 by みけCAT » 10年前

とりあえずWindows Vista、VC#2008 Express Edition (.NET Framework 3.5、コンソール アプリケーション)で以下のコードを実行しましたが、
提示されたサイトに書かれていた内容の入力ファイルを適切な位置においた場合、例外は発生しませんでした。
CSVファイルの内容が正しいかを確認して下さい。
内容が正しい場合、環境の違いかもしれないので、発生した例外のメッセージを教えてください。

コード:

using System;
using System.IO;
using System.Text;
//using DxLibDLL;
namespace Test
{
    public class load
    {
        public static int u, v;
        public static double[,] matA = new double[4, 4];
        public static double[,] matB = new double[4, 4];
        public static double[,] matAns = new double[4, 4];
        public static string b, c;
        public static string[] a = new string[] { "読み込みに成功しました!", "読み込みに失敗しました…" };
        public static void test()
        {

            // ,区切りのCSVを開きデータを読む
            StreamReader sr = new StreamReader("test.csv", Encoding.GetEncoding("Shift_JIS"));

            //4x4を読んでみる
            for (u = 0; u < 4; u++)
            {
                string text = sr.ReadLine();
                //Console.Write("Read:" + text + "\n");
                string[] data = text.Split(',');
                //    DX.DrawString(50, 150+u*50  , data[0] + ",", DX.GetColor(0, 0, 0));
                //数値に
                for (v = 0; v < 4; v++)
                {
                    matA[u, v] = Double.Parse(data[v]); b = a[0];
                    //try { matA[u, v] = Double.Parse(data[v]); b = a[0]; } //コピーしたコードではここと
                    //catch { b = a[1]; }
                    //DX.DrawString(50 + v * 50, 150 + u * 20, matA[u, v] + ",", DX.GetColor(255, 255, 0));
                    Console.WriteLine(matA[u, v] + ",");
                }
            }

            //4x4を読んでみる
            for (u = 0; u < 4; u++)
            {
                string text = sr.ReadLine();
                //Console.Write("Read:" + text + "\n");
                string[] data = text.Split(',');
                //数値に
                //    DX.DrawString(50, 150+u*50  , data[0] + ",", DX.GetColor(0, 0, 0));
                for (v = 0; v < 4; v++)
                {
                    matB[u, v] = Double.Parse(data[v]); c = a[0];
                    //try { matB[u, v] = Double.Parse(data[v]); c = a[0]; } //ここで止まります。
                    //catch { c = a[1]; }
                    //DX.DrawString(50 + v * 50, 250 + u * 20, matB[u, v] + ",", DX.GetColor(255, 255, 0));
                    Console.WriteLine(matB[u, v] + ",");
                }
            }
            sr.Close();

            //加算してみる
            matAns = add(matA, matB);

            //結果

        }

        // Matrixの加算の例
        static double[,] add(double[,] matA, double[,] matB)
        {
            int len0 = matA.GetLength(0);
            int len1 = matA.GetLength(1);
            double[,] ans = new double[len0, len1];
            for (int u = 0; u < len0; u++)
                for (int v = 0; v < len1; v++)
                    ans[u, v] = matA[u, v] + matB[u, v];
            return ans;
        }

        public static void Main(String[] args)
        {
            test();
        }
    }
}
添付ファイル
test.csv
入力ファイル
(101 バイト) ダウンロード数: 107 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

leaf8429

Re: C#でcsvファイルを読み込みについて

#3

投稿記事 by leaf8429 » 10年前

お早いご返信有難うございます。

ファイルの場所が間違っていた,もしくはプログラム内のファイル名の打ち間違いという
初歩的なミスが原因でした。csvファイルの場所が原因だということは気が付きませんでした。

ご迷惑をおかけしましたが,有難うございました。

閉鎖

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