如何使用C#读取CSV文件?
答案 0 :(得分:52)
不使用第三方组件的选择是使用班级Microsoft.VisualBasic.FileIO.TextFieldParser
(http://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>
类读取类型化对象。