使用OleDbConnection读取Tab文件时保留值末尾空格的技术问询
保留Tab文件末尾空格的OLEDB读取解决方案
首先看你的原始Tab文件内容(注意Value列的末尾有空格):
Id ScenarioName MainBatchName Variable Value French Dutch Italian Remarks Project SubProject EnvDBQuery 26345935 85036_Self_Service_API_RedeemRewardsRequest <LMR_AccountNumber@1_1> "[PC_AccNum]_2" "" "" "" "" BankCard CreditProcessing "" 26345936 85036_Self_Service_API_RedeemRewardsRequest <LMR_AccountNumber@1_2> "[PC_AccNum]_1" "" "" "" "" BankCard CreditProcessing "" 26328357 85036_Self_Service_API_RedeemRewardsRequest <RRR_MessageVal@1_1> "Loyalty points processed successfully " "" "" "" "" BankCard CreditProcessing "" 26328358 85036_Self_Service_API_RedeemRewardsRequest <RRR_MessageVal@1_2> "Loyalty points processed successfully " "" "" "" "" BankCard CreditProcessing ""
你当前使用的读取代码:
string fileName = "abc.tab"; string directoryName = @"D:\myDirectory\"; string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + directoryName + @";Extended Properties=""text;HDR=NO;IMEX=1;FMT=TabDelimited;CharacterSet=65001"""; OleDbCommand oleCmd = new OleDbCommand(); DataTable dataTbl = new DataTable(); OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); OleDbConnection conn = new OleDbConnection(connString); oleCmd.Connection = conn; conn.Open(); oleCmd.CommandText = "SELECT * From [" + fileName + "]"; dataAdapter.SelectCommand = oleCmd; CreateSchemaFile("TabDelimited", directoryName, fileName); dataAdapter.Fill(dataTbl);
问题出在OLEDB文本驱动的默认行为:它会自动修剪所有文本字段的前后空格,导致你无法获取原始值。下面是具体的解决方法:
方法一:通过Schema.ini强制保留空格
OLEDB读取文本文件时会依赖同目录下的Schema.ini文件来确定字段格式。你需要手动配置这个文件,明确指定字段类型为Text并设置宽度,避免驱动自动修剪空格。
1. 创建/修改Schema.ini
在D:\myDirectory\下创建或修改Schema.ini,内容如下:
[abc.tab] Format=TabDelimited ColNameHeader=True CharacterSet=65001 Col1=Id Integer Col2=ScenarioName Text Width 255 Col3=MainBatchName Text Width 255 Col4=Variable Text Width 255 Col5=Value Text Width 255 Col6=French Text Width 255 Col7=Dutch Text Width 255 Col8=Italian Text Width 255 Col9=Remarks Text Width 255 Col10=Project Text Width 255 Col11=SubProject Text Width 255 Col12=EnvDBQuery Text Width 255
- 把所有需要保留空格的字段(比如
Value)设为Text类型,并指定足够的Width(可根据实际数据长度调整)。 ColNameHeader=True对应你的Tab文件有表头,所以连接字符串里的HDR要改成YES。
2. 调整连接字符串
把连接字符串中的HDR=NO改为HDR=YES,匹配Schema.ini的配置:
string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + directoryName + @";Extended Properties=""text;HDR=YES;IMEX=1;FMT=TabDelimited;CharacterSet=65001""";
3. 跳过自动生成Schema.ini
如果你之前的CreateSchemaFile方法会自动生成默认的Schema.ini,记得注释掉这行代码,或者让它生成后覆盖为我们手动配置的内容,否则默认配置会覆盖你的自定义设置。
方法二:直接用StreamReader手动解析
如果不想依赖OLEDB和Schema.ini,你可以用StreamReader逐行读取文件,手动分割Tab分隔的字段,完全控制解析逻辑:
List<string[]> rows = new List<string[]>(); using (StreamReader reader = new StreamReader(Path.Combine(directoryName, fileName), Encoding.UTF8)) { string line; while ((line = reader.ReadLine()) != null) { // 按Tab分割,保留所有原始内容(包括空格) string[] fields = line.Split('\t'); rows.Add(fields); } } // 把rows转换为DataTable(可选) DataTable dataTbl = new DataTable(); // 添加表头 string[] headers = rows[0]; foreach (string header in headers) { dataTbl.Columns.Add(header); } // 添加数据行 for (int i = 1; i < rows.Count; i++) { dataTbl.Rows.Add(rows[i]); }
这种方式能100%保留原始的空格和格式,但需要自己处理数据类型转换、空值等问题,适合简单的场景。
内容的提问来源于stack exchange,提问作者Anirban Saha
相关产品推荐
相关产品推荐

