Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检索文本文件数据_C#_Visual Studio_Windows Applications - Fatal编程技术网

C# 检索文本文件数据

C# 检索文本文件数据,c#,visual-studio,windows-applications,C#,Visual Studio,Windows Applications,我试图检索一个文件中的数据,该文件如下所示 发件人:XXXXXXXX已发送:xxxxxx至:xxxxxx主题:计数器列表 [型号名称],ABC [序列号],XXXXXXXXXX [发送日期],8888 [总计数器],00312697 [总颜色计数器],00106667 [黑色计数器总数],0020630 [总扫描/传真计数器],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 [通电累积时间]

我试图检索一个文件中的数据,该文件如下所示

发件人:XXXXXXXX已发送:xxxxxx至:xxxxxx主题:计数器列表

[型号名称],ABC

[序列号],XXXXXXXXXX

[发送日期],8888

[总计数器],00312697

[总颜色计数器],00106667

[黑色计数器总数],0020630

[总扫描/传真计数器],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.0727.7718.2728.6667.5735.2738.6627.8674.8575.2500.2379.3

[站立累积时间], 0.0572.3539.0514.3517.4571.0575.5465.2524.9454.6367.4280.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

发件人:XXXXXXXX已发送:xxxxxx至:xxxxxx主题:计数器列表

[型号名称],ABC

[序列号],XXXXXXXXXX

[发送日期],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; 
}
但是由于列的数量不匹配,它给出了一个错误-

这里是一个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   ------------>");
}
string contents=File.ReadAllText(@“路径到文件”);
string[]singleContentCollection=contents.Split(新字符串[]{“eof”},StringSplitOptions.RemoveEmptyEntries);
foreach(singleContentCollection中的var singleContent)
{
string[]contentLines=singleContent.Split(新字符[]{'['},StringSplitOptions.None);
foreach(contentLine中的var contentLine)
{
string[]contentLineItems=contentLine.Split(新字符[]{']},StringSplitOptions.None);
字符串标签=contentLineItems[0];
Console.Write(Label.Replace(Environment.NewLine,string.Empty));
如果(contentLineItems.Length>1)
{
控制台。写(“:”;
Write(contentLineItems[1].TrimStart(',).Replace(Environment.NewLine,string.Empty));
}
Console.WriteLine();
}
控制台。写线(“”);
}
这是输出 这里是一个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   ------------>");
}
string contents=File.ReadAllText(@“路径到文件”);
string[]singleContentCollection=contents.Split(新字符串[]{“eof”},StringSplitOptions.RemoveEmptyEntries);
foreach(singleContentCollection中的var singleContent)
{
string[]contentLines=singleContent.Split(新字符[]{'['},StringSplitOptions.None);
foreach(contentLine中的var contentLine)
{
string[]contentLineItems=contentLine.Split(新字符[]{']},StringSplitOptions.None);
字符串标签=contentLineItems[0];
Console.Write(Label.Replace(Environment.NewLine,string.Empty));
如果(contentLineItems.Length>1)
{
控制台。写(“:”;
Write(contentLineItems[1].TrimStart(',).Replace(Environment.NewLine,string.Empty));
}
Console.WriteLine();
}
控制台。写线(“”);
}
这是输出

出现错误的原因是大多数行只有一个逗号,因此
部分只包含两个项,并且引用的索引大于数组中的项数

我不完全清楚的是,您希望如何显示数据,因为您似乎有多个数据块(在“eof”行之间),有些行有多个部分

这里有一种方法,其中每个数据块表示一行,块中的每行表示一列

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

当我们到达
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;
}  

出现此错误的原因是,大多数行只有一个逗号,因此
parts
仅包含两个项,并且引用的索引大于数组中的项数

我不完全清楚的是,您希望如何显示数据,因为您似乎有多个数据块(在“eof”行之间),有些行有多个部分

这里有一种方法,其中每个数据块表示一行,块中的每行表示一列

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

当我们到达
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;
}  

到目前为止你尝试了什么,你到底被困在哪里?你能把你当前的代码添加到你的帖子中吗?我现在有这个DataTable=newdatatable();使用(StreamReader sr=new StreamReader(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]);}