【问题标题】:Importing CSV files using OleDB - string datatype?使用 OleDB 导入 CSV 文件 - 字符串数据类型?
【发布时间】:2011-04-21 17:43:10
【问题描述】:

我正在编写一个 C# .net Web 应用程序,用户将上传 CSV 文件以进行处理。这些 CSV 文件包含许多数据类型,我遇到了其中一些问题。有一个 20 位数的收据编号字段以科学计数法导入(9.1234563E+18 而不是 91234563000000000000),并且所有前导零都将被丢弃。前导零也被丢弃在另一个 4 位商店编号字段中。

我已经阅读了有关创建 Schema.ini 文件来定义数据类型的信息,但是每个文件都有不同的文件名,这意味着我必须以编程方式生成一个新的 Schema 文件,并且由于多个用户可能正在使用同时应用程序,它有点排除了这个选项。

有人有什么建议吗?

【问题讨论】:

  • 最好的选择可能不是使用 OleDb,而是使用一些专用的 CSV 阅读器。
  • 您是说CSV中的数据正确,但导入的数据前导零被丢弃了吗?只是想确保我对您的理解正确。

标签: c# .net csv oledb


【解决方案1】:

此 CSV 文件是在 Excel 中创建的吗?如果是,请确保用户将列设置为正确的数据类型。我之前也遇到过类似的问题,但这是由于用户将日期字段设置为不同的类型 - 所以不是返回 20100408 之类的东西,而是 24782 :-)

否则,请尝试在每个字段中读取纯文本....然后自己处理转换

【讨论】:

  • 我通过从 Excel 导出一些数据创建了一个示例 CSV,我正在对此进行测试。也许我疯了,但我认为更改 Excel 中的数据类型不会有任何作用——它是纯文本数据(在 CSV 文件中)并且不包含架构信息。而且我可能最终不得不手动编写一些代码来解析文件,但我更喜欢使用现有的功能。
  • 哦,是的......你完全正确。我正在使用 ExcelReader 自定义类来读取该数据。我的错!奇怪的是 Jet 解析器正在将该数字转换为科学记数法......?祝你好运!
【解决方案2】:

听起来您必须编写一些自定义代码来手动读取文件并自己拆分字段。您可以轻松地一次读取一行并使用 String.Split 方法获取各个字段。当然,这是假设 CSV 文件将始终采用相同的格式,因此无论文件来自何处,您都可以以相同的方式处理每个字段。这样您就可以完全按照您想要的方式处理每个字段。

【讨论】:

    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多