2013-07-27 44 views
1

我忙于处理结构如下所示的文本文件:
这是连续字符串中的降雨量数据,日期后每5个字符表示一个月中的某一天。将特定行保存到新的文本文件

0005880 W 1926 9-7777-7777-7777-7777-7777-7777-7777-7777-7777 117 130 64-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777 
0005880 W 192610-7777-7777-7777-7777-7777-7777-7777-7777-7777 23-7777-7777-7777-7777 3-7777 226 462 71-7777-7777 157 76 15-7777-7777-7777-7777-7777-7777-7777 
0005880 W 192611 3 20-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777 61 142-7777-7777-7777 8-7777-7777-7777-7777 
0005880 W 192612-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777 132-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777-7777 

年和月表示在字符串中的(10,4)和(14,2)位置。 我的问题是,有一些情况下,下一行不是要遵循的月份。我写了一些代码,在下面显示的一个月的数据丢失的地方添加了一行。

public void findGapsToolStripMenuItem_Click(object sender, EventArgs e) 
    { 


     TabPage tp = new TabPage(); 
     RichTextBox rtb = new RichTextBox(); 
     rtb.Dock = DockStyle.Fill; 
     rtb.Multiline = true; 
     rtb.AcceptsTab = true; 
     rtb.WordWrap = false; 





     Stream myStream; 
     OpenFileDialog openFileDialog1 = new OpenFileDialog(); 

     if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 
      if ((myStream = openFileDialog1.OpenFile()) != null) 
      { 


       tp.Controls.Add(rtb); 
       tabControl1.TabPages.Add(tp); 


       string strfilename = openFileDialog1.FileName; 
       string[] lines = File.ReadAllLines(strfilename); 
       string[] pathArr = strfilename.Split('\\'); 
       string[] fileArr = pathArr.Last().Split(); 
       string filen = fileArr.Last().ToString(); 



       tp.Text = filen; 

       int pyear = 0; 
       int pmon = 0; 
       int imon = 0; 
       int iyear = 0; 


       foreach (string line in lines) 
       { 
        string missing = "-9999"; 
        string year = line.Substring(10, 4); 
        string mon = line.Substring(14, 2); 
        iyear = Convert.ToInt32(year); 
        imon = Convert.ToInt32(mon); 


        if (pyear == 0) 
        { 
         pyear = iyear; 
         pmon = imon; 

         rtb.AppendText(line + "\n"); 

        } 
        else 
        { 
         int pt = pyear * 12 + pmon; 
         int t = iyear * 12 + imon; 
         if ((pt + 1) == t) 
         { 

          rtb.AppendText(line + "\n"); 
         } 
         else 
         { 

          rtb.AppendText("Missing Months =" + (t - pt) + "\n"); 

         } 

         if (line.Contains(missing)) 
         { 
          rtb.AppendText("Missing Days" + "\n"); 


         } 


         pyear = iyear; 
         pmon = imon; 
        } 

        rtb.SelectAll(); 
        rtb.SelectionAlignment = HorizontalAlignment.Left; 
        rtb.SelectionFont = new Font("Consolas", 10); 








       } 

      } 

     } 


    } 

我的问题是,是否有失踪一个月或一天命名失踪一个月或前一天的开始日期的日期文本文件之前导出所有行的方式。例如,1926.9.1926.10.txt。然后在下一个缺失的月份或一天之前继续完成下一部分数据的文件。所以基本上就是以多个文本文档结尾,这些文档包含几年或几个月的数据,但没有空白我也想它自动创建,所有的文本文件将被创建的站号是第14个字符(即0005880 W)的文件夹。

更新

