2012-06-20 2 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 클래스] (http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx)를 사용해야하며, 더 쉽게 사용할 수있는 많은 메서드에 액세스 할 수 있습니다 . [기타 참고 사항] (http : // www.dotnetperls.com/fileinfo). 루프를 사용하면 훨씬 쉽게 읽을 수 있고 쉽게 따라 할 수 있습니다. – Amicable

답변

1

숫자 (평균, 모드, 합계, 개수 등) 내에서 파일을 반복하는 for 루프가 초기화되므로 각 파일에 대해 재설정됩니다.

루프 외부에서 초기화하면 제대로 작동합니다. (다른 사람들은 매우 깨끗하게 보이지 않는 한 코드에 다른 이슈가 있다고 지적했기 때문에 근본적인 문제입니다.)

1

당신이 말했듯이, 당신의 루프는 나에게 보이지 않습니다. 왜 이런 식으로 해보지 않으시겠습니까 ("..."는 간결하게하기 위해 복사하지 않은 코드 섹션을 나타냅니다)? 단 하나의 이 있고 (텍스트! = null)입니다. text = reader.ReadLine(); 귀하의 예에서 여러 whiles 및 ifs 대신 끝에. Reniuz는 지적이 이런 종류의 문제가 발생하는 경우

 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 키를 반복해서 눌러 중단 점을 시작하려는 중단 점 (F9)을 설정하는 것만 큼 어렵습니다.

그러나 두 가지 오류는 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(); 
} 

은 제 2 고리가 같아야

루프뿐만 아니라 전체 코드의 정확한 버전는 아래와 같다
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

'Close'를 직접 호출하는 대신'using' 절을 사용하는 것이 좋습니다. 그렇지 않은 경우 예외가 발생하면 파일이 일정 시간 동안 열려 있고 향후 작업이 무작위로 실패합니다. –

+1

물론, 겸손에 대한 필요가 없습니다. 단지 사용자의 코드를 다시 엔지니어링하는 대신 수정하는 데 초점을 맞 춥니 다. 어떻게 생각 하느냐에 따라 다시 작성해야한다면 훨씬 더 짧고 효율적이 될 것입니다. –

+0

흠, 나는 왜 누군가가 이것을 헌신했는지 방황하고있다. –