我按照此处的教程查询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个空行,这样我才能收到预期的结果。)
答案 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