阅读固定格式的文本文件-第2部分

本文关键字:文件 2部 文本 定格 格式 | 更新日期: 2023-09-27 18:21:58

这是问题的后续问题:

我正在尝试使用Microsoft.ACE.OLEDB.12.0提供程序读取固定格式文本文件。我有六种不同的方法来设置驱动程序和/或提供程序,每次都会遇到同样的问题。由于"找不到可安装的ISAM"异常或驱动程序的错误和异常,我甚至无法"开始"。

该系统安装了Office 2007,因此"找不到可安装的ISAM"没有多大意义。

有人看到以下代码有问题吗?

string DATABASE_PROVIDER = "Provider=Microsoft.ACE.OLEDB.12.0";
string CVS = Application.StartupPath + @"'Data.txt";
string connectionString = DATABASE_PROVIDER = ";Data Source=" + CVS +";Extended Properties=text;HDR=Yes;FMT=Fixed";
string field ="*";
string table ="Data";
string StringQueryCMD = "SELECT" + field+" FROM " + table;
OleDbConnection myConnection = new OleDbConnection( connectionString );
OleDbCommand cmd = myConnection.CreateCommand();
cmd.CommandText = StringQueryCmd;
myConnection.Open(); // <---- "Could not find installable ISAM" exception here
OleDataAdapter myDataAdapter = new OleDbDataAdapter(cmd);
DataTable Table = new DataTable("Data");// <---- "Could not find installable ISAM" exception here
myDataAdapter.Fill(Table);

阅读固定格式的文本文件-第2部分

我会使用FileHelpers库来读取固定长度的文件,而不是ADO.Net.

更新在这种情况下,我认为您需要一个ini文件和定义txt文件的txt文件。列宽、名称等

另一种选择是完全放弃ado.net,创建一个简单的固定长度文件读取器。

var file = new FileInfo("path");
using(var reader = file.Open())
while(reader.Read())
{
   //parse the line
   yield return the object representing the parsed line.
}

我最终选择了一个稍微不同的解决方案。"找不到可安装的ISAM"异常的解决方案是使用以下内容:

string EXTENDED_PROPERTIES = @"Extended Properties=""Text;HDR=YES;FMT=FixedLength;""";

解决方案的关键是"扩展属性"值周围的"。我能够用文件的内容填充DataTable,我认为ini文件有问题,所以它包含"-----"字符串,这对我来说毫无用处。

所以我最终只是简单地读取了访问数据库。

string DATABASE_PROVIDER = "Provider=Microsoft.ACE.OLEDB.12.0";
string CVS Application.StartupPath + ""''Database.accdb";
string DATA_SOURCE = "Data Source" + CVS;
string connectionString = DATABASE_PROVIDER + DATA_SOURCE;
string TABLE = " FROM STUFF";
string SELECT = "SELECT CODE, NAME, ICON, FUNCTION;
string StringQueryCmd = SELECT + TABLE;
OleDbConnection MyConnection = new OleDbConnection(connectionString);
OleDbCommand Command = OleDbCommand(StringQueryCmd,MyConnection);
OleDbAdapter MyDataAdapter = new OleDbAdapter(Command);
DataSet MyDataSet = new DataSet();
DataTable MyDataTable = new DataTable();
MyConnection.Open();
MyDataAdapter.Fill(MyDataSet,"STUFF");
MyConnection.Close();

一旦有了DataTable,理论上就可以使用LINQ to DataSet,而不是处理DataTable。