【问题标题】:Read fixed width text file into datatable row by row - C#将固定宽度的文本文件逐行读取到数据表中 - C#
【发布时间】:2016-05-13 20:22:22
【问题描述】:

我有一个大的固定宽度的文本文件,我想逐行读取它并插入数据表,或者只是将它读入数据表。如何将一列从哪个位置分配到哪个位置?

我还必须执行一些操作,例如为每条记录修剪列的额外空间。

我试过这段代码,但它给了我只有 3 列而不是 15 列的数据表

string sourcePath = @"c:\\";
string filename = "file.txt";

DataTable dt;

//Create OleDb connection object
using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Jet.OleDb.4.0;" +
            "Data Source=" + sourcePath + ";Extended Properties=\"Text;\""))
{
    // Open connection 
    cn.Open();

    // Create OleDb Adapter object 
    using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + filename, cn))
    {
        dt = new DataTable("Records");
        adapter.Fill(dt);

        // Display results
        dataGridView1.DataSource = dt;
    }
}

样本数据

样品名称.......~地址~城市~州~12345 联系人姓名 123-456-7890 支付类型 样品名称.......~地址~城市~州~12345 联系人姓名 123-456-7890 支付类型 样品名称.......~地址 City~State~12345 联系人姓名 123-456-7890 类型 付款 样品名称.......~地址 City~State~12345 联系人姓名 123-456-7890 类型付款

中间有很多空格..

【问题讨论】:

  • 到目前为止您尝试了什么?输入文件的格式/结构是什么?
  • 我试过OleDb,文件是定宽文本文件
  • 请发布您的数据文件的一些示例行
  • 如果它是固定宽度的文本文件,我更喜欢通过 StreamReader 读取并使用 Substring 提取列值并创建数据表。您可能最终为此编写了一个包装类。或者你试过这个吗? filehelpers.net
  • 如果您要手动拆分数据,可以尝试使用 TextFieldParser

标签: c# asp.net text datatable fixed-width


【解决方案1】:

如果您想使用 OleDb 文本驱动程序读取您的文本文件,您需要提供一个 Schema.ini 文件来描述您的文本文件的“记录”(一行)之一的结构

所以假设你的文本文件包含这种格式的记录:

XXXXXYYYYYKKKKKZZZZ

(四个字段,每个字段 5 个字符)您需要在文本文件所在的同一文件夹中添加具有此结构的 Schema.ini 文件

[file.txt]
Format=FixedLength
Col1=CustomerNumber Text Width 5
Col2=CustomerName Text Width 5
Col3=CustomerCity Text Width 5
Col4=CustomerZIP Text Width 5

您可以在上面链接的 MSDN 页面上找到更多详细信息

如果不使用 OleDb,你需要使用 NET Framework 中已有的东西,或者编写自己的拆分代码,或者使用第三方库

对于您自己的代码方法,我将开始为您定义一个类。
例如,客户类可以是

public class Customer
{
    public string Name {get;set;}
    public string Address {get;set;}
    ... other fields omitted ....
}

然后你定义一个List<Customer> 并开始阅读你的文件

List<Customer> customers = new List<Customer>();
foreach(string line in File.ReadLines(filename)
{
    Customer c = new Customer();
    c.Name = line.Substring(0, 10).Trim();
    c.Address = line.Substring(10, 15).Trim();
    ... and so on for all the other fields....

    customers.Add(c);        
}

在循环结束时,您的列表中会填满您的数据。当然,如果您只需要在数据库服务器上的另一个表中写入所有内容,您可以编写直接在循环内插入/更新数据库表的代码,并避免加载列表。

【讨论】:

  • 我不想硬编码我的文件名,它是动态的
  • 那么你有两个选择。即时创建 Schema.ini 或创建读取文本文件并根据子字符串拆分每一行的代码。
  • 我正在为此探索 filehelper
  • 很高兴知道如何使用它,无论如何你需要告诉它如何分割你的行。
猜你喜欢
  • 2013-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多