reading csv file c#

前端 未结 4 498

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?

相关标签:
4条回答
  • 2021-01-07 11:01

    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();
    
    0 讨论(0)
  • 2021-01-07 11:08

    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?

    0 讨论(0)
  • 2021-01-07 11:20

    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/

    0 讨论(0)
  • 2021-01-07 11:22

    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.

    0 讨论(0)
提交回复
热议问题