1

is there any way to read a csv file into a matrix, so every square in the file will be a cell in the matrix?

3
  • what do you mean by matrix? a grid in a UI? if so, which UI framework? If not, what type of data structure? Commented Aug 18, 2010 at 6:57
  • @James - I think he means an array in a matrix format. string[,] Commented Aug 18, 2010 at 6:59
  • right! just that i want an int matrix, but casting is not a problem here... Commented Aug 18, 2010 at 7:25

4 Answers 4

3

There are many open source CSV readers, and it's also easy to code your own.

For a start take look at codeplex.com: http://kbcsv.codeplex.com/

Or Codeproject tutorials: http://www.codeproject.com/KB/database/CsvReader.aspx

For sake of completion, here is my own utility class to read a line from a CSV file:

 /// <summary> /// Defines CSV reader states /// </summary> enum State { Initial, Quote, Data, NestedQuote } /// <summary> /// Initializes a new instance of the <see cref="CsvReader"/> class. /// </summary> /// <param name="inputStream">The input stream.</param> public CsvReader(Stream inputStream) { if (inputStream == null) throw new ArgumentNullException("inputStream"); reader = new StreamReader(inputStream); } /// <summary> /// Reads a single line of CSV data. /// </summary> /// <returns>Array of CSV fields</returns> public string[] Read() { var line = reader.ReadLine(); var retval = new List<string>(); if (line == null) return null; var state = State.Initial; var text = new StringBuilder(); foreach (var ch in line) switch (state) { case State.Initial: if (ch == '"') state = State.Quote; else if (ch == ',') retval.Add(string.Empty); else { text.Append(ch); state = State.Data; } break; case State.Data: if (ch == ',') { retval.Add(text.ToString()); text.Length = 0; state = State.Initial; } else text.Append(ch); break; case State.Quote: if (ch == '"') state = State.NestedQuote; else text.Append(ch); break; case State.NestedQuote: if (ch == '"') { text.Append('"'); state = State.Quote; break; } state = State.Data; goto case State.Data; } retval.Add(text.ToString()); return retval.ToArray(); } /// <summary> /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> public void Dispose() { reader.Dispose(); } 

To make the matrix (untested):

var data = new List<string[]>(); string[] line; using(reader = new CsvReader(stream)) while((line = reader.Read()) != null) data.Add(line); result = data.Select(row => row.Select(cell => int.Parse(cell)).ToArray()).ToArray(); 
Sign up to request clarification or add additional context in comments.

7 Comments

Does that handle lines that contain carriage returns within quotes?
this is what i want to do: int [][] mat=READ FROM CSV FILE...; my csv file contains int...
no, unfortunately carriage returns cause a new row to start : var line = reader.ReadLine(); -- I tried with Excel (2010), and it also did not allow line breaks in quotes, but I don't exactly know the specs
ok. but there are couple of things that i don't understand: where is "reader" defiend? 2.is the function CsvReader is the constructor? and what is the parameter that it gets? 3. where should i add the code you added now?
The whole code is the definition of a class - named CsvReader :). The reader is actually any input stream. You can have one by "var reader = new FileStream("path")"
|
2

There is a text reader in the VisualBasic namespace that can be used in C# and handles even horrible CSV files very well:

TextFieldParser

Just add a reference to Microsoft.VisualBasic in your project.

1 Comment

ohh, now i see... but how do i use the textFieldParser?
1

CSV parsing with regular expressions: http://www.hotblue.com/article0000.aspx?a=0006

To expand the concept with custom separators, see this post: How do I write a regex to match a string that doesn't contain a word?

Comments

0

There are many ways. Starting with a byte by byte reader. It depends on your csv file format (with/without header, line endings, " or '). I've written my own class.

A good reader to start with:

http://www.stellman-greene.com/CSVReader/

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.