在将 .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 中时,有没有办法强制所有列都是字符串?的主要内容,如果未能解决你的问题,请参考以下文章