2013-07-27 2 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. Затем продолжайте чтение файла для следующего раздела данных перед следующим отсутствующим месяцем или днем. Таким образом, по сути, заканчивается несколькими текстовыми документами, содержащими Years или Months of Data, без пробелов. Я также хотел бы он, чтобы автоматически создать папку с абонентским номером, который первые 14 символов (т.е. 0005880 W), где все текстовые файлы будут созданы.

Update

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

Вы может создавать файлы, используя различные методы класса System.IO.File:

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

Этот класс включает в себя методы для создания файлов, а также выписывать ARB произвольные текстовые строки.

Вы можете создавать каталоги, используя методы System.IO.Directory класса:

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

UPDATE: Вот некоторые псевдокод

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) в документации к каталогу и методы CreateFile ('string') 'и' AppendText (string) 'в документации к файлу. Эти методы делают именно то, что вам нужно. Они создают каталог, создают файл и добавляют текст к этому файлу. Если они не понятны или что-то еще запутывает, можете ли вы быть более конкретными о том, где вы застряли? –

+0

Привет, я включил их в свой код, но по какой-то причине он писал каждый текстовый файл как одну строку. Я хочу, чтобы новый текстовый файл имел все строки до тех пор, пока не найдет месяц, и затем создаст новый файл. Я добавлю код, который у меня есть. Еще раз спасибо за помощь. –

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