C#读取固定长度文件 - 修改值的空间

时间:2012-09-11 15:56:38

标签: c# oledb fixed

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

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

fs.txt

ITMHMC12-163 -0000153430.30
ITMHMC12-164 -0000000745.18

SCHEMA.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 **

- &gt;这一行给了我“HMC12-163”,但我期待“HMC12-163”。 请注意空格!

感谢您的帮助。

非常感谢! -Deb

2 个答案:

答案 0 :(得分: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\""))

答案 1 :(得分: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());