5

当我读取固定长度文件时,该值始终没有空格。

示例:文件夹 c:\temp 包含 2 个文件

fs.txt

ITMHMC12-163 -0000153430.30
ITMHMC12-164 -0000000745.18

架构.ini

[fs.txt]
ColNameHeader=False
Format=FixedLength
DateTimeFormat=yyyymmdd
Col1=RecordTypeSCFBody Text Width 3
Col2=InvoiceNumber Text Width 10
Col3=Amount Text Width 14

用于读取文件的 C# 代码...

string fileName = @"C:\temp\fs.txt";
string dir = Path.GetDirectoryName(fileName);

DataTable dataTable;

using (OleDbConnection conn =
    new OleDbConnection(@"Provider=Microsoft.Jet.OleDb.4.0;" +
        "Data Source=" + dir + ";" +
        "Extended Properties=\"Text;\""))
{
conn.Open();

using (OleDbDataAdapter adapter = new OleDbDataAdapter("select * from " + fileName, conn))
{

    dataTable = new DataTable();
    adapter.Fill(dataTable);
}
conn.Close();
}

Console.Write(dataTable.Rows[0][1].ToString()); <-- this line **

-->这条线给了我“HMC12-163”,但我期待“HMC12-163”。注意空间!

感谢你的帮助。

非常感谢!-德布

4

2 回答 2

1

对于固定长度格式的文本文件,您应该在扩展属性中指定:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\txtFilesFolder\;Extended Properties="text;HDR=No;FMT=Fixed";

“HDR=是的;” 表示第一行包含列名,而不是数据。“HDR=否;” 表示相反。
要指定每个列的长度,请使用您的Schema.ini文件。

因此您的代码变为:

using (OleDbConnection conn =
    new OleDbConnection(@"Provider=Microsoft.Jet.OleDb.4.0;" +
        "Data Source=" + dir + ";" +
        "Extended Properties=\"Text;HDR=No;FMT=Fixed\""))
于 2012-09-11T16:14:26.720 回答
1

似乎没有任何记录在案的设置来控制此行为。如果尾随空格很重要,您可以在代码或 SQL 中明确填充正确数量的空格:

const int maxInvoiceLength = 10;
string fileName = @"C:\temp\fs.txt";
string dir = Path.GetDirectoryName(fileName);

DataTable dataTable;

using (OleDbConnection conn =
    new OleDbConnection(@"Provider=Microsoft.Jet.OleDb.4.0;" +
        "Data Source=" + dir + ";" +
        "Extended Properties=\"Text;\""))
    {
        conn.Open();

        string query = String.Format("SELECT RecordTypeSCFBody, LEFT(InvoiceNumber + SPACE({0}), {0}), Amount FROM {1}", maxInvoiceLength, fileName);
        using (OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn))
        {
            dataTable = new DataTable();
            adapter.Fill(dataTable);
        }
    }

    Console.Write(dataTable.Rows[0][1].ToString());
于 2012-09-11T18:46:11.437 回答