Csv 使用Jet Oledb从文本文件中读取,标题处于关闭状态(HDR=否)

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

我有一个CSV文本文件,我正试图将其从代码读入数据集。如果起始字符为#,代码将读取备用列

下面是我正在使用的代码

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
那有多好?!我为value
Phone
替换的值
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的解决方案,请在此处查看我的答案。