2010-08-18 4 views
1

есть ли способ прочитать файл csv в матрицу, поэтому каждый квадрат в файле будет ячейкой в ​​матрице?Чтение csv-файла C#

+0

, что вы имеете в виду матрицы? сетка в пользовательском интерфейсе? если да, то какая структура пользовательского интерфейса? Если нет, какой тип структуры данных? –

+0

@James - Я думаю, что он означает массив в матричном формате. 'string [,]' –

+0

вправо! просто, что я хочу int-матрицу, но отливка не является проблемой здесь ... – aharon

ответ

3

Есть много открытых CSV-считывателей с открытым кодом, и это также легко кодировать самостоятельно.

Для начала взять смотреть на CodePlex.com: http://kbcsv.codeplex.com/

Или Codeproject учебники: http://www.codeproject.com/KB/database/CsvReader.aspx

Ради завершенности, вот мой собственный класс утилита для чтения строки из файла CSV:

/// <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(); 
    } 

Для того, чтобы матрица (непроверенные):

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(); 
+1

Выполняет ли эти строки, содержащие каретки в кавычках? – cjk

+0

вот что я хочу сделать: int [] [] mat = READ FROM CSV FILE ...; мой файл csv содержит int ... – aharon

+0

нет, к сожалению, возврат каретки вызывает начало новой строки: var line = reader.ReadLine(); - Я пытался с Excel (2010), и он также не допускал разрывов строк в кавычках, но я точно не знаю спецификации – sukru

0

Существует много способов. Начиная с байта с помощью байтового считывателя. Это зависит от формата файла CSV (с/без заголовка, строки окончаний, "или«) Я написал мой собственный класс

Хороший читатель, чтобы начать с:..

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

2

Там текстовый читатель в пространстве имен VisualBasic, которые могут быть использованы в C# и обрабатывает даже ужасные файлы CSV очень хорошо:.

TextFieldParser

Просто добавьте ссылку на Microsoft.VisualBasic в проекте

+0

Я добавил referenc, но я не вижу «FileIO.TextFieldParser» .. – aharon

+0

ohh, теперь я вижу ... но как я могу использовать textFieldParser? – aharon

+0

круто я не знал об этом, спасибо ck – tenfour