我是编程的初学者。我在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();
}
如果有人可以帮助翻译此代码以处理多个文件,我将不胜感激。谢谢。
答案 0 :(得分:1)
将处理单个文件的逻辑包装到单个Action或void返回函数中,然后枚举文件,将它们切换到ParallelEnumerable并调用Parallel.ForAll
例如,如果您创建了一个名为DoStuff的Action或函数(字符串文件名),它将对单个文件执行该过程,则可以使用以下命令调用它:
Directory.EnumerateFiles(dialog.SelectedPath).AsParallel().ForAll(doStuff);
答案 1 :(得分:0)
如果您只是正确使用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 }
以您现在的方式处理每个文件路径。
请注意我放在这里的代码绝对不是那么惯用和整洁,但既然你说你是初学者我决定更清楚一点。如果我要求,我会对事物采取更为惯用的方式,但如果我们这样做,我们应该稍微清理一下你的初始代码。