2009-11-24 76 views
1

解析CSV文件时出现问题。我连接到使用以下文件:解析CSV文件问题C#

string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" 
      + "Data Source=\"" + dir + "\\\";" 
      + "Extended Properties=\"text;HDR=No;FMT=Delimited\""; 
     //create the database query 
     string query = "SELECT * FROM [" + file + "]"; 

     //create a DataTable to hold the query results 
     DataTable dTable = new DataTable(); 


     //create an OleDbDataAdapter to execute the query 
     OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, connString); 

     //Get the CSV file to change position. 

     //fill the DataTable 
     dAdapter.Fill(dTable); 

     return dTable; 

出于某种原因,第一列读为“页眉”确定(即HDR =是允许将被显示的值)。问题是当我有HDR =否时,在该行中显示第一个“单元格”后没有任何内容。不过,我需要HDR =否,因为我稍后会写入CSV。

简而言之,行的其余部分只在其他列中有值。此外,每个列中都有一段时间。任何帮助?

干杯。

编辑:这是假的几行类似CSV:

//Problem row->>  
File:,GSK1.D,,GSK2.D,,GSK3.D, 
//The following rows, however, are fine: 
/69,120.3,16.37%,128.9,7.16%,188.92,13.97% 
D/71,48.57,75.50%,32.15,26.65%,58.35,71.43% 
T/89,35.87,45.84%,50.01,28.87%,15.38,43.30% 

编辑:当我把任何值的“空白空间”上面,他们会被解析,但无论怎样我投入有问题的细胞(如GSK1.D),他们不会解析 - 除非它是一个数字!是否有机会自动将此单元格转换为“浮动”单元格?我该如何阻止它呢?

+0

您可以粘贴CSV的前几行吗? – Plip 2009-11-24 14:07:36

+0

你可以粘贴一个虚假的CSV? – SLaks 2009-11-24 14:11:59

+1

@David:然后粘贴一个虚拟文件的前几行。对皮特来说,如果你需要帮助,合作! – 2009-11-24 14:16:08

回答

1

我完成了这个任务,只是为了让任何人知道谁将来可能会遇到这个问题。事实证明,之所以没有被采纳是因为ADO试图确定列类型。如果此列中的其他值不是所述类型,则它将完全删除它们。

为了解决这个问题,你需要创建一个schema.ini文件,像这样:

StreamWriter writer = new StreamWriter(File.Create(dir + "\\schema.ini")); 
writer.WriteLine("[" + fileToBeRead + "]"); 
writer.WriteLine("ColNameHeader = False"); 
writer.WriteLine("Format = CSVDelimited"); 
writer.WriteLine("CharacterSet=ANSI"); 

int iColCount = dTable.Columns.Count + 1; 
for (int i = 1; i < iColCount; i++) 
{ 
    writer.WriteLine("Col" + i + "=Col" + i + "Name Char Width 20"); 
} 


//writer.WriteLine("Col1=Col1Name Char Width 20"); 
//writer.WriteLine("Col2=Col1Name Char Width 20"); 
//etc. 

writer.Close(); 

感谢大家的建议!

+0

刚刚在我自己的项目中找到相同的解决方案后,我刚刚找到了解决方案。 +1为希望我在一小时前有这个。 – mrduclaw 2009-11-26 11:17:21

1

CodeProject上有一个解析库:http://www.codeproject.com/KB/database/CsvReader.aspx

有一个有趣的文章,怎么这个东西的工作。它的工作更快(作者),比OleDB提供者。

+0

感谢您的链接,但正如在上一个答案中的评论中提到的,我是那里的大多数人,如果可能的话,现在不想重建。 – 2009-11-24 14:34:58

+0

你可以很容易地从一个读者创建一个DataTable,并且我正在考虑一个表格适配器,你可以填充DataSets。 – 2009-11-24 15:03:05

0

对于文本文件的数据库类型访问,我很少做得很好 - 文件中“问题”的可能性往往超过理论上的时间节省。

就我个人而言,我经常手工制作代码来做到这一点。 A lot(回溯超过20年以上,所以通用解决方案一直很薄弱)。也就是说,如果我现在需要处理一个.csv文件,我的第一件事就是FileHelpers或类似的文件。

+0

墨菲,你(或其他任何人)使用过FileHelpers吗?你会推荐它处理可能包含格式错误记录的大型(〜10-50GB)分隔文件(例如,报价不匹配,每个记录的字段数不正确等)吗? – 2009-12-04 01:21:43

+0

我有,但没有为那种文件大小,我所做的大部分处理是小得多的文件和我处理的格式错误的东西是在代码之前(我发现文件助手),所以我有我自己的代码处理。 – Murph 2009-12-04 09:12:03