在.NET中读取CSV文件?

时间:2009-09-10 12:37:53

标签: c# .net csv browser

如何使用C#读取CSV文件?

12 个答案:

答案 0 :(得分:52)

不使用第三方组件的选择是使用班级Microsoft.VisualBasic.FileIO.TextFieldParserhttp://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx)。它提供了解析CSV的所有功能。导入Microsoft.VisualBasic程序集就足够了。

var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(file);
parser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
parser.SetDelimiters(new string[] { ";" });

while (!parser.EndOfData)
{
    string[] row = parser.ReadFields();
    /* do something */
}

答案 1 :(得分:20)

您可以在C#中使用 Microsoft.VisualBasic.FileIO.TextFieldParser 类:

using System;
using System.Data;
using Microsoft.VisualBasic.FileIO;

static void Main()
{
    string csv_file_path = @"C:\Users\Administrator\Desktop\test.csv";

    DataTable csvData = GetDataTableFromCSVFile(csv_file_path);

    Console.WriteLine("Rows count:" + csvData.Rows.Count);    
    Console.ReadLine();
}

private static DataTable GetDataTableFromCSVFile(string csv_file_path)
{
    DataTable csvData = new DataTable();

    try
    {
        using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
        {
            csvReader.SetDelimiters(new string[] { "," });
            csvReader.HasFieldsEnclosedInQuotes = true;
            string[] colFields = csvReader.ReadFields();

            foreach (string column in colFields)
            {
                DataColumn datecolumn = new DataColumn(column);
                datecolumn.AllowDBNull = true;
                csvData.Columns.Add(datecolumn);
            }

            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();
                //Making empty value as null
                for (int i = 0; i < fieldData.Length; i++)
                {
                    if (fieldData[i] == "")
                    {
                        fieldData[i] = null;
                    }
                }

                csvData.Rows.Add(fieldData);
             }
         }
     }
     catch (Exception ex)
     {
     }

     return csvData;
}

答案 2 :(得分:6)

您可以尝试CsvHelper,这是我正在处理的项目。它的目标是使读取和写入CSV文件尽可能简单,同时非常快。

以下是一些可以从CSV文件中读取的方法。

// By type
var records = csv.GetRecords<MyClass>();
var records = csv.GetRecords( typeof( MyClass ) );

// Dynamic
var records = csv.GetRecords<dynamic>();

// Using anonymous type for the class definition
var anonymousTypeDefinition =
{
    Id = default( int ),
    Name = string.Empty,
    MyClass = new MyClass()
};
var records = csv.GetRecords( anonymousTypeDefinition );

答案 3 :(得分:4)

我刚刚在我的应用程序中使用了这个库。 http://www.codeproject.com/KB/database/CsvReader.aspx。使用这个库一切顺利,所以我推荐它。它在MIT许可下是免费的,因此只需在您的源文件中包含该通知。

我没有在浏览器中显示CSV,但作者为Repeater或DataGrids提供了一些示例。我确实运行了他的一个测试项目来测试我添加的Sort操作,它看起来很不错。

答案 4 :(得分:2)

我建议Angara.Table,关于保存/加载:http://predictionmachines.github.io/Angara.Table/saveload.html

它可以进行列类型推断,可以保存CSV文件,并且比TextFieldParser快得多。它遵循RFC4180的CSV格式,并支持多行字符串,NaN和包含分隔符字符的转义字符串。

该图书馆受MIT许可。源代码为https://github.com/Microsoft/Angara.Table

虽然它的API专注于F#,但它可以在任何.NET语言中使用,但不像F#那样简洁。

示例:

using Angara.Data;
using System.Collections.Immutable;

...

var table = Table.Load("data.csv");

// Print schema:
foreach(Column c in table)
{
    string colType;
    if (c.Rows.IsRealColumn) colType = "double";
    else if (c.Rows.IsStringColumn) colType = "string";
    else if (c.Rows.IsDateColumn) colType = "date";
    else if (c.Rows.IsIntColumn) colType = "int";
    else colType = "bool";

    Console.WriteLine("{0} of type {1}", c.Name, colType);
}

// Get column data:
ImmutableArray<double> a = table["a"].Rows.AsReal;
ImmutableArray<string> b = table["b"].Rows.AsString;

Table.Save(table, "data2.csv");

答案 5 :(得分:1)

