Click here to Skip to main content
15,905,144 members
Articles / Web Development / ASP.NET

A Fast CSV Reader

Rate me:
Please Sign up or sign in to vote.
4.93/5 (545 votes)
13 Jan 2016MIT8 min read 8.7M   164.9K   1.5K   2.4K
A reader that provides fast, non-cached, forward-only access to CSV data.

Important update (2016-01-13)

First and foremost, I thank everyone that is contributing in the discussion forum of this article: it amazes me that users of this library are helping each other in this manner.

So ... I never foresaw this project getting so popular. It was made with a single purpose in mind: performance and one can clearly see that it affected its design, maybe too much in retrospect. Five years have passed since the last update and many people are asking where they can contribute code or post issues. I no longer maintain this library, but Paul Hatcher has set up a GitHub repository and a NuGet package. I invite you to go there if you need to maintain an existing project that uses this library.

If however you are starting a new project or are willing to do so some light refactoring, I also wrote a new library that includes a CSV and fixed width reader/writer which are just as fast as this library, but are much more flexible and handle many more use cases. You can find the CSV reader source in the GitHub repository and download the NuGet package. I will fully maintain this new library and it is already used in many projects in production.

Introduction

One would imagine that parsing CSV files is a straightforward and boring task. I was thinking that too, until I had to parse several CSV files of a couple GB each. After trying to use the OLEDB JET driver and various Regular Expressions, I still ran into serious performance problems. At this point, I decided I would try the custom class option. I scoured the net for existing code, but finding a correct, fast, and efficient CSV parser and reader is not so simple, whatever platform/language you fancy.

I say correct in the sense that many implementations merely use some splitting method like String.Split(). This will, obviously, not handle field values with commas. Better implementations may care about escaped quotes, trimming spaces before and after fields, etc., but none I found were doing it all, and more importantly, in a fast and efficient manner.

And, this led to the CSV reader class I present in this article. Its design is based on the System.IO.StreamReader class, and so is a non-cached, forward-only reader (similar to what is sometimes called a fire-hose cursor).

Benchmarking it against both OLEDB and regex methods, it performs about 15 times faster, and yet its memory usage is very low.

To give more down-to-earth numbers, with a 45 MB CSV file containing 145 fields and 50,000 records, the reader was processing about 30 MB/sec. So all in all, it took 1.5 seconds! The machine specs were P4 3.0 GHz, 1024 MB.

Supported Features

This reader supports fields spanning multiple lines. The only restriction is that they must be quoted, otherwise it would not be possible to distinguish between malformed data and multi-line values.

Basic data-binding is possible via the System.Data.IDataReader interface implemented by the reader.

You can specify custom values for these parameters:

  • Default missing field action;
  • Default malformed CSV action;
  • Buffer size;
  • Field headers option;
  • Trimming spaces option;
  • Field delimiter character;
  • Quote character;
  • Escape character (can be the same as the quote character);
  • Commented line character.

If the CSV contains field headers, they can be used to access a specific field.

When the CSV data appears to be malformed, the reader will fail fast and throw a meaningful exception stating where the error occurred and providing the current content of the buffer.

A cache of the field values is kept for the current record only, but if you need dynamic access, I also included a cached version of the reader, CachedCsvReader, which internally stores records as they are read from the stream. Of course, using a cache this way makes the memory requirements way higher, as the full set of data is held in memory.

Latest Updates (3.8.1 Release)

  • Fixed bug with missing field handling;
  • Converted solution to VS 2010 (still targets .NET 2.0)

Benchmark and Profiling

You can find the code for these benchmarks in the demo project. I tried to be fair and follow the same pattern for each parsing method. The regex used comes from Jeffrey Friedl's book, and can be found at page 271. It doesn't handle trimming and multi-line fields.

The test file contains 145 fields, and is about 45 MB (included in the demo project as a RAR archive).

I also included the raw data from the benchmark program and from the CLR Profiler for .NET 2.0.

Image 1

Image 2

Using the Code

