将特定行保存到新文本文件

时间:2013-07-27 07:42:25

标签: c#

我正在忙于处理如下结构的文本文件:
这是连续字符串中的降雨数据,日期后的每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);








                }

            }

        }


    }

我的问题是,是否有办法将丢失的月份或日期之前的所有行导出到名为开始日期的文本文件中,以及丢失的月份或日期之前的日期。 E.g 1926.9.1926.10.txt。然后在下一个缺失的月份或日期之前继续浏览下一部分数据的文件。因此,基本上最终会有多个包含数据年份或数月的文本文档。我还希望它能自动创建一个带有站号的文件夹,这是前14个字符(i.E 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 个答案:

答案 0 :(得分:1)

您可以使用System.IO.File类的各种方法创建文件:

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

此类包括用于创建文件以及将任意文本行写出为一个文件的方法。

您可以使用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

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

相关问题