2010-08-18 144 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