2

プログラミング初心者です。単一のファイル (4 列のデータがある) を開き、4 番目の列をリストに抽出するコードを C# で作成しました。次に、データセットの平均値、最小値、および最大値を抽出するために、データに対していくつかの基本的な作業を行いました。次に、結果は平均値、最小値、最大値の専用ファイルに書き込まれました。

ここで、同じテストを繰り返したいと思いますが、複数のファイル セットに対して、それぞれに 100,000 行を超えるデータが含まれています。プログラムが同じフォルダー内の複数のファイル セットを読み取り、各ファイルに対して同じ計算を実行して、平均値、最小値、最大値のすべての結果を以前のように個別のフォルダーにコンパイルできるようにしたいと考えています。

単一ファイルのコードは次のとおりです。

    private void button1_Click_1(object sender, EventArgs e)
    {
        string text = "";
        DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
        // create a list to insert the data into
        List<float> noise = new List<float>();
        int count = 0;
        float sum = 0;
        float mean = 0; 
        float max = 0;
        float min = 100;

        TextWriter tw = new StreamWriter("c:/Users/a3708906/Documents/Filereader - 13062012/Filereader/date.txt");
        if (result == DialogResult.OK) // Test result.
        {
            string file = openFileDialog1.FileName;
            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();
                if (text != null)
                {
                    string[] words = text.Split(',');
                    noise.Add(Convert.ToSingle(words[3]));

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

            }
        }

        tw.Close();

        TextWriter tw1 = new StreamWriter("c:/Users/a3708906/Documents/Filereader - 13062012/Filereader/noise.txt");
        foreach (float ns in noise)
        {
            tw1.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;

        }

        tw1.Close();

        TextWriter tw2 = new StreamWriter("c:/Users/a3708906/Documents/Filereader - 13062012/Filereader/summarymeans.txt");
        tw2.WriteLine("Mean Noise");
        tw2.WriteLine("==========");
        tw2.WriteLine("mote_noise 2: {0}", Convert.ToString(mean));
        tw2.Close();

        TextWriter tw3 = new StreamWriter("c:/Users/a3708906/Documents/Filereader - 13062012/Filereader/summarymaximums.txt");
        tw3.WriteLine("Maximum Noise");
        tw3.WriteLine("=============");    
        tw3.WriteLine("mote_noise 2: {0}", Convert.ToString(max));
        tw3.Close();

        TextWriter tw4 = new StreamWriter("c:/Users/a3708906/Documents/Filereader - 13062012/Filereader/summaryminimums.txt");
        tw4.WriteLine("Minimum Noise");
        tw4.WriteLine("=============");
        tw4.WriteLine("mote_noise 2: {0}", Convert.ToString(min));
        tw4.Close();
    }

誰かがこのコードを複数のファイルを操作するために翻訳するのを手伝ってくれたらありがたいです. ありがとうございました。

4

2 に答える 2

1

1 つのファイルを処理するためのロジックを 1 つのActionまたは void を返す関数にラップし、ファイルを列挙して ParallelEnumerable に切り替え、Parallel.ForAll を呼び出します

たとえば、単一のファイルのプロセスを実行する DoStuff(string filename) という名前のアクションまたは関数を作成した場合、次のように呼び出すことができます。

Directory.EnumerateFiles(dialog.SelectedPath).AsParallel().ForAll(doStuff);
于 2012-06-15T12:31:01.763 に答える
0

Directory.GetFiles()を適切に使用するだけで、現在のコードが機能します。これを行う最も簡単な方法は、3 つの入力を使用することです。1 つはディレクトリを取得するためのもの、もう 1 つはファイル拡張子を取得するためのもの (必要な場合)、およびフォルダーを再帰的に検索するかどうかを尋ねるチェックボックスです。

次に、代わりに

        string file = openFileDialog1.FileName;

代わりに次のようなものがあります

        //ensure the default fileExtensionDropdown.SelectedValue is "*"
        string[] filePaths;
        if(chkRecursiveSearch.IsChecked == true)
           filePaths = Directory.GetFiles(dlgFolderBrowser.SelectedPath, @"*"+ddlFileExtension.SelectedValue, SearchOption.AllDirectories);
        else
           filePaths = Directory.GetFiles(dlgFolderBrowser.SelectedPath, @"*"+ddlFileExtension.SelectedValue);

次に、次を使用できます。

        for(string path in filePaths){ // do things }

現在の方法で各ファイルパスを処理します。

私がここに置いたコードは、可能な限り慣用的で整然としたものではないことに注意してください。しかし、あなたが初心者だと言ったので、もう少し明確にすることにしました。リクエストがあれば、より慣用的な解釈を加えますが、そうする場合は、最初のコードも少しクリーンアップする必要があります。

于 2012-06-13T15:36:15.423 に答える