使用OleDbConnection读取制表符分隔的文件

5

我的制表符分隔文件大致如下:

ISO ISO3    ISO-Numeric
AD  AND 20

我一直在尝试以下代码,但没有成功。
OleDbConnection cn = new  OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= |DataDirectory|;Extended Properties='text;HDR=Yes;FMT=TabDelimited'");
OleDbCommand cmd = new OleDbCommand(@"SELECT * FROM countryInfo.txt", cn);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);

cn.Open();

DataTable dt = new DataTable();
da.Fill(dt);

这是数据集可视化器的截图。显然这不是我想要的输出结果。 alt text 你有什么建议吗?这是我的Schema.ini文件,它与文本文件在同一个目录中。
[countryInfo.txt]
Format=TabDelimited
ColNameHeader=True
CharacterSet=ANSI

我应该使用类似FileHelpers这样的东西吗?


@Hans Passant 这是一张截图。 alt text


我总是自己解析文件。 - sh_kamalh
我几年前曾经用过这些东西,所以我有点生疏。但是我还记得 schema.ini 文件必须与数据文件在同一目录下。此外,在第一列前面放置 # 号可能会导致问题,但我不确定。它可能会把你的列标题行解释为注释掉的内容。 - Jason Down
Schema.ini在同一个文件夹中。我也尝试过去掉#号,但似乎没有帮助。 - Prabath Yapa
2个回答

2

创建并保存一个 schema.ini 文件到应用程序文件夹中,包含以下文本:

------------------Schema.ini file starts here-----------------
[Data.txt]
ColNameHeader=True
Format=TabDelimited
Col1=First_Name Text
Col2=Middle_Initial Text
Col3=Last_Name Text
------------------Schema.ini file ends here-----------------

然后使用以下代码加载Data.txt文件:
string fileName = string.Format("{0}", AppDomain.CurrentDomain.BaseDirectory);   
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; " + "Extended Properties=\"text;HDR=YES;FMT=TabDelimited;\"", fileName);
string sql = "select * from " + "Data.txt";

OleDbConnection con = new OleDbConnection(connectionString);
con.Open();

OleDbDataAdapter dap = new OleDbDataAdapter(sql, con);
DataTable dt = new DataTable();
dt.TableName = "Data";
dap.Fill(dt);

con.Close();

1

嗯,一个明显的候选者是这个空白不是制表符而是空格。尝试使用FMT=Delimited( )。使用十六进制查看器查看实际内容。背景资料在这里

这个线程说明了为什么使用像Jet这样的有缺陷的代码块是一个错误,因为它已经没有得到支持了9年。在答案中,将schema.ini中的第一行留空。


不知道“bh”可能意味着什么,这就是要求屏幕截图的原因。 09确实是制表符的ASCII代码。 - Hans Passant
是的,它是09。如上方截图。 - Prabath Yapa
它是制表符分隔的。该文件采用utf-8编码,可能对JET过于先进。文件中的前3个字节是BOM,这就是输出中产生#的原因。您可以在记事本中打开文件并将其保存回ANSI编码。看看是否有区别。我不太理解“全都混在一起”的评论。 - Hans Passant
将其保存回 ANSI,但即使如此也没有任何改变。我的意思是,我的输出中的分隔字段没有被正确分离。我将重新编辑问题,并附上完整的代码和输出截图。我相信这一切都与我自己的某些愚蠢行为有关,这是我第一次使用 OleDb 读取这种类型的文件。 - Prabath Yapa
1
不知道。请查看此帖子:http://social.microsoft.com/Forums/en-US/Offtopic/thread/9f7d2b67-cea5-4840-96ef-2e12011752d7 - Hans Passant
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接