【问题标题】:reading csv file c#读取csv文件c#
【发布时间】:2010-08-18 06:55:54
【问题描述】:

有没有办法将csv文件读入矩阵,所以文件中的每个正方形都是矩阵中的一个单元格?

【问题讨论】:

  • 矩阵是什么意思? UI 中的网格?如果是这样,哪个 UI 框架?如果不是,是什么类型的数据结构?
  • @James - 我认为他的意思是矩阵格式的数组。 string[,]
  • 对!只是我想要一个 int 矩阵,但在这里转换不是问题......

标签: c# csv


【解决方案1】:

有很多开源的 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();

【讨论】:

  • 是否处理引号内包含回车的行?
  • 这就是我想要做的: int [][] mat=READ FROM CSV FILE...;我的 csv 文件包含 int...
  • 不,不幸的是回车会导致新行开始: var line = reader.ReadLine(); -- 我尝试使用 Excel (2010),它也不允许在引号中换行,但我不完全了解规格
  • 好的。但有几件事我不明白:“读者”在哪里反抗? 2.函数CsvReader是构造函数吗?它得到的参数是什么? 3. 我应该在哪里添加你现在添加的代码?
  • 整个代码是一个类的定义——命名为 CsvReader :)。阅读器实际上是任何输入流。您可以通过 "var reader = new FileStream("path")" 获得一个
【解决方案2】:

VisualBasic 命名空间中有一个文本阅读器,可以在 C# 中使用,甚至可以很好地处理可怕的 CSV 文件:

TextFieldParser

只需在您的项目中添加对Microsoft.VisualBasic 的引用即可。

【讨论】:

  • 哦,现在我明白了……但是我该如何使用 textFieldParser?
【解决方案3】:

用正则表达式解析CSV:http://www.hotblue.com/article0000.aspx?a=0006

要使用自定义分隔符扩展概念,请参阅此帖子:How do I write a regex to match a string that doesn't contain a word?

【讨论】:

    【解决方案4】:

    有很多方法。从逐字节阅读器开始。这取决于您的 csv 文件格式(有/无标题、行尾、" 或 ')。我已经编写了自己的类。

    一个好的阅读器开始:

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

    【讨论】:

      猜你喜欢
      • 2012-08-18
      • 2018-01-20
      • 1970-01-01
      • 2017-10-19
      • 2012-12-21
      • 2018-05-24
      • 2013-05-03
      • 1970-01-01
      相关资源
      最近更新 更多