C# CSV file to array/list

2019-09-22 09:11发布

问题:

I want to read 4-5 CSV files in some array in C#

I know that this question is been asked and I have gone through them... But my use of CSVs is too much simpler for that...

I have csv fiels with columns of following data types....

string , string

These strings are without ',' so no tension... That's it. And they aren't much big. Only about 20 records in each.

I just want to read them into array of C#....

Is there any very very simple and direct way to do that?

回答1:

This one includes the quotes & commas in fields. (assumes you're doing a line at a time)

using Microsoft.VisualBasic.FileIO;   //For TextFieldParser

// blah blah blah

StringReader csv_reader = new StringReader(csv_line);

TextFieldParser csv_parser = new TextFieldParser(csv_reader);
csv_parser.SetDelimiters(",");
csv_parser.HasFieldsEnclosedInQuotes = true;
string[] csv_array = csv_parser.ReadFields();


回答2:

To read the file, use

TextReader reader = File.OpenText(filename);

To read a line:

string line = reader.ReadLine()

then

string[] tokens = line.Split(',');

to separate them.

By using a loop around the two last example lines, you could add each array of tokens into a list, if that's what you need.



回答3:

Here is a simple way to get a CSV content to an array of strings. The CSV file can have double quotes, carriage return line feeds and the delimiter is a comma. Here are the libraries that you need:

System.IO; System.Collection.Generic;

System.IO is for FileStream and StreamReader class to access your file. Both classes implement the IDisposable interface, so you can use the using statements to close your streams. (example below)

System.Collection.Generic namespace is for collections, such as IList,List, and ArrayList, etc... In this example, we'll use the List class, because Lists are better than Arrays in my honest opinion. However, before I return our outbound variable, i'll call the .ToArray() member method to return the array.

There are many ways to get content from your file, I personally prefer to use a while(condition) loop to iterate over the contents. In the condition clause, use !lReader.EndOfStream. While not end of stream, continue iterating over the file.

public string[] GetCsvContent(string iFileName)
{
    List<string> oCsvContent = new List<string>();
    using (FileStream lFileStream = 
                  new FileStream(iFilename, FileMode.Open, FileAccess.Read))
    {
        StringBuilder lFileContent = new StringBuilder();
        using (StreamReader lReader = new StreamReader(lFileStream))
        {
            // flag if a double quote is found
            bool lContainsDoubleQuotes = false; 
            // a string for the csv value
            string lCsvValue = "";
            // loop through the file until you read the end
            while (!lReader.EndOfStream)
            {
                // stores each line in a variable
                string lCsvLine = lReader.ReadLine();
                // for each character in the line...
                foreach (char lLetter in lCsvLine)
                {
                    // check if the character is a double quote
                    if (lLetter == '"')
                    {
                        if (!lContainsDoubleQuotes)
                        {
                            lContainsDoubleQuotes = true;
                        }
                        else
                        {
                            lContainsDoubleQuotes = false;
                        }
                    }
                    // if we come across a comma 
                    // AND it's not within a double quote..
                    if (lLetter == ',' && !lContainsDoubleQuotes)
                    {
                        // add our string to the array
                        oCsvContent.Add(lCsvValue);
                        // null out our string
                        lCsvValue = "";
                    }
                    else
                    {
                        // add the character to our string
                        lCsvValue += lLetter;
                    }
                }
            }
        }
    }
    return oCsvContent.ToArray();
}

Hope this helps! Very easy and very quick. Cheers!