【问题标题】:Parsing a CSV file problems C#解析 CSV 文件问题 C#
【发布时间】:2009-11-24 14:04:10
【问题描述】:

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

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=Yes 允许显示值)。问题是当我有 HDR=No 时,在该行中显示第一个“单元格”之后什么都没有。但是我需要 HDR=No,因为我稍后会编写 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)中放入什么,它们都不会解析 - 除非它是一个数字!有没有机会自动将此单元格转换为“浮动”单元格?我怎样才能阻止它这样做?

【问题讨论】:

  • 您可以粘贴到 CSV 的前几行吗?
  • @David:然后粘贴到虚拟文件的前几行。看在皮特的份上,如果你需要帮助,就合作吧!
  • 听起来文件本身可能存在格式问题?
  • 当您使用它时,我强烈建议您删除该 try/catch 块。你没有处理错误,你只是掩盖了任何潜在的问题。
  • @Ken 当你发表评论时,我正在粘贴一个假的,见上文。

标签: c# csv


【解决方案1】:

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

通过一篇有趣的文章,这些东西是如何工作的。它的工作速度比 OleDB Provider 快(作者)。

【讨论】:

  • 感谢您的链接,但正如上一个答案中的 cmets 所述,我大部分时间都在那里,如果可能的话,现在不想重建。
  • 您可以从 Reader 轻松创建 DataTable,我认为还有一个表格适配器可以填充 DataSet。
【解决方案2】:

我已经完成了这个,只是为了让任何人知道将来可能会遇到这个问题。事实证明,没有任何内容的原因是因为 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();

感谢大家的建议!

【讨论】:

  • 我刚刚在我自己的项目中找到相同的解决方案后才找到您的解决方案。 +1 希望我一个小时前有这个。
【解决方案3】:

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

就我个人而言,我经常手工编写代码来执行此操作。 很多(可以追溯到 20 多年前,因此通用解决方案一直很薄弱)。也就是说,如果我现在必须处理一个 .csv 文件,我首先要处理的是 FileHelpers 或类似文件。

【讨论】:

  • Murph,您(或这里的其他人)使用过 FileHelpers 吗?您是否会推荐它来处理可能包含格式错误的记录(例如报价不匹配、每条记录的字段数不正确等)的大型 (~10-50GB) 分隔文件?
  • 我有但不是那种文件大小,我所做的大部分处理都是小得多的文件,我处理的格式错误的东西是早于的代码(我发现文件助手) 所以我有自己的代码要处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 2016-12-16
  • 1970-01-01
  • 2011-01-06
相关资源
最近更新 更多