You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:56:31