public void findGapsToolStripMenuItem_Click(object sender, EventArgs e) 
    { 


     TabPage tp = new TabPage(); 
     RichTextBox rtb = new RichTextBox(); 
     rtb.Dock = DockStyle.Fill; 
     rtb.Multiline = true; 
     rtb.AcceptsTab = true; 
     rtb.WordWrap = false; 





     Stream myStream; 
     OpenFileDialog openFileDialog1 = new OpenFileDialog(); 

     if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 
      if ((myStream = openFileDialog1.OpenFile()) != null) 
      { 


       tp.Controls.Add(rtb); 
       tabControl1.TabPages.Add(tp); 


       string strfilename = openFileDialog1.FileName; 
       string[] lines = File.ReadAllLines(strfilename); 
       string[] pathArr = strfilename.Split('\\'); 
       string[] fileArr = pathArr.Last().Split(); 
       string filen = fileArr.Last().ToString(); 
       string pat = @"C:\Test\" + filen; 
       System.IO.Directory.CreateDirectory(pat); 
       int i; 





       tp.Text = filen; 

       int pyear = 0; 
       int pmon = 0; 
       int imon = 0; 
       int iyear = 0; 
       int j = 1; 


       foreach (string line in lines) 
       { 
        using (StreamWriter sw = new StreamWriter(@"C:\Test\" + filen+".txt")) 
        { 



         string missing = "-9999"; 
         string year = line.Substring(10, 4); 
         string mon = line.Substring(14, 2); 
         iyear = Convert.ToInt32(year); 
         imon = Convert.ToInt32(mon); 
         string filepath = @"C:\Test\" + year + "." + mon+".txt"; 

         if (pyear == 0) 
         { 

          File.CreateText(filepath); 
          pyear = iyear; 
          pmon = imon; 

          rtb.AppendText(line + "\n"); 

          sw.WriteLine(line); 


         } 
         else 
         { 

          File.CreateText(filepath); 
          int pt = pyear * 12 + pmon; 
          int t = iyear * 12 + imon; 
          if ((pt + 1) == t) 
          { 

           rtb.AppendText(line + "\n"); 
           sw.WriteLine(line); 


          } 
          else 
          { 

           string path = pat + "\\" + year + "." + mon + ".txt"; 
           File.CreateText(path); 

           rtb.AppendText("Missing Months =" + (t - pt) + "\n"); 

          } 

          if (line.Contains(missing)) 
          { 

           string path = pat + "\\" + year + "." + mon + ".txt"; 
           File.CreateText(path); 
           rtb.AppendText("Missing Days" + "\n"); 


          } 


          pyear = iyear; 
          pmon = imon; 


         } 

         rtb.SelectAll(); 
         rtb.SelectionAlignment = HorizontalAlignment.Left; 
         rtb.SelectionFont = new Font("Consolas", 10); 




        } 
       } 







      } 


     } 
    } 

回答

1

http://msdn.microsoft.com/en-us/library/system.io.file.aspx

该类包含用于创建文件以及写出ARB方法:可以用有System.IO.File类的各种方法创建文件将文字行写成一行。

您可以使用该System.IO.Directory类的方法目录:

http://msdn.microsoft.com/en-us/library/system.io.directory.aspx

更新:这里是一些伪

startdate = null 
foreach(line in the input file) 
{ 
    currentdate = date on this line in the input file 

    if(startdate == null) 
    { 
     // We are at the start of a new block of dates 
     startdate = currentdate   
     add this line to a list (in memory) 
    } 
    else if(currentdate == lastdate in the list + 1 month) 
    { 
     // This date is consecutive 
     add this line to a list (in memory) 
    } 
    else 
    { 
     // We have a gap in the data 
     write out all data in the list to file named <startdate>-<lastdate in list> 
     startdate = currentdate 
     add this line to the list (which we've just emptied) 
    } 
} 
write out the last file 

这只是非常粗略的和准备,但应该指出您需要考虑编写此代码的方式。有一件事要明确,如果你想用一个日期块的结束日期来命名文件,那么在找到该块的最后一行之前,你不能创建该文件,所以你需要将行存储在内存中直到找到日期间的差距或输入文件的末尾。

+0

我很抱歉,仍然很困惑,看看这些链接。请你给我一个代码示例,因为我是一名水质硕士学生,并且认为数据管理程序可以加速原始数据处理,所以在编程方面非常非常新手,所以我仍然对编程还很陌生。 –

+1

嗨。链接文档中有很多示例。具体来说,我会查看目录文档中的'CreateDirectory(string)'方法以及File文档中的'CreateFile('string')'和'AppendText(string)'方法。这些方法正是你所需要的。他们创建一个目录,创建一个文件,并向该文件添加文本。如果他们不清楚或者其他问题令人困惑,那么你能否更具体地了解你卡在哪里? –

+0

您好我已经将这些纳入我的代码,但由于某种原因,它将每个文本文件写入一行。我希望新文本文件具有所有行,直到找到一个月丢失,然后创建一个新文件。我添加我现在的代码。再次感谢您的帮助。 –

相关问题