Search code examples
skipcsvhelperobjectdisposedexception

skipping Rows in a CSV file to a certain word C#


I am new to C# coding and I have really tried to find an answer in any forum. I am using CSVHelper to read a CSV file and I want to skip a certain number of lines from the beginning of the file to a certain word. Now my code gives the following error message: System.ObjectDisposedException: "Cannot read from a closed TextReader." Help me please :

 private void cmdLoad_Click(object sender, EventArgs e)
    {
        OpenFileDialog OFDReader = new OpenFileDialog()
        { };
        if (OFDReader.ShowDialog() == DialogResult.OK)
        {

            txtbox.Text = OFDReader.FileName;
        }
        var config = new CsvConfiguration(CultureInfo.InvariantCulture)
        {
            Delimiter = ";", // Set delimiter
            HasHeaderRecord = true,
            //ShouldSkipRecord = (row) => row.Record[0].Contains("Date/Time"),
        };
        
        using (var reader = new StreamReader(OFDReader.FileName))
        using (var csv = new CsvReader(reader, config))
        {               
           //search for Line to start reader
           string record = "Date/Time";

            while (csv.Read())
            {
                if (csv.Read().Equals(record))
                {
                    csv.Read();
                    csv.ReadHeader();
                    break;
                }
                using (var dr = new CsvDataReader(csv))
                {
                    var dt = new DataTable();
                    dt.Load(dr);
                    dataGridView1.DataSource = dt; // Set datagridview source to datatable
                }
            }
        }
    }
}

}


Solution

  • I believe you just need to break out of the while (csv.Read()) when you find the "Date/Time" text. The CsvReader will do the rest from there.

    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
         Delimiter = ";", // Set delimiter
         HasHeaderRecord = true
    };
    
    using (var reader = new StreamReader(OFDReader.FileName))
    using (var csv = new CsvReader(reader, config))
    {
        //search for Line to start reader
        string record = "Date/Time";
    
        while (csv.Read())
        {
            if (csv.Context.Parser.RawRecord.Trim() == record)
            {
                break;
            }                           
        }
        using (var dr = new CsvDataReader(csv))
        {
            var dt = new DataTable();
            dt.Load(dr);
            dt.Dump();
        }
    }