从文本文件导入时 DataSet 中缺少列
Missing Columns in DataSet when importing from Text File
我正在尝试通过 C# 将 pipe-delimited 文本文件导入数据集。某些列未导入 headers.
这是我的源数据:
Apple|Orange|Banana|Grape|Mango|Guava|Apricot|Pear|Peach
0C025X0|530335|WEROERWORUWEORWEU||Misc.||0|1|0
这是我的代码:
bool conversionStatus = true;
//instantiate new Excel Object
Application xlApp = new Application();
_Workbook wb = null;
if (xlApp == null)
{
Console.WriteLine("Excel is not properly installed!!");
Console.ReadLine();
return false;
}
//OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"text;HDR=No;FMT=TabDelimited\"");
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"text;HDR=No\"");
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(filePath), conn);
DataSet ds = new DataSet("Temp");
adapter.Fill(ds);
我的格式设置在 schema.ini 文件中,如下所示:
[Master.txt]
Format=Delimited(|)
ColNameHeader=False
以下是数据在数据集中的样子。
有谁知道为什么有些 headers 被包括在内,而另一些没有?
我可以重现你的情况,我已经解决了将 schema.ini
文件更改为
[Master.txt]
Format=Delimited(|)
ColNameHeader=False
Col1=Name1 Text Width 100
Col2=Name2 Text Width 100
Col3=Name3 Text Width 100
Col4=Name4 Text Width 100
Col5=Name5 Text Width 100
Col6=Name6 Text Width 100
Col7=Name7 Text Width 100
Col8=Name8 Text Width 100
Col9=Name9 Text Width 100
使用示例设置列列表 name and type
似乎可以解决问题。
经过一番研究后,我注意到缺失值来自具有冲突类型值的列。
例如,F2 列的第一行应包含单词 ORANGE,但下一行包含一个数字,同样的情况也发生在具有缺失值的所有其他列中。所以我认为文本驱动程序已决定为列提供数字类型,当然,不能表示该列中的字符串值。
现在为了验证这个理论,我将这些行添加到您的代码中:
adapter.Fill(ds);
DataTable dt = ds.Tables[0];
Console.WriteLine(dt.Columns["F2"].DataType); // prints Int32
宾果游戏。驱动程序为 F2 列选择了 Int32 数据类型,ORANGE 一词不能在那里显示。
要修复它,您可以将列名及其数据类型添加到 schema.ini 中,以避免实际列值之间的歧义。
我正在尝试通过 C# 将 pipe-delimited 文本文件导入数据集。某些列未导入 headers.
这是我的源数据:
Apple|Orange|Banana|Grape|Mango|Guava|Apricot|Pear|Peach
0C025X0|530335|WEROERWORUWEORWEU||Misc.||0|1|0
这是我的代码:
bool conversionStatus = true;
//instantiate new Excel Object
Application xlApp = new Application();
_Workbook wb = null;
if (xlApp == null)
{
Console.WriteLine("Excel is not properly installed!!");
Console.ReadLine();
return false;
}
//OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"text;HDR=No;FMT=TabDelimited\"");
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"text;HDR=No\"");
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(filePath), conn);
DataSet ds = new DataSet("Temp");
adapter.Fill(ds);
我的格式设置在 schema.ini 文件中,如下所示:
[Master.txt]
Format=Delimited(|)
ColNameHeader=False
以下是数据在数据集中的样子。
有谁知道为什么有些 headers 被包括在内,而另一些没有?
我可以重现你的情况,我已经解决了将 schema.ini
文件更改为
[Master.txt]
Format=Delimited(|)
ColNameHeader=False
Col1=Name1 Text Width 100
Col2=Name2 Text Width 100
Col3=Name3 Text Width 100
Col4=Name4 Text Width 100
Col5=Name5 Text Width 100
Col6=Name6 Text Width 100
Col7=Name7 Text Width 100
Col8=Name8 Text Width 100
Col9=Name9 Text Width 100
使用示例设置列列表 name and type
似乎可以解决问题。
经过一番研究后,我注意到缺失值来自具有冲突类型值的列。
例如,F2 列的第一行应包含单词 ORANGE,但下一行包含一个数字,同样的情况也发生在具有缺失值的所有其他列中。所以我认为文本驱动程序已决定为列提供数字类型,当然,不能表示该列中的字符串值。
现在为了验证这个理论,我将这些行添加到您的代码中:
adapter.Fill(ds);
DataTable dt = ds.Tables[0];
Console.WriteLine(dt.Columns["F2"].DataType); // prints Int32
宾果游戏。驱动程序为 F2 列选择了 Int32 数据类型,ORANGE 一词不能在那里显示。
要修复它,您可以将列名及其数据类型添加到 schema.ini 中,以避免实际列值之间的歧义。