您可能对CodeProject的Linq2Csv库感兴趣。您需要检查的一件事是,如果它只在需要时读取数据,那么在处理更大的文件时您将不需要大量内存。

至于在浏览器上显示数据,您可以做很多事情来完成它,如果您更具体地了解您的要求,答案可能更具体,但您可以做的事情:
  1.使用HttpListener类编写简单的Web服务器(您可以在网上找到许多样本来托管mini-http服务器)。
  2.使用Asp.Net或Asp.Net Mvc,创建一个页面,使用IIS托管它。

答案 6 :(得分:1)

这仅用于解析CSV。要在网页中显示它,只需要获取列表并根据需要进行渲染。

注意:此代码示例不处理输入字符串line包含换行符的情况。

public List<string> SplitCSV(string line)
{
    if (string.IsNullOrEmpty(line))
        throw new ArgumentException();

    List<string> result = new List<string>();

    int index = 0;
    int start = 0;
    bool inQuote = false;
    StringBuilder val = new StringBuilder();

    // parse line
    foreach (char c in line)
    {
        switch (c)
        {
            case '"':
                inQuote = !inQuote;
                break;

            case ',':
                if (!inQuote)
                {
                    result.Add(line.Substring(start, index - start)
                        .Replace("\"",""));

                    start = index + 1;
                }

                break;
            }

            index++;
        }

        if (start < index)
        {
            result.Add(line.Substring(start, index - start).Replace("\"",""));
        }

        return result;
    }
}

答案 7 :(得分:1)

似乎有很多关于CodeProject或CodePlex用于CSV解析的项目。 这是CodePlex上的另一个CSV解析器

http://commonlibrarynet.codeplex.com/

该库包含用于CSV解析,INI文件解析,命令行解析的组件。到目前为止,它对我来说效果很好。唯一的问题是它没有CSV Writer。

答案 8 :(得分:1)

您可以尝试Cinchoo ETL - 一个用于读取和写入CSV文件的开源库。

您可以通过多种方式阅读CSV文件

Id, Name
1, Tom
2, Mark

这是你如何使用这个库来阅读它

using (var reader = new ChoCSVReader("emp.csv").WithFirstLineHeader())
{
   foreach (dynamic item in reader)
   {
      Console.WriteLine(item.Id);
      Console.WriteLine(item.Name);
   }
}

如果您已定义POCO对象以匹配CSV文件,如下所示

public class Employee
{
   public int Id { get; set; }
   public string Name { get; set; }
}

您可以使用此POCO类解析同一文件,如下所示

using (var reader = new ChoCSVReader<Employee>("emp.csv").WithFirstLineHeader())
{
   foreach (var item in reader)
   {
      Console.WriteLine(item.Id);
      Console.WriteLine(item.Name);
   }
}

请查看CodeProject上有关如何使用文章的文章。

免责声明:我是这个图书馆的作者

答案 9 :(得分:0)

我已经维护了一个名为FlatFiles的开源项目已有好几年了。它适用于.NET Core和.NET 4.5.1。

与大多数替代方案不同,它允许您以极高的精度定义模式(类似于EF代码优先工作的方式),因此您不会一直打斗转换问题。您可以直接映射到数据类,并且还支持与旧的ADO.NET类接口。

性能方面,它已经被调整为.NET最快的解析器之一,有很多选项可以解决奇怪的格式差异。如果需要,还支持固定长度的文件。

答案 10 :(得分:0)

我通常使用像这样的简单方法:

var path = Server.MapPath("~/App_Data/Data.csv");
var csvRows = System.IO.File.ReadAllLines(path, Encoding.Default).ToList();

foreach (var row in csvRows.Skip(1))
{
    var columns = row.Split(';');

    var field1 = columns[0];
    var field2 = columns[1];
    var field3 = columns[2];
}

答案 11 :(得分:0)

你可以使用这个库:Sky.Data.Csv https://www.nuget.org/packages/Sky.Data.Csv/ 这是一个非常快速的 CSV 阅读器库,而且非常易于使用:

using Sky.Data.Csv;

var readerSettings = new CsvReaderSettings{Encoding = Encoding.UTF8};
using(var reader = CsvReader.Create("path-to-file", readerSettings)){
    foreach(var row in reader){
        //do something with the data
    }
}

它还支持使用具有相同接口的 CsvReader<T> 类读取类型化对象。