2012-06-20 5 views
3

Моя программа не перебирает файлы. Программа правильно записывает все имена файлов в «список файлов». Затем я ожидаю, что он выведет средние, минимальные и максимальные значения списка данных в каждом файле. Тем не менее, всякий раз, когда он запускается, он выводит средние, минимальные и максимальные значения только для одного файла. Я думаю, что цикл не работает очень хорошо.Доступ к нескольким файлам

Я попытался создать дополнительный цикл между текстовым редактором 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) 
     { 

     } 

    } 
} 

Я буду очень благодарен за помощь никому !!

+3

Этот код может использовать совсем немного очистки ... Любые берущих? :) –

+0

Вы прошли через свой код, чтобы посмотреть, что он делает? – BugFinder

+0

Вы должны использовать [FileInfo class] (http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx), он обеспечивает доступ к множеству методов, которые облегчили бы вашу жизнь , [More Reading] (http: //www.dotnetperls.ком/FileInfo). Это сделало бы ваши петли более читабельными и более легкими для подражания. – Amicable

ответ

1

Вы инициализируете свои номера (среднее значение, режим, сумма, счет и т. Д.) внутри цикл цикла, который выполняет итерацию по вашим файлам, поэтому они сбрасываются для каждого файла.

Инициализируйте их вне цикла, и он должен работать. (Как указывали другие, существуют другие проблемы с кодом, поскольку они не выглядят очень чистыми, но это основная проблема.)

1

Как вы сказали, ваши петли не подходят мне. Почему бы вам не попробовать что-то вроде этого («...» представляют разделы вашего кода, которые я не копировал ради краткости)? Обратите внимание, что существует только один номер (текст! = Null) с текстом text = reader.ReadLine(); в конце вместо кратных whiles и ifs в вашем примере.

 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(); 
     } 
1

Как отметил Рениуз, когда у вас возникла такая проблема, вы должны пройти свой код. В Visual Studio это так же сложно, как установка точки останова (F9), где вы хотите начать шагать, и несколько раз нажимать F11, как только отладчик достигнет точки.

В вашем случае, однако, две ошибки относятся к вашему циклу while и foreach. Правильная версия петель, а также полный код приведен ниже:

Хотя цикл должен быть:

// 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(); 
} 

Второй цикл должен быть:

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(); 
} 
+0

Может быть, неплохо использовать 'use' clauses вместо прямого вызова' Close'. В противном случае в случае исключения файл остается открытым в течение неопределенного промежутка времени, а будущие операции прерываются случайным образом. –

+1

Да, конечно, нет необходимости в скромности, я просто сосредоточился на исправлении кода пользователя, а не на его повторной разработке. Если бы я должен был переписать его в соответствии с тем, как я думаю, это должно быть намного короче и эффективнее .. –

+0

Хммм, я действительно блуждаю, почему кто-то посвятил это ... –

Смежные вопросы