在将 .csv 文件中的数据读取到 DataTable 中时,有没有办法强制所有列都是字符串?

Posted

技术标签:

【中文标题】在将 .csv 文件中的数据读取到 DataTable 中时,有没有办法强制所有列都是字符串?【英文标题】:Is there a way to force all the columns to be strings while reading data from a .csv file into a DataTable? 【发布时间】:2019-02-15 18:56:29 【问题描述】:

目前我正在处理一个需要我从 .csv 文件中读取数据并将数据导入数据库的项目。除了只有一列之外,它一切正常。在 raw/.csv 文件中,该字段可以由 int/string 组成。因此,在读取文件时,如果第一列由一个 int 组成,那么后面的任何字符串都不会被读取。但是,如果第一个值恰好是一个字符串,那么它就会按预期工作。有没有我可以在我现有的工作解决方案中实施的解决方案。

string sql = @"SELECT * FROM [" + strFileName + "]";    
DataTable rawDataTable = new DataTable();

using (OleDbConnection connection = new OleDbConnection(connString))
using (OleDbCommand command = new OleDbCommand(sql, connection))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))

    adapter.Fill(rawDataTable);
    

例如,在特定列中: 在以下情况下,当使用上述代码读取时,数据表将显示 100,将接下来的两行留空,然后显示 500。

Sample Column
-------------
100
SOME TEXT
SOME MORE TEXT
500

但是,如果该列恰好类似于以下示例,则可以通过将整数读取为字符串来正常工作。

Sample Column
--------------
100
SOME TEXT
SOME MORE TEXT
500

【问题讨论】:

值得一试:***.com/a/24933442/578411 ***.com/questions/1688497/… 的可能重复项; 谢谢@shubham 我使用了与您在回复中提到的方法类似的方法,我使用了 steve 的答案中提到的确切方法,这对我很有效。谢谢你。另外关于更改 IMEX 和注册表键值,我无权将此机器上的注册表作为公司机器访问。所以我不得不选择答案中提到的解决方案。 【参考方案1】:

如果您使用的是 OleDb 文本文件驱动程序,看起来就像是,您可以使用 Schema.ini 文件告诉它扫描文件中的所有行以确定类型。

例如,如果您的连接字符串如下所示:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\txtFilesFolder\;
Extended Properties="text;HDR=Yes;FMT=Delimited";

然后在c:\txtFilesFolder创建一个名为Schema.ini的文件,如果你的文件名是myfile.csv,那么架构文件的内容就是:

[myfile.csv]
MaxScanRows=0  

就我个人而言,这种方法通常不会是我解析文本文件的方式,有很多好的库可以这样做,这会给你更多的控制权。

【讨论】:

谢谢您!...这非常有效。是的,我考虑过使用其他库,但我决定不使用外部库并使用附带的库。

以上是关于在将 .csv 文件中的数据读取到 DataTable 中时,有没有办法强制所有列都是字符串?的主要内容,如果未能解决你的问题,请参考以下文章

读取csv字典变成str了怎么办

将 csv 文件中的日期字段读取到数据框中

java写的excel文件转csv文件脚本遇到中文就会乱码

gh读取csv文件

处理 Pandas read_csv 中的缺失数据

读取 zip 中的所有 csv 文件,并将相应的 csv 文件名作为数据帧变量名