3

プログラムがファイルをループしていません。プログラムは、ファイルのすべての名前を「ファイルのリスト」に正しく書き込みます。次に、各ファイルのデータリストの平均値、最小値、最大値を出力することを期待しています。ただし、実行するたびに、1 つのファイルのみの平均値、最小値、および最大値が出力されます。ループがうまく機能していないと思います。

textwriter tw3 とその閉じ括弧の間に追加のループを作成しようとしましたが、うまくいきませんでした。tw4でも同じことを試しましたが、やはりうまくいきませんでした。問題がループによるものかどうか、またはフォルダー内の各ファイルを呼び出すために正しい構文を使用していないかどうかはわかりません。コード全体は以下です。

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

        string[] fileEntries;

        private void Form1_Load(object sender, EventArgs e)
        {
            DialogResult result = folderBrowserDialog1.ShowDialog(); // Show the dialog.
            // create a list to insert the data into
            //put all the files in the root directory into array
            string[] fileEntries = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.csv");

            // Display all files.
            TextWriter tw1 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/listoffiles.txt");

            List<string> filenames = new List<string>();
            tw1.WriteLine("--- Files: ---");
            foreach (string path in fileEntries)
            {
                tw1.WriteLine(path);
            }

            tw1.Close();

            TextWriter tw2 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/errorlist.txt");
            foreach (string path in fileEntries)
            {  
                    string text = "";

                    // create a list to insert the data into
                    List<float> noise = new List<float>();

                    TextWriter tw3 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/rawdata.txt");

                    string file = path;

                    FileInfo src = new FileInfo(file);
                    TextReader reader = src.OpenText();
                    text = reader.ReadLine();

                    // while the text being read in from reader.Readline() is not null
                    while (text != null)
                    {
                        text = reader.ReadLine();

                        {
                            while (text != null)
                            {
                                text = reader.ReadLine();
                                if (text != null)
                                {
                                    string[] words = text.Split(',');
                                    noise.Add(Convert.ToSingle(words[3]));

                                    // write text to a file
                                    tw3.WriteLine(text);
                                    //foreach (string word in words)
                                    //{
                                    //    tw.WriteLine(word);
                                    //}
                                }

                            }
                        }

                        tw3.Close();


                        int count = 0;
                        float sum = 0;
                        float mean = 0;
                        float max = 0;
                        float min = 100;
                        List<string> means = new List<string>();
                        List<string> maximums = new List<string>();
                        List<string> minimums = new List<string>();

                        TextWriter tw4 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/noise.txt");

                            foreach (float ns in noise)
                            {
                                tw4.WriteLine(Convert.ToString(ns));
                                count++;
                                sum += ns;
                                mean = sum / count;

                                float min1 = 0;


                                if (ns > max)
                                    max = ns;

                                else if (ns < max)
                                    min1 = ns;

                                if (min1 < min && min1 > 0)
                                    min = min1;
                                else
                                    min = min;
                            }

                            means.Add(Convert.ToString(mean));
                            maximums.Add(Convert.ToString(max));
                            minimums.Add(Convert.ToString(min));


                            TextWriter tw5 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/summarymeans.txt");
                            tw5.WriteLine("Mean Noise");
                            tw5.WriteLine("==========");
                            foreach (string m in means)
                            {
                                tw5.WriteLine("mote_noise: {0}", Convert.ToString(m));
                            }

                            tw5.Close();

                            TextWriter tw6 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/summarymaximums.txt");
                            tw6.WriteLine("Maximum Noise");
                            tw6.WriteLine("=============");
                            foreach (string m in maximums)
                            {
                                tw6.WriteLine("mote_noise: {0}", Convert.ToString(m));
                            }

                            tw6.Close();

                            TextWriter tw7 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/summaryminimums.txt");
                            tw7.WriteLine("Minimum Noise");
                            tw7.WriteLine("=============");
                            foreach (string m in maximums)
                            {
                                tw7.WriteLine("mote_noise: {0}", Convert.ToString(m));
                            }

                            tw7.Close();


                        tw4.Close();


                    }


                tw2.Close();
            }
        }        


        private void folderBrowserDialog1_HelpRequest(object sender, EventArgs e)
        {

        }

    }
}

誰の助けにもとても感謝します!!

4

3 に答える 3

1

Reniuzが指摘したように、この種の問題が発生した場合は、コードをステップスルーする必要があります。Visual Studioでは、ステップスルーを開始するブレークポイント(F9)を設定し、デバッガーがポイントに到達したらF11を繰り返し押すのと同じくらい難しいです。

ただし、あなたの場合、2つのエラーはwhileループとforeachループからのものです。ループの正しいバージョンと完全なコードを以下に示します。

whileループは次のようになります。

// while the text being read in from reader.Readline() is not null
while (text != null)
{
     string[] words = text.Split(',');
     noise.Add(Convert.ToSingle(words[3]));
     // write text to a file
     tw3.WriteLine(text);
     text = reader.ReadLine();
 }