The class design follows System.IO.StreamReader as much as possible. The parsing mechanism introduced in version 2.0 is a bit trickier because we handle the buffering and the new line parsing ourselves. Nonetheless, because the task logic is clearly encapsulated, the flow is easier to understand. All the code is well documented and structured, but if you have any questions, simply post a comment.

Basic Usage Scenario

C#
using System.IO;
using LumenWorks.Framework.IO.Csv;
void ReadCsv()
{
    // open the file "data.csv" which is a CSV file with headers
    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();
        }
    }
}

Simple Data-Binding Scenario (ASP.NET)

C#
using System.IO;
using LumenWorks.Framework.IO.Csv;
void ReadCsv()
{
    // open the file "data.csv" which is a CSV file with headers
    using (CsvReader csv = new CsvReader(
                           new StreamReader("data.csv"), true))
    {
        myDataRepeater.DataSource = csv;
        myDataRepeater.DataBind();
    }
}

Complex Data-Binding Scenario (ASP.NET)

Due to the way both the System.Web.UI.WebControls.DataGrid and System.Web.UI.WebControls.GridView handle System.ComponentModel.ITypedList, complex binding in ASP.NET is not possible. The only way around this limitation would be to wrap each field in a container implementing System.ComponentModel.ICustomTypeDescriptor.

Anyway, even if it was possible, using the simple data-binding method is much more efficient.

For the curious amongst you, the bug comes from the fact that the two grid controls completely ignore the property descriptors returned by System.ComponentModel.ITypedList, and relies instead on System.ComponentModel.TypeDescriptor.GetProperties(...), which obviously returns the properties of the string array and not our custom properties. See System.Web.UI.WebControls.BoundColumn.OnDataBindColumn(...) in a disassembler.

Complex Data-Binding Scenario (Windows Forms)

C#
using System.IO;
using LumenWorks.Framework.IO.Csv;
void ReadCsv()
{
    // open the file "data.csv" which is a CSV file with headers
    using (CachedCsvReader csv = new
           CachedCsvReader(new StreamReader("data.csv"), true))
    {
        // Field headers will automatically be used as column names
        myDataGrid.DataSource = csv;
    }
}

Custom Error Handling Scenario

C#
using System.IO;
using LumenWorks.Framework.IO.Csv;
void ReadCsv()
{
    // open the file "data.csv" which is a CSV file with headers
    using (CsvReader csv = new CsvReader(
           new StreamReader("data.csv"), true))
    {
        // missing fields will not throw an exception,
        // but will instead be treated as if there was a null value
        csv.MissingFieldAction = MissingFieldAction.ReplaceByNull;
        // to replace by "" instead, then use the following action:
        //csv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty;
        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] == null ? "MISSING" : csv[i]));
            Console.WriteLine();
        }
    }
}

Custom Error Handling Using Events Scenario

C#
using System.IO;
using LumenWorks.Framework.IO.Csv;
void ReadCsv()
{
    // open the file "data.csv" which is a CSV file with headers
    using (CsvReader csv = new CsvReader(
           new StreamReader("data.csv"), true))
    {
        // missing fields will not throw an exception,
        // but will instead be treated as if there was a null value
        csv.DefaultParseErrorAction = ParseErrorAction.RaiseEvent;

        csv.ParseError += new ParseErrorEventHandler(csv_ParseError);
        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();
        }
    }
}
void csv_ParseError(object sender, ParseErrorEventArgs e)
{
    // if the error is that a field is missing, then skip to next line
    if (e.Error is MissingFieldCsvException)
    {
        Console.Write("--MISSING FIELD ERROR OCCURRED");
        e.Action = ParseErrorAction.AdvanceToNextLine;
    }
}

History

Version 3.8.1 (2011-11-10)

  • Fixed bug with missing field handling.
  • Converted solution to VS 2010 (still targets .NET 2.0).

Version 3.8 (2011-07-05)

  • Empty header names in CSV files are now replaced by a default name that can be customized via the new DefaultHeaderName property (by default, it is "Column" + column index).

Version 3.7.2 (2011-05-17)

  • Fixed a bug when handling missing fields.
  • Strongly named the main assembly.

Version 3.7.1 (2010-11-03)

  • Fixed a bug when handling whitespaces at the end of a file.

