Csv 使用Jet Oledb从文本文件中读取,标题处于关闭状态(HDR=否)
我有一个CSV文本文件,我正试图将其从代码读入数据集。如果起始字符为#,代码将读取备用列 下面是我正在使用的代码Csv 使用Jet Oledb从文本文件中读取,标题处于关闭状态(HDR=否),csv,oledb,jet,Csv,Oledb,Jet,我有一个CSV文本文件,我正试图将其从代码读入数据集。如果起始字符为#,代码将读取备用列 下面是我正在使用的代码 DataSet dsFileRecords = new DataSet(); string selectQuery = "SELECT * FROM " + filename + ""; OleDbConnection fileConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source
DataSet dsFileRecords = new DataSet();
string selectQuery = "SELECT * FROM " + filename + "";
OleDbConnection fileConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + decryptedFilePath + ";Extended Properties=\"text;HDR=NO;FMT=CSVDelimited;\"");
OleDbDataAdapter dsCmd = new OleDbDataAdapter(selectQuery, fileConnection);
//Fill the DataSet object
dsCmd.Fill(dsFileRecords, "ReconciliationRecords");
更新
我已经根据建议的答案更新了我的截图
输入数据
#Header,TPCCH,LTPTP,TRC,F,2012/06/06 23:59:59,0000000002,0000000003,00.00,00.00,PTP0101011,PTP0101010
011001001,0110212122,W,W1,2012/06/06 23:59:59,01100110,2L,10.00,,A,,AP09BK4890,
011001002,0110212123,W,W1,2012/06/06 23:59:59,01100110,2L,10.00,10.00,AD,,AP09BK4890,
011001003,0110212123,E,E1,2012/06/06 23:59:59,01100110,2L,10.00,10.00,R,012,AP09BK4891, #TRAILER,0000000003
Sandeep,标签sing(#
)不是你的问题
由于您关闭了标题,Jet engine将每个列解释为相同的数据类型。在这里说
#Header、011001001、011001002、011001003
位于同一列中,并且#Header
的格式不同于其他的格式,因此引擎拒绝它
其他失踪人员的情况也类似。如果您注意到第3列和第4列没有出现此问题,因为它们的格式相同
要解决此问题,请通过将连接字符串中的HDR=No
更改为HDR=Yes
来打开标题,第一列将得到不同的处理,不会用于数据类型识别目的
为了让您对正在发生的事情略知一二,我编写了一个小型控制台应用程序来复制这种情况
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
#FName
LName
Phone
Hank
Donald
202
Walter
W
203
Jimmy
Jones
201
如果你注意到了,我也在第一个头球前加了#,以消除悬挂。现在您可以看到headerPhone丢失,因为它在同一列中的所有行的值都有一个数值
现在看看这个。我的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
那有多好?!我为valuePhone
替换的值1111
显示良好:
打开页眉,并将此区块添加到第一行Foreach
内的代码中,然后在行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
Hank
Donald
202
Walter
W
203
Jimmy
Jones
201
#FName
LName
Phone
Hank
Donald
202
Walter
W
203
Jimmy
Jones
201
瞧
更新
#Header
和#trail
不是数据的一部分,因此需要在处理之前删除。一个小正则表达式就可以做到这一点(但是,如果你不知道正则表达式(),这可能看起来像一个黑魔法)
这是需要在开始时修改的代码
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 = ...
我认为这会有所帮助,但它不会读取浮动金额值。。检查新的屏幕截图。没关系,我已经为你修好了。让我看看你提到的浮点数有什么问题@sandeep@sandeep,我看了你的截图,老实说,我不知道发生了什么。你能像我添加screeshot那样更新你的问题吗?这一次包括文本文件的原始内容,甚至部分内容吗?#Header,TPCCH,LTPTP,TRC,F,2012/06/06 23:59:5900000000200000003,00.00,00.00,ptp010101010 01100110010110212122,W,w11212/06/06 23:59:59011011011010,2L,10.00,,A,,AP09BK4890,0110010020110212123,W,W12012/06/06 23:59:5901100110,2L,10.00,10.00,AD,,AP09BK4890,011001001001030110212123,E,E12012/06/06 23:59:5901100110,2L,10.00,10.00,R,012,AP09BK4891,00000003您这里有三个问题:1)\header
和\trail
不属于您的数据,因此应该删除。检查我的最新答案。2) 您得到了重复的标题名00.00
和00.00
。这在任何数据库系统AFAIK中都不会发生,因为它将创建两个同名字段。3) 标题中有点
,它们会被转换为。
。有关2和3的解决方案,请在此处查看我的答案。