2010-08-18 208 views
1

有什麼方法可以將csv文件讀入矩陣,因此文件中的每個正方形都將是矩陣中的單元格?閱讀csv文件c#

+0

你的矩陣是什麼意思? UI中的網格?如果是的話,哪個UI框架?如果不是,什麼類型的數據結構? – 2010-08-18 06:57:21

+0

@詹姆斯 - 我想他是指矩陣格式的數組。 'string [,]' – 2010-08-18 06:59:58

+0

對!只是我想要一個int矩陣,但鑄造不是一個問題在這裏...... – aharon 2010-08-18 07:25:16

回答

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 2010-08-18 07:08:18

+0

這就是我想要做的: int [] [] mat =讀取CSV文件...; 我的csv文件包含int ... – aharon 2010-08-18 07:24:10

+0

不,不幸的是回車導致一個新行開始:var line = reader.ReadLine(); - 我試着用Excel(2010),它也不允許在引號換行,但我不完全知道規格 – sukru 2010-08-18 07:28:07

0

有很多方法。從逐字節讀取器開始。這取決於你的CSV文件格式(有/無頭,行尾「或「),我寫我自己的類

一個好的讀者開始:。

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

2

有在VisualBasic中命名空間的文本閱讀器,可以在C#中使用和處理甚至可怕的CSV文件時效果很好。

TextFieldParser

只是在你的項目中添加引用Microsoft.VisualBasic

+0

我增加了引用,但我stil不能看到「FileIO.TextFieldParser」.. – aharon 2010-08-18 07:22:10

+0

哦,現在我看...但我如何使用textFieldParser? – aharon 2010-08-18 07:28:56

+0

很酷我不知道這件事,謝謝ck – tenfour 2010-08-18 08:03:12