Version 3.7 (2010-03-30)

  • Breaking: Added more field value trimming options.

Version 3.6.2 (2008-10-09)

  • Fixed a bug when calling MoveTo in a particular action sequence;
  • Fixed a bug when extra fields are present in a multiline record;
  • Fixed a bug when there is a parse error while initializing.

Version 3.6.1 (2008-07-16)

  • Fixed a bug with RecordEnumerator caused by reusing the same array over each iteration.

Version 3.6 (2008-07-09)

  • Added a web demo project;
  • Fixed a bug when loading CachedCsvReader into a DataTable and the CSV has no header.

Version 3.5 (2007-11-28)

  • Fixed a bug when initializing CachedCsvReader without having read a record first.

Version 3.4 (2007-10-23)

  • Fixed a bug with the IDataRecord implementation where GetValue/GetValues should return DBNull.Value when the field value is empty or null;
  • Fixed a bug where no exception is raised if a delimiter is not present after a non final quoted field;
  • Fixed a bug when trimming unquoted fields and whitespaces span over two buffers.

Version 3.3 (2007-01-14)

  • Added the option to turn off skipping empty lines via the property SkipEmptyLines (on by default);
  • Fixed a bug with the handling of a delimiter at the end of a record preceded by a quoted field.

Version 3.2 (2006-12-11)

  • Slightly modified the way missing fields are handled;
  • Fixed a bug where the call to CsvReader.ReadNextRecord() would return false for a CSV file containing only one line ending with a new line character and no header.

Version 3.1.2 (2006-08-06)

  • Updated dispose pattern;
  • Fixed a bug when SupportsMultiline is false;
  • Fixed a bug where the IDataReader schema column "DataType" returned DbType.String instead of typeof(string).

Version 3.1.1 (2006-07-25)

  • Added a SupportsMultiline property to help boost performance when multi-line support is not needed;
  • Added two new constructors to support common scenarios;
  • Added support for when the base stream returns a length of 0;
  • Fixed a bug when the FieldCount property is accessed before having read any record;
  • Fixed a bug when the delimiter is a whitespace;
  • Fixed a bug in ReadNextRecord(...) by eliminating its recursive behavior when initializing headers;
  • Fixed a bug when EOF is reached when reading the first record;
  • Fixed a bug where no exception would be thrown if the reader has reached EOF and a field is missing.

Version 3.0 (2006-05-15)

  • Introduced equal support for .NET 1.1 and .NET 2.0;
  • Added extensive support for malformed CSV files;
  • Added complete support for data-binding;
  • Made available the current raw data;
  • Field headers are now accessed via an array (breaking change);
  • Made field headers case insensitive (thanks to Marco Dissel for the suggestion);
  • Relaxed restrictions when the reader has been disposed;
  • CsvReader supports 2^63 records;
  • Added more test coverage;
  • Upgraded to .NET 2.0 release version;
  • Fixed an issue when accessing certain properties without having read any data (notably FieldHeaders).

Version 2.0 (2005-08-10)

  • Ported code to .NET 2.0 (July 2005 CTP);
  • Thoroughly debugged via extensive unit testing (special thanks to shriop);
  • Improved speed (now 15 times faster than OLEDB);
  • Consumes half the memory than version 1.0;
  • Can specify a custom buffer size;
  • Full Unicode support;
  • Auto-detects line ending, be it \r, \n, or \r\n;
  • Better exception handling;
  • Supports the "field1\rfield2\rfield3\n" pattern (used by Unix);
  • Parsing code completely refactored, resulting in much cleaner code.

Version 1.1 (2005-01-15)

  • 1.1: Added support for multi-line fields.

Version 1.0 (2005-01-09)

  • 1.0: First release.

License

This article, along with any associated source code and files, is licensed under The MIT License


Written By
Architect
Canada Canada
Sébastien Lorion is software architect as day job.

He is also a musician, actually singing outside the shower Smile | :)

He needs constant mental and emotional stimulation, so all of this might change someday ...

