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

C# 同时读取和写入多个文件并对其执行相同的任务,c#,C#,我是编程初学者。我用C#编写了一段代码,打开一个文件(有4列数据),然后将第四列提取到一个列表中。然后对数据进行一些基础工作,以提取数据集的平均值、最小值和最大值。然后,将结果写入专用文件,以获取平均值、最小值和最大值 现在,我想重复相同的测试,但要针对多组文件,每个文件都有超过100000行的数据。我想使程序能够读取同一文件夹中的多组文件,然后对每个文件执行相同的计算,并像以前一样将平均值、最小值和最大值的所有结果编译到单独的文件夹中 单个文件的代码如下所示 private void

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

现在,我想重复相同的测试,但要针对多组文件,每个文件都有超过100000行的数据。我想使程序能够读取同一文件夹中的多组文件,然后对每个文件执行相同的计算,并像以前一样将平均值、最小值和最大值的所有结果编译到单独的文件夹中

单个文件的代码如下所示

    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();
    }
private void按钮1\u单击1(对象发送者,事件参数e)
{
字符串文本=”;
DialogResult=openFileDialog1.ShowDialog();//显示对话框。
//创建一个列表以将数据插入其中
列表噪声=新列表();
整数计数=0;
浮点数和=0;
浮动平均值=0;
浮动最大值=0;
浮动最小值=100;
TextWriter tw=新的StreamWriter(“c:/Users/a3708906/Documents/Filereader-13062012/Filereader/date.txt”);
if(result==DialogResult.OK)//测试结果。
{
string file=openFileDialog1.FileName;
FileInfo src=新的FileInfo(文件);
TextReader=src.OpenText();
text=reader.ReadLine();
//从reader.Readline()读入的文本不为空
while(text!=null)
{
text=reader.ReadLine();
如果(文本!=null)
{
string[]words=text.Split(',');
noise.Add(转换为single(单词[3]);
//将文本写入文件
tw.WriteLine(文本);
//foreach(单词中的字符串)
//{
//tw.WriteLine(单词);
//}
}
}
}
tw.Close();
TextWriter tw1=新的StreamWriter(“c:/Users/a3708906/Documents/Filereader-13062012/Filereader/noise.txt”);
foreach(噪声中的浮子)
{
tw1.WriteLine(Convert.ToString(ns));
计数++;
总和+=ns;
平均值=总和/计数;
float min1=0;
如果(ns>max)
max=ns;
否则如果(ns0)
min=min1;
其他的
min=min;
}
tw1.Close();
TextWriter tw2=新的StreamWriter(“c:/Users/a3708906/Documents/Filereader-13062012/Filereader/summarymeans.txt”);
tw2.写线(“平均噪声”);
tw2.写线(“================”);
tw2.WriteLine(“mote_noise 2:{0}”,Convert.ToString(mean));
tw2.Close();
TextWriter tw3=新的StreamWriter(“c:/Users/a3708906/Documents/Filereader-13062012/Filereader/summarymaximums.txt”);
tw3.写入线(“最大噪声”);
tw3.写线(“======================”);
tw3.WriteLine(“mote_noise 2:{0}”,Convert.ToString(max));
tw3.Close();
TextWriter tw4=新的StreamWriter(“c:/Users/a3708906/Documents/Filereader-13062012/Filereader/summaryminimums.txt”);
tw4.写入线(“最小噪声”);
tw4.写线(“======================”);
tw4.WriteLine(“mote_noise 2:{0}”,Convert.ToString(min));
tw4.Close();
}

如果有人能帮助翻译这段处理多个文件的代码,我将不胜感激。谢谢。

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

而不是

        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 }
以现在的方式处理每个文件路径


请注意,我放在这里的代码肯定没有它可能的那样惯用和整洁,但是因为你说你是初学者,我决定更清楚一点。如果有人要求,我会提供一个更惯用的方法,不过如果我们这样做,我们可能也应该清理一下您的初始代码。

将处理单个文件的逻辑包装到单个或空返回函数中,然后枚举文件,将其切换到ParallelEnumerable并调用

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

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

您是否尝试过使用[FolderBrowserDialog][1]获取一个装满文件的文件夹,然后遍历在其SelectedPath属性返回的路径中找到的文件?[1] 当前位置我可以建议您对代码使用更地道的语言吗?我不介意您稍微更改一下我的程序