使用LINQ C#2010查询CSV

时间:2011-07-23 03:26:22

标签: linq csv

我按照此处的教程查询CSV文件中的内容: http://rudesyle.wordpress.com/2008/01/28/using-linq-to-query-a-csv-file/

然而,结果错过了第一行 “大都会队”,“纽约队”,“NL”

经过一些测试,我意识到如果我在文件顶部有一个空行,结果就像预期的那样。

Bellow是我的代码和.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个空行,这样我才能收到预期的结果。)

3 个答案:

答案 0 :(得分:0)

看起来第一行被解释为标题行 - 尽管您提供了HDR = NO

您可以尝试通过提供schema.ini文件来解决此问题,看看它是否有效 - http://msdn.microsoft.com/en-us/library/ms709353.aspx

但是,如果可以,我实际上建议更改导入机制 - 我已经多次使用Lumenworks库进行CSV - 它快速而且很好 - http://www.codeproject.com/KB/database/CsvReader.aspx

答案 1 :(得分:0)

这篇文章Reading CSV file with OLEDB ignores first line even with HDR=No in Connection String表明问题是因为完整路径位于Select字符串中。尝试将路径放在连接字符串中,只需将文件名放在Select字符串中。我无法想象为什么这会产生影响,但这就是那里的建议。

答案 2 :(得分:0)

可以在CodeProject上使用.NET 3.5实现LINQ to CSV库,您可以在此处找到它,http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library