Comments and Discussions

 
GeneralRe: Just a heads up... Pin
Sebastien Lorion23-Jun-10 5:22
Sebastien Lorion23-Jun-10 5:22 
AnswerRe: Just a heads up... Pin
Sebastien Lorion23-Jun-10 14:06
Sebastien Lorion23-Jun-10 14:06 
GeneralRe: Just a heads up... Pin
Andrew Rissing23-Jun-10 14:13
Andrew Rissing23-Jun-10 14:13 
AnswerRe: Just a heads up... Pin
Sebastien Lorion23-Jun-10 14:23
Sebastien Lorion23-Jun-10 14:23 
AnswerRe: Just a heads up... Pin
Sebastien Lorion23-Jun-10 14:43
Sebastien Lorion23-Jun-10 14:43 
GeneralRe: Just a heads up... Pin
Sebastien Lorion23-Jun-10 14:46
Sebastien Lorion23-Jun-10 14:46 
GeneralRe: Just a heads up... Pin
Andrew Rissing23-Jun-10 15:06
Andrew Rissing23-Jun-10 15:06 
GeneralParsing with custom delimiters invariably causes the CsvReader to throw an exception Pin
domg1020-Jun-10 23:34
domg1020-Jun-10 23:34 
Hi;

Firstly, sorry for the big blob of text in advance....

I've used the utility for some time, to parse data feeds from affiliate providers in to my database. I'm very impressed with the performance. I do have however, a couple of scenarios where, if the delimiter is is not the default (especially tab delimiters, sometimes | delimiters) or there are comments or hyphens in the row the csvparser throws an exception.

Could you possible highlight what may be the issue here.

If is insanciate the CsvReader like so
-----------------
CsvReader tsv = new CsvReader(inputStreamReader, true, '\t');
tsv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty;

-----------------
i get the following response:
The CSV appears to be corrupt near record '11' field '8 at position '3780'. Current raw data : 'er ongoing series of The Company, "Mother Aegypt." The Company novels are being ...									new	12.78				Y					Standard	3.99																1597800570	Mother Aegypt and Other Stories	Night Shade Books	Kage Baker	Fiction		Paperback																														<br />
785965951221	Desert Blues, Vol. 3	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=785965951221	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=785965951221	http://images.barnesandnoble.com/images/28420000/28429960.jpg	Music > African Folk			CD,NETWORK GERMANY,Studio,  ***Usually ships within 24 hours***   20100531000720760			CD,NETWORK GERMANY,Studio,  ***Usually ships within 24 hours***   20100531000720760		NETWORK GERMANY				785965951221			new	34.37				Y					Standard	0																	Desert Blues, Vol. 3	NETWORK GERMANY		African Folk	cd																															<br />
9780740757129	Just Peace: A Message of Hope	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9780740757129	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9780740757129	http://images.barnesandnoble.com/images/44450000/44455156.JPG	Books > Literary Criticism > Poetry			Sometimes the most important messages come from the most unlikely places. Mattie J.T. Stepanek, a 13-year-old boy, made a difference before he died with his Heartsongs poetry. ...			Sometimes the most important messages come from the most unlikely places. Mattie J.T. Stepanek, a 13-year-old boy, made a difference before he died with his Heartsongs poetry. ...									new	12.20				Y					Standard	3.99																0740757121	Just Peace: A Message of Hope	Andrews McMeel Publishing	Foreword by Jimmy Carter	Literary Criticism		Hardcover																														<br />
9781552851159	Pennsylvania	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9781552851159	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9781552851159	http://images.barnesandnoble.com/images/20740000/20746507.JPG	Books > Photography > Photoessays & Documentaries			The North America Series captures outstanding views, landscapes, cityscapes and picturesque communities from the every region of the continent and feature 70 photographs by ...			The North America Series captures outstanding views, landscapes, cityscapes and picturesque communities from the every region of the continent and feature 70 photographs by ...									new	14.36				Y					Standard	3.99																155285115X	Pennsylvania	Whitecap Books, Limited	Manufactured by Books Whitcap	Photography		Hardcover																														<br />
675754903428	La Fiancée du Pirate	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=675754903428	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=675754903428	http://images.barnesandnoble.com/images/19420000/19421059.jpg	Music > Solo Instrumental (non-keyboard)			Windsleepers, CD,UNITED ONE RECORDS,Studio,  ***Usually ships within 2-3 days***   20100531000720760			Windsleepers, CD,UNITED ONE RECORDS,Studio,  ***Usually ships within 2-3 days***   20100531000720760		UNITED ONE RECORDS				675754903428			new	14.57				Y					Standard	2.98																	La Fiancée du Pirate	UNITED ONE RECORDS		Solo Instrumental (non-keyboard)	cd																															<br />
9781904859550	Clandestines: The Pirate Journals of an Irish Exile	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9781904859550	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9781904859550	http://images.barnesandnoble.com/images/54180000/54188066.JPG	Books > Travel & Travel Guides > General			"What separates Ramor's work from the other outstanding young writers is the content of what he is doing. I've never seen anything close to his work"-Eddie Yuen, co-editor of ...			"What separates Ramor's work from the other outstanding young writers is the content of what he is doing. I've never seen anything close to his work"-Eddie Yuen, co-editor of ...									new	14.35				Y					Standard	3.99																1904859550	Clandestines: The Pirate Journals of a'.


