将固定宽度的文本文件逐行读入数据表 - C#

时间:2016-05-13 20:22:22

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

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

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

我尝试了这段代码,但它只给我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类型付款 样品名称.......〜地址城市〜州~12345联系人姓名123-456-7890类型付款 样品名称.......〜地址城市〜州~12345联系人姓名123-456-7890类型付款

中间有很多空间..

1 个答案:

答案 0 :(得分:0)

如果您想使用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中已有的东西,或编写自己的分割代码,或使用第三方库

对于您自己的代码方法,我会开始为您的记录定义一个类 例如,Customer类可以是

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);        
}

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