【问题标题】:C# Reading Fixed Length File - Trimming Space in the valuesC# 读取固定长度文件 - 修剪值中的空间
【发布时间】:2012-09-11 15:56:37
【问题描述】:

当我读取定长文件时,值总是没有空格。

示例:文件夹 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 **

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

感谢您的帮助。

非常感谢! -Deb

【问题讨论】:

  • “HMC12-163”,但我希望“HMC12-163”这样很好
  • 为了灵活性,请使用StreamReader 并填充您自己的DataTableThis 可能是相关的。

标签: c# oledb fixed


【解决方案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());

【讨论】:

  • 嗯...有趣的解决方案。我刚刚测试了它,它可以工作!谢谢@迈克·佩恩。我假设这可以通过使用一些配置/参数/选项来实现。
【解决方案2】:

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

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\""))

【讨论】:

  • Kash,我在实际代码中使用 StreamReader。我能够毫无问题地读取文件,并且了解扩展属性。我需要该值应包含空格并且不要修剪它。注意'Col2'的长度是'10',所以当我检索dataTable.Rows[0][1].ToString())
猜你喜欢
  • 2015-04-20
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2017-05-19
  • 2016-01-18
  • 1970-01-01
相关资源
最近更新 更多