Hugo Retief
Hugo Retief

Reputation: 11

Saving Specific Lines to New Text Files

I am busy working with text files that are structured as seen below:
This is rainfall data in a continuous string each 5 characters after the date represent a day in the month.

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

The year and month are represented in (10, 4) and (14, 2) positions within the string. My problem is that there is instances when the next line isn't the month that is meant to follow. I have written code that adds a line where a month of data is missing shown bellow.

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);








                }

            }

        }


    }

My Question is, Is there a way of exporting all the lines before the missing month or day to a text file named the start date to the date before the missing month or day. E.g 1926.9.1926.10.txt. Then continuing through the file for the next section of data before the next missing month or day. So essentially ending up with multiple text documents containing Years or Months of Data with out gaps. I would also like it to automatically create a folder with the Station Number which is the first 14 characters (i.E 0005880 W) where all the text files will be created in.

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);




                    }
                }







            }


        }
    }

Upvotes: 1

Views: 153

Answers (1)

James Gaunt
James Gaunt

Reputation: 14783

You can create files using the various methods of the System.IO.File class:

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

This class includes methods for creating files as well as writing out arbitrary text lines to one.

You can create directories using the methods of the System.IO.Directory class:

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

UPDATE: Here is some pseudocode

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

This is just very rough and ready, but should indicate the kind of way you need to think to write this code. One thing to be clear on, if you want to name the file using the end date of a block of dates you can't create the file until you've found the last line in that block so you need to store the lines in memory until you find a gap in the dates, or the end of your input file.

Upvotes: 1

Related Questions