同时读取和写入多个文件,并对其执行相同的任务

本文关键字:执行 任务 文件 读取 | 更新日期: 2023-09-27 18:36:59

我是编程的初学者。我用 C# 编写了一段代码来打开单个文件(包含 4 列数据)并将第四列提取到列表中。然后对数据进行一些基本工作,以提取数据集的平均值、最小值和最大值。然后,将结果写入平均值、最小值和最大值的专用文件中。

现在我想重复相同的测试,但针对多组文件 - 每个文件都包含超过 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();
    }

如果有人可以帮助翻译此代码以处理多个文件,我将不胜感激。谢谢。

同时读取和写入多个文件,并对其执行相同的任务

处理单个文件的逻辑包装为单个 Action 或 void 返回函数,然后枚举文件,将它们切换到 ParallelEnumerable 并调用 Parallel.ForAll

例如,如果您创建了一个名为 DoStuff(字符串文件名)的操作或函数,它将为单个文件执行该过程,则可以使用 :

Directory.EnumerateFiles(dialog.SelectedPath).AsParallel().ForAll(doStuff);

如果您只是正确使用 Directory.GetFiles(),您当前的代码就可以工作。 最简单的方法是有三个输入;一个用于获取目录,另一个用于获取文件扩展名(如果需要),以及一个复选框,用于询问您是否要递归搜索文件夹。

然后代替

        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 }

以您现在的方式处理每个文件路径。

请注意,我放在这里的代码绝对不像它可能的那样惯用和整洁,但既然你说你是初学者,我决定更清楚一点。 如果需要,我会对事情提出一个更惯用的看法,尽管如果我们这样做,我们可能也应该清理一下你的初始代码。