Thursday, February 10, 2011

Parsing CSV files in C#

Is there a default/official/recommended way to parse CSV files in C#? I don't want to roll my own parser.

Also, I've seen instances of people using ODBC/OLE DB to read CSV via the Text driver, and a lot of people discourage this due to its "drawbacks." What are these drawbacks?

Ideally, I'm looking for a way through which I can read the CSV by column name, using the first record as the header / field names. Some of the answers given are correct but work to basically deserialize the file into classes.

  • Let a library handle all the nitty-gritty details for you! :-)

    Check out FileHelpers and stay DRY - Don't Repeat Yourself - no need to re-invent the wheel a gazillionth time....

    You basically just need to define that shape of your data - the fields in your individual line in the CSV - by means of a public class (and so well-thought out attributes like default values, replacements for NULL values and so forth), point the FileHelpers engine at a file, and bingo - you get back all the entries from that file. One simple operation - great performance!

    David Pfeffer : Thanks. FileHelpers is what a lot of articles were pointing at also.
    From marc_s
  • If you need only reading csv files then I recommend this library: A Fast CSV Reader
    If you also need to generate csv files then use this one: FileHelpers v 2.0

    Both of them are free and opensource.

    From Giorgi
  • There's no official way I know of, but you should indeed use existing libraries. Here is one I found really useful from CodeProject:

    http://www.codeproject.com/KB/database/CsvReader.aspx

    From VitalyB
  • In a business application, i use the Open Source project on codeproject.com, CSVReader.

    It works well, and has good performance. There is some benchmarking on the link i provided.

    A simple example, copied from the project page:

    using (CsvReader csv = new CsvReader(new StreamReader("data.csv"), true))
    {
        int fieldCount = csv.FieldCount;
        string[] headers = csv.GetFieldHeaders();
    
        while (csv.ReadNextRecord())
        {
            for (int i = 0; i < fieldCount; i++)
                Console.Write(string.Format("{0} = {1};", headers[i], csv[i]));
    
            Console.WriteLine();
        }
    }
    

    As you can see, it's very easy to work with.

    From alexn

0 comments:

Post a Comment