===========================================================

insanciate the CsvReader like so
-----------------
CsvReader tsv = new CsvReader(inputStreamReader, true, '\t', '\'', '"', '#', ValueTrimmingOptions.None);
tsv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty;

-----------------
i get the following response:
The CSV appears to be corrupt near record '3314' field '8 at position '3663'. Current raw data : '://images.barnesandnoble.com/images/27810000/27815556.JPG	Books > Medicine > Anesthesiology			The increasing call for quality management and improvement can only be met by the introduction of standard operating procedures (SOPs) which ensure continuity and consistent ...			The increasing call for quality management and improvement can only be met by the introduction of standard operating procedures (SOPs) which ensure continuity and consistent ...									new	17.95				Y					Standard	3.99																354032996X	Check-up Anesthesiology and Pain Therapy	Springer-Verlag New York, LLC	Wolfgang Kox (Editor)	Medicine		Paperback																														<br />
9780451201027	Friends and Lovers	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9780451201027	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9780451201027	http://images.barnesandnoble.com/images/19800000/19809993.JPG	Books > Fiction > Romance - Contemporary			Fresh from the success of "Sister, Sister"--a "high-spirited celebration of black sisterhood" ("Publishers Weekly")--Eric Jerome Dickey offers a sexy, searing African-American novel of betrayal, love, and friendship in today's L.A.			Fresh from the success of "Sister, Sister"--a "high-spirited celebration of black sisterhood" ("Publishers Weekly")--Eric Jerome Dickey offers a sexy, searing African-American novel of betrayal, love, and friendship in today's L.A.									new	12.82				Y					Standard	3.99																0451201027	Friends and Lovers	Penguin Group (USA)	Eric Jerome Dickey	Fiction		Paperback																														<br />
9781425928711	Charter Schools	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9781425928711	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9781425928711	http://images.barnesandnoble.com/images/22930000/22939042.JPG	Books > Education & Teaching > Administration - General			Charter schools are public schools that may be started by anyone willing to do the work and who can get approval from a chartering authority. Over the last ten years, charter ...			Charter schools are public schools that may be started by anyone willing to do the work and who can get approval from a chartering authority. Over the last ten years, charter ...									new	11.69				Y					Standard	3.99																1425928714	Charter Schools	Authorhouse	Judy Rooney	Education & Teaching		Paperback																														<br />
9780548100257	Delineations of American Scenery and Character	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9780548100257	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9780548100257	http://images.barnesandnoble.com/images/20120000/20121814.JPG	Books > Travel & Travel Guides > United States - General			John James Audubon, Francis Hobart Herrick (Introduction),Hardcover, English-language edition,Pages:404,Pub by Kessinger Publishing Company			John James Audubon, Francis Hobart Herrick (Introduction),Hardcover, English-language edition,Pages:404,Pub by Kessinger Publishing Company									new	39.96				Y						0																054810025X	Delineations of American Scenery and Character	Kessinger Publishing Company	Francis Hobart Herrick (Introduction)	Travel & Travel Guides		Hardcover																														<br />
9780520055056	Philip Randolph	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9780520055056	http://clickserve.cc-dt.com/link/ddiprod?lid=41000000015122384&pid=9780520055056	http://images.barnesandnoble.com/images/24770000/24772203.JPG	Books > Biography & Autobiography > General			'Anderson...details with rare journalistic insight Randolph's meteoric rise from a young radical and street orator in Harlem to the most sought-after black in the labor ...			'Anderson...details with rare journalistic insight Randolph's meteoric rise from a young radical and street orator in Harlem to the most sought-after black in the labor ...									new	24.01				Y					Standard	3.99																0520055055	Philip Randolph	University of California Press	J Anderson	Biography & Autobiog'.


