schema.ini(ODBC Text Driver) 的问题

Jinglecat 2008-07-16 02:56:07
可以通过 ODBC Text Driver 读取 tab 分割的文本文件,
按文档说明(http://msdn.microsoft.com/en-us/library/ms974559.aspx),对于 tab 分割格式需要建立 schema.ini 来提供文件格式信息,
但是在我的测试无法正确识别:每行数据当作一个字段来读取,而不是4个字段!

以下代码,只要将注册表中的默认配置 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format 修改为 TabDelimited 就可以分别读取4个字段。

还有需要哪个地方配置?


static void Main(string[] args)
{
/*
* 1. Issuse
* Let's say I have 4 fields delimited by tab in each line in the tab-delimited.txt file.
* I also have a schema.ini file in the same folder to indicate the format of the tab-delimited.txt file.
* But it seems the schema.ini file does not override the setting in the system registry(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format).
* The text engines can not recognize tab as the delimiter. So it still reads the four fields together into one field.
*
* 2. Solution But Tedious
* Config the default format from CSVDelimited to TabDelimited in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format, you will get the expected result.
*/
string dataSourcePath = Environment.CurrentDirectory + "\\";
string dataFileName = "tab-delimited.txt";
string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dataSourcePath + @";Extended Properties=""text;HDR=NO;FMT=TabDelimited""";
OleDbConnection conn = new OleDbConnection(connString);
OleDbCommand cmd = conn.CreateCommand();
cmd.CommandText = String.Format("SELECT * FROM [{0}]", dataFileName);
DataTable dt = new DataTable(Path.GetFileNameWithoutExtension(dataFileName));
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.Fill(dt);

// output as xml.
dt.WriteXml(dataFileName + ".xml");
// output into current console.
Console.WriteLine("The imported data has {0} column(s):", dt.Columns.Count);
foreach (DataColumn col in dt.Columns)
{
Console.Write(col.ColumnName);
Console.Write("\t");
}
Console.WriteLine();

foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
{
Console.Write(row[col]);
Console.Write("\t");
}
Console.WriteLine();
}
Console.WriteLine();
//
Console.Read();
}


完整测试代码以及样本文件下载:
http://www.cnblogs.com/Files/Jinglecat/ReadSeparatedValuesTest.rar
...全文
686 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxin0708 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hongqi162 的回复:]
恩,这样就可以了

txt文件内容

aa bb cc dd
112 333 3333 335
2 12 33 22



schema.ini 内容
[123.txt]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=25
CharacterSet=OEM
Col1=AA Integer
Col2=B……
[/Quote]

想弱弱的问一下:如果TXT里面的内容是以 "/"为分割的,那么 Format 的值如何修改!

在EXCEL里面改入TXT格式的外部数,提Schema.ini方件失效
wxin0708 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jinglecat 的回复:]
问题解决了,一个很弱智的很弱智的问题: schema.ini 的内容必须从第二行开始。
[/Quote]

schema.ini 的内容,第一行如何放空?
Jinglecat 2008-07-16
  • 打赏
  • 举报
回复
问题解决了,一个很弱智的很弱智的问题: schema.ini 的内容必须从第二行开始。



Jinglecat 2008-07-16
  • 打赏
  • 举报
回复
崩溃了,死活都读到一列去....
hongqi162 2008-07-16
  • 打赏
  • 举报
回复
要是还不好使你上QQ,我给把程序给你
Jinglecat 2008-07-16
  • 打赏
  • 举报
回复
月亮你的修改似乎没有本质的区别呀....

我再试试
hongqi162 2008-07-16
  • 打赏
  • 举报
回复

修改了一下你的代码,我这里可以看到结果了

string dataSourcePath = @"D:\test";
//string dataFileName = "123.txt";
string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dataSourcePath + @";Extended Properties=""text;HDR=NO;FMT=TabDelimited""";
OleDbConnection conn = new OleDbConnection(connString);
OleDbCommand cmd = conn.CreateCommand();
//cmd.CommandText = String.Format("SELECT * FROM text1.txt", dataFileName);
cmd.CommandText = "SELECT * FROM 123.txt";
//DataTable dt = new DataTable(Path.GetFileNameWithoutExtension(dataFileName));
DataTable dt = new DataTable();
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.Fill(dt);
hongqi162 2008-07-16
  • 打赏
  • 举报
回复
恩,这样就可以了

txt文件内容

aa bb cc dd
112 333 3333 335
2 12 33 22



schema.ini 内容
[123.txt]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=25
CharacterSet=OEM
Col1=AA Integer
Col2=BB Integer
Col3=CC Integer
Col4=DD Integer
hongqi162 2008-07-16
  • 打赏
  • 举报
回复
恩,我使用别的开发工具使用ado连接过txt文件,具体的细节也想不起来了,我再试试吧


txt文件内容

aa bb cc dd
112 333 3333 335
2 12 33 22



schema.ini 内容
[123.txt]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=0
CharacterSet=OEM
Col1=AA
Col2=BB
Col3=CC
Col4=DD
Jinglecat 2008-07-16
  • 打赏
  • 举报
回复
问题症结好像就是 schema.ini 不起作用?

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