检索文本文件数据

时间:2017-06-01 14:00:47

标签: c# visual-studio windows-applications

我正在尝试检索看起来像这样的文件中的数据

  

发件人:xxxxxxx已发送:xxxxxx收件人:xxxxxxx主题:计数器列表

     

[型号名称],ABC

     

[序列号],xxxxxxxxxxx

     

[发送日期],8888

     

[总计数器],00312697

     

[总色彩计数器],00106667

     

[黑色总计数器],00206030

     

[扫描/传真总计],00035325

     

[运行累积时间],0.0,13.8,13.4,18.0,11.5,10.9,   9.8,15.5,13.0,12.1,17.0,11.8

     

[激活累积时间],
  0.0,727.7,718.2,728.6,667.5,735.2,738.6,627.8,674.8,575.2,500.2,379.3

     

[常备累积时间],   0.0,572.3,539.0,514.3,517.4,571.0,575.5,465.2,524.9,454.6,367.4,280.7

     

[省电累计时间],   0.0,141.6,165.9,196.4,138.5,153.3,153.2,147.1,136.8,108.5,115.9,   86.8

     

EOF

     

发件人:xxxxxxx已发送:xxxxxx收件人:xxxxxxx主题:计数器列表

     

[型号名称],ABC

     

[序列号],xxxxxxxxxxx

     

[发送日期],8888

     

[总计数器],00598310

     

[扫描/传真总计],00002953

     

EOF

我想从每个部分的“FROM”开始阅读,并以','分隔显示数据。 我正在使用Windows应用程序C#

请帮忙

我目前有这个

DataTable table = new DataTable();
using (StreamReader sr = new Path.GetFullPath(openFileDialog1.FileName))) 
{
    while (!sr.EndOfStream)
    {
        string[] parts = sr.ReadLine().Split(','); 
        table.Rows.Add(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5]);
    }
    dataGridView1.DataSource = table; 
}

但是由于列数不匹配而给出错误 -

2 个答案:

答案 0 :(得分:0)

这是一个10分钟的“黑客”解决方案。你可以带走你需要的东西并修复所有臭臭的字符串......但是它有效

string contents = File.ReadAllText(@"PATH_TO_FILE");
string[] singleContentCollection = contents.Split(new string[] { "eof" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var singleContent in singleContentCollection)
{
    string[] contentLines = singleContent.Split(new char[] { '[' }, StringSplitOptions.None);
    foreach (var contentLine in contentLines)
    {
        string[] contentLineItems = contentLine.Split(new char[] { ']' }, StringSplitOptions.None);

        string Label = contentLineItems[0];

        Console.Write(Label.Replace(Environment.NewLine, string.Empty));


        if (contentLineItems.Length > 1)
        {
            Console.Write(" : ");


Console.Write(contentLineItems[1].TrimStart(',').Replace(Environment.NewLine, string.Empty));
        }

        Console.WriteLine();
    }
    Console.WriteLine("<----------    End Of Item   ------------>");
}

这是输出 enter image description here

答案 1 :(得分:0)

您收到错误的原因是您的大多数行只有一个逗号,因此parts只包含两个项目,并且您引用的索引大于项目数量数组。

我不完全清楚 您希望数据显示的方式,因为您似乎有多个数据块(在&#39; eof&#39;行之间)有些线条有多个部分。

这是一种方法,其中每个数据块代表一行,而块中的每一行代表一列。

基本上,您首先将所有列添加到表中。我是手动完成的,但可以通过迭代文件行来完成。然后,只需读取每一行并添加列名称部分(直到第一个逗号的部分),并将数据部分添加到dataRow。

当我们到达eof时,将dataRow添加到dataTable,当我们到达文件末尾时,将dataTable作为数据源添加到dataGridView:

private void button1_Click(object sender, EventArgs e)
{
    DataTable table = new DataTable();
    table.Columns.Add("HeaderInfo");
    table.Columns.Add("Model Name");
    table.Columns.Add("Serial Number");
    table.Columns.Add("Send Date");
    table.Columns.Add("Total Counter");
    table.Columns.Add("Total Color Counter");
    table.Columns.Add("Total Black Counter");
    table.Columns.Add("Total Scan/Fax Counter");
    table.Columns.Add("Operating Accumulation Time");
    table.Columns.Add("Energizing Accumulation Time");
    table.Columns.Add("Standing Accumulation Time");
    table.Columns.Add("Power Saving Accumulation Time");

    var rowData = table.NewRow();
    var filePath = @"c:\public\temp\temp.txt";

    foreach (var line in File.ReadAllLines(filePath)
        .Where(l => !string.IsNullOrWhiteSpace(l)))
    {
        var thisLine = line.Trim();

        if (thisLine.StartsWith("eof", StringComparison.OrdinalIgnoreCase))
        {
            // We've reached the end of a block, so add this row to our table
            table.Rows.Add(rowData);
            rowData = table.NewRow();
        }
        else if (thisLine.StartsWith("from", StringComparison.OrdinalIgnoreCase))
        {
            // This line doesn't contain the built in column name, so I made one up
            rowData["HeaderInfo"] = thisLine;
        }
        else
        {
            var firstComma = thisLine.IndexOf(',');
            var columnName = thisLine.Substring(0, firstComma).Replace("[", "").Replace("]", "");
            rowData[columnName] = thisLine.Substring(firstComma + 1);
        }                               
    }

    dataGridView1.DataSource = table;
    dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
}