使用 LINQ C# 2010 查询 CSV
Posted
技术标签:
【中文标题】使用 LINQ C# 2010 查询 CSV【英文标题】:Query CSV using LINQ C# 2010 【发布时间】:2011-07-23 03:26:22 【问题描述】:我按照这里的教程从 CSV 文件中查询内容: http://rudesyle.wordpress.com/2008/01/28/using-linq-to-query-a-csv-file/
但是,结果错过了第一行,即 "大都会","纽约","NL"
经过一些测试,我意识到如果我在文件顶部有一个空行,则结果符合预期。
下面是我的代码和 .csv 文件
“teams.csv”
"Mets","New York","NL"
"Marlins","Florida","NL"
"Orioles","Baltimore","AL"
"Pirates","Pittsburgh","NL"
"Phillies","Philadelphia","NL"
程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;
namespace CSVQuery
class Program
static void QueryCsv()
OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;Extended Properties='Text;HDR=No;FMT=Delimited'");
OleDbCommand cmd = new OleDbCommand(@"SELECT * FROM ..\..\teams.csv", cn);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
cn.Open();
DataTable dt = new DataTable();
da.Fill(dt);
var teams = from r in dt.AsEnumerable() where r.Field<string>(2) == "NL"
select new City = r.Field<string>(0),
TeamName = r.Field<string>(1) ;
foreach (var team in teams)
Console.WriteLine(String.Format("The 0 1", team.TeamName, team.City));
Console.ReadLine();
cn.Close();
static void Main(string[] args)
CSVQuery.Program.QueryCsv();
实际结果:
The Florida Marlins
The Pittsburgh Pirates
The Philadelphia Phillies
预期结果:
The New York Mets
The Florida Marlins
The Pittsburgh Pirates
The Philadelphia Phillies
问题是为什么我不能查询teams.csv 文件的第一行? (我需要在顶部添加 1 个空行,这样我才能收到预期的结果)。
【问题讨论】:
我将首先确保您的DataTable
已被完全填充,并且一开始没有丢失任何记录。
另外,我会考虑您不需要 OleDb 提供程序来执行此操作的可能性。使用简单的 C# 代码读取 CSV 文件(假设它们表现良好)相对容易:请参阅 codeproject.com/KB/cs/UsingJetForImport.aspx 了解每种方法的优缺点。
【参考方案1】:
这篇帖子Reading CSV file with OLEDB ignores first line even with HDR=No in Connection String 表明问题是因为完整路径在 Select 字符串中。尝试将路径放在连接字符串中,然后将文件名放在选择字符串中。我无法想象为什么这会有所作为,但这就是那里的建议。
【讨论】:
【参考方案2】:看起来第一行被解释为标题行 - 尽管您提供 HDR=NO
您可以尝试通过提供 schema.ini 文件来解决此问题 - http://msdn.microsoft.com/en-us/library/ms709353.aspx
但是,如果可以的话,我实际上建议更改导入机制 - 我已经多次使用 Lumenworks 库来处理 CSV - 它又快又好 - http://www.codeproject.com/KB/database/CsvReader.aspx
【讨论】:
【参考方案3】:在 CodeProject 上有一个使用 .NET 3.5 实现的 LINQ to CSV 库,您可以在这里找到它,http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library
【讨论】:
以上是关于使用 LINQ C# 2010 查询 CSV的主要内容,如果未能解决你的问题,请参考以下文章
C#,Linq2Sql:是不是可以将两个可查询对象合并为一个?