2番目のループは次のようになります。

foreach (float ns in noise)
{
     tw4.WriteLine(Convert.ToString(ns));
     count++;
     sum += ns;
     mean = sum / count;
     float min1 = 0;
     if (ns > max)
     max = ns;
     else if (ns < max)
         min1 = ns;
     if (min1 < min && min1 > 0)
         min = min1;
     means.Add(Convert.ToString(mean));
     maximums.Add(Convert.ToString(max));
     minimums.Add(Convert.ToString(min));
 }

そしてここに完全なコードがあります

  private void Form1_Load(object sender, EventArgs e)
              DialogResult result = folderBrowserDialog1.ShowDialog(); // Show the dialog.
        // create a list to insert the data into
        //put all the files in the root directory into array
        string[] fileEntries = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.csv");

        // Display all files.
        TextWriter tw1 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/listoffiles.txt");

        List<string> filenames = new List<string>();
        tw1.WriteLine("--- Files: ---");
        foreach (string path in fileEntries)
        {
            tw1.WriteLine(path);
        }

        tw1.Close();

        TextWriter tw2 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/errorlist.txt");
        foreach (string path in fileEntries)
        {
            string text = "";

            // create a list to insert the data into
            List<float> noise = new List<float>();

            TextWriter tw3 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/rawdata.txt");

            string file = path;

            FileInfo src = new FileInfo(file);
            TextReader reader = src.OpenText();
            text = reader.ReadLine();

            // while the text being read in from reader.Readline() is not null
            while (text != null)
            {
                string[] words = text.Split(',');
                noise.Add(Convert.ToSingle(words[3]));

                // write text to a file
                tw3.WriteLine(text);
                text = reader.ReadLine();
            }

            tw3.Close();

            int count = 0;
            float sum = 0;
            float mean = 0;
            float max = 0;
            float min = 100;
            List<string> means = new List<string>();
            List<string> maximums = new List<string>();
            List<string> minimums = new List<string>();

            TextWriter tw4 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/noise.txt");

            foreach (float ns in noise)
            {
                tw4.WriteLine(Convert.ToString(ns));
                count++;
                sum += ns;
                mean = sum / count;
                float min1 = 0;
                if (ns > max)
                    max = ns;

                else if (ns < max)
                    min1 = ns;

                if (min1 < min && min1 > 0)
                    min = min1;
                means.Add(Convert.ToString(mean));
                maximums.Add(Convert.ToString(max));
                minimums.Add(Convert.ToString(min));
            }

            TextWriter tw5 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/summarymeans.txt");
            tw5.WriteLine("Mean Noise");
            tw5.WriteLine("==========");
            foreach (string m in means)
            {
                tw5.WriteLine("mote_noise: {0}", Convert.ToString(m));
            }

            tw5.Close();

            TextWriter tw6 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/summarymaximums.txt");
            tw6.WriteLine("Maximum Noise");
            tw6.WriteLine("=============");
            foreach (string m in maximums)
            {
                tw6.WriteLine("mote_noise: {0}", Convert.ToString(m));
            }
            tw6.Close();

            TextWriter tw7 = new StreamWriter(folderBrowserDialog1.SelectedPath + "/summaryminimums.txt");
            tw7.WriteLine("Minimum Noise");
            tw7.WriteLine("=============");
            foreach (string m in maximums)
            {
                tw7.WriteLine("mote_noise: {0}", Convert.ToString(m));
            }
            tw7.Close();
            tw4.Close();
        }


        tw2.Close();
 }
于 2012-06-20T19:53:53.223 に答える
1

あなたが言ったように、あなたのループは私には正しく見えません。このようなことを試してみませんか (「...」は、簡潔にするためにコピーしなかったコードのセクションを表します)。text = reader.ReadLine();を含むwhile (text != null)が1 つあることに注意してください。例の複数の while と if の代わりに最後に。

        foreach (string path in fileEntries)
        {
            ...
            string text = reader.ReadLine();

            // while the text being read in from reader.Readline() is not null
            while (text != null)
            {
                string[] words = text.Split(',');
                noise.Add(Convert.ToSingle(words[3]));

                // write text to a file
                tw3.WriteLine(text);
                //foreach (string word in words)
                //{
                //    tw.WriteLine(word);
                //}

                ...

                text = reader.ReadLine();
            }
            tw3.Close();
        }
于 2012-06-20T14:48:33.440 に答える
1

ファイルを反復処理する for ループ内で数値 (平均、モード、合計、カウントなど) を初期化するため、ファイルごとに数値がリセットされます。

ループの外でそれらを初期化すると、機能するはずです。(他の人が指摘しているように、あまりきれいに見えない限り、コードには他の問題がありますが、それが根本的な問題です。)

于 2012-06-20T13:39:37.080 に答える