===========================================================

insanciate the CsvReader like so
-----------------
CsvReader tsv = new CsvReader(inputStreamReader, true, '\t', '¬', '"', '#', ValueTrimmingOptions.None);
tsv.MissingFieldAction = MissingFieldAction.ReplaceByEmpty;

-----------------
i get the following response:
import successful.

It seems that the parser gets confused by having quotes or hyphens the record. And i'm forced to use a obsucure quote char ¬ to parse the file. Being forced to do this isn't ideal because i can never guarantee the char used for the quote is not somewhere within the record itself. Can you offer any insight in to what I might be doing wrong, or must be done to avoid me having to use such char's to process these files, and allow me to revert back to a more standard declaration e.g.
CsvReader tsv = new CsvReader(inputStreamReader, true, '\t');
. If it has to be like this so be it, but it would be good to know 100% what limitations this question might highlight.

Kind regards

Domonic Griffiths
AnswerRe: Parsing with custom delimiters invariably causes the CsvReader to throw an exception Pin
Sebastien Lorion21-Jun-10 3:54
Sebastien Lorion21-Jun-10 3:54 
GeneralRe: Parsing with custom delimiters invariably causes the CsvReader to throw an exception Pin
domg1021-Jun-10 4:47
domg1021-Jun-10 4:47 
AnswerRe: Parsing with custom delimiters invariably causes the CsvReader to throw an exception Pin
Sebastien Lorion21-Jun-10 4:52
Sebastien Lorion21-Jun-10 4:52 
AnswerRe: Parsing with custom delimiters invariably causes the CsvReader to throw an exception Pin
Sebastien Lorion26-Jun-10 6:23
Sebastien Lorion26-Jun-10 6:23 
GeneralCommented lines containing commas Pin
schubb31-May-10 4:39
schubb31-May-10 4:39 
AnswerRe: Commented lines containing commas Pin
Sebastien Lorion31-May-10 5:13
Sebastien Lorion31-May-10 5:13 
GeneralRe: Commented lines containing commas Pin
schubb31-May-10 5:22
schubb31-May-10 5:22 
GeneralRe: Commented lines containing commas Pin
Sebastien Lorion31-May-10 5:27
Sebastien Lorion31-May-10 5:27 
GeneralField headers Pin
sue d nym26-May-10 1:35
sue d nym26-May-10 1:35 
GeneralRe: Field headers Pin
Sebastien Lorion26-May-10 5:42
Sebastien Lorion26-May-10 5:42 
GeneralThanks great article and a question about writing to DB Pin
tedfire9919-May-10 12:30
tedfire9919-May-10 12:30 
AnswerRe: Thanks great article and a question about writing to DB Pin
Sebastien Lorion19-May-10 13:06
Sebastien Lorion19-May-10 13:06 
GeneralRe: Thanks great article and a question about writing to DB Pin
tedfire9920-May-10 9:00
tedfire9920-May-10 9:00 
GeneralThank You Pin
wickedw19-May-10 6:55
wickedw19-May-10 6:55 
QuestionFeature Request: SetFieldHeaders Pin
meilon13-May-10 0:19
meilon13-May-10 0:19 
AnswerRe: Feature Request: SetFieldHeaders Pin
Sebastien Lorion18-May-10 7:32
Sebastien Lorion18-May-10 7:32 
GeneralRe: Feature Request: SetFieldHeaders Pin
pergh27-May-10 1:14
pergh27-May-10 1:14 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.