Sandeep,主题标签唱歌 (#) 不是您的问题。
由于您关闭了标题,Jet 引擎将每一列解释为相同的数据类型。在这里说
#Header, 011001001, 011001002, 011001003 在同一列中,#header 的格式与其他格式不同,因此引擎会拒绝它。
其余失踪者的情况类似。如果您注意到此问题不会发生在第 3 列和第 4 列,因为它们的格式相同。
要解决此问题,请通过将连接字符串中的 HDR=No 更改为 HDR=Yes 来转动您的标题 ON,第一列将被区别对待,并且不会用于数据类型识别目的。
为了让您了解正在发生的事情,我编写了一个小控制台应用程序来复制这种情况。
var file = new FileInfo("C:\\TextFile.txt");
OleDbConnection fileConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"" + file.DirectoryName + "\";Extended Properties='text;HDR=No;FMT=Delimited(,)';");
string selectQuery = "SELECT * FROM " + file.Name;
using (var cmd = new OleDbCommand(selectQuery, fileConnection))
{
fileConnection.Open();
OleDbDataAdapter dsCmd = new OleDbDataAdapter(selectQuery, fileConnection);
//Fill the DataSet object
DataSet dsFileRecords = new DataSet();
dsCmd.Fill(dsFileRecords, "ReconciliationRecords");
foreach (DataTable dsFileRecord in dsFileRecords.Tables)
{
foreach (DataRow row in dsFileRecord.Rows)
{
foreach (var item in row.ItemArray)
{
Console.WriteLine(item.ToString());
}
Console.WriteLine( "\r\n" );
}
}
}
Console.ReadLine();
我要在这里测试的是我的 TextFile.txt
的内容
如果内容是
#FName, LName, Phone
Hank, Donald, 0202
Walter, W, 0203
Jimmy, Jones, 0201
输出是,
#FName
LName
Hank
Donald
202
Walter
W
203
Jimmy
Jones
201
如果您注意到我还在第一个标题之前添加了 # 以清除暂停。现在您可以看到标题 Phone 丢失了,因为它在同一列中的所有后续行的值都有一个数值。
现在检查一下。我的 TextFile.txt 内容为,
#FName, LName, Phone
Hank, Donald, 0202
Walter, W, 0203
Jimmy, Jones, 0201
在控制台应用程序中给出输出,
#FName
LName
1111
Hank
Donald
202
Walter
W
203
Jimmy
Jones
201
这有多好?!我用值Phone 替换的值1111 很好。 :)
打开标题 On 并将此块添加到您的代码中的第一个 Foreach 和 rows Foreach 之前的代码中,您将打印标题并按如下方式排序,
foreach (DataTable dsFileRecord in dsFileRecords.Tables)
{
// Added foreach statement.
foreach (DataColumn column in dsFileRecord.Columns)
{
Console.WriteLine(column.ColumnName.ToString());
}
Console.WriteLine("\r\n");
foreach (DataRow row in dsFileRecord.Rows)
{
foreach (var item in row.ItemArray)
{
Console.WriteLine(item.ToString());
}
Console.WriteLine("\r\n");
}
}
输出是,
#FName
LName
Phone
Hank
Donald
202
Walter
W
203
Jimmy
Jones
201
瞧!
更新
#Header 和 #Trailer 不是您的数据的一部分,因此需要在处理之前将其删除。一点正则表达式就可以解决问题(但是,如果您不知道正则表达式 (Regular Expression Language),这可能看起来像是一个黑魔法)。
这是一开始需要修改的代码
var file = new FileInfo("C:\\RealTextFile.txt");
// Regex to remove the "#Header" and "#Trailer".
// The modigied txt file will be saved with the "_" prefix.
File.WriteAllLines(file.DirectoryName + "\\_" + file.Name,
File.ReadAllLines(file.FullName).Select(content =>
Regex.Replace(content, @".*(?>#Header,)|#TRAILER.+", string.Empty)
));
file = new FileInfo(file.DirectoryName + "\\_" + file.Name);
OleDbConnection fileConnection = ...