使用 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:是不是可以将两个可查询对象合并为一个?

通过 ASP.NET MVC 在 C# 视图中遍历匿名对象的嵌套 LINQ 查询

C# 之 LINQ的查询语法

c# ef框架怎么使用linq语句多表查询?

在使用 LINQ 的对面到内部联接查询方面需要帮助

使用 linq 查询最流行的类别 C#