阅读列表并选择特定数字

时间:2016-12-14 11:12:48

标签: c# list streamreader

很久以前写过一个应用程序的请求,他们希望现有数据网格视图中的另一列具有当前的钻取时间。这些时间来自机器读取和运行的文件。下面是一个文件示例。

Machine Program

现在寻找的数字是带有S的数字。现在,第一个数字是行号。由于时间需要与线路匹配,因此需要抓取线路号码。因此,我必须将其读入列表,获取行号,然后获取相关的“s”时间号。我将这些“s次”添加到已经有行号的现有表中,因此我将这些“次”添加到相应行号旁边的新列中。我有点卡在这里。

感谢任何帮助。

我知道我可以像这样阅读所有内容

         string f = ("//dnc/WJ/MTI-WJ/" + cboPartProgram.Text);

        List<string> lines = new List<string>();

        using (StreamReader r = new StreamReader(f))
        {
            // Use while != null pattern for loop
            string line;
            while ((line = r.ReadLine()) != null)
            {
                lines.Add(line);
            }
        }

但是一旦在列表中,我需要忽略以撇号“'”开头的行,然后只取第一行号“1,2,3”等,无论有多少,然后是“s”数那条线。

所以我离开了:

1    2.75
2    2.5
3    2

...等

现在,在数据库上有一个程序表。列

Program  Line  Time
Program1  1    
Program1  2
Program1  3
Program1  4

因此“s”次将被添加到现有表的时间列中。但是从第1,2,3,4行开始的“s”时间将与表格的行列重合。

因此,此示例中的最终结果将是

Program  Line  Time
Program1  1    2.75
Program1  2    2.5
Program1  3    2

更新

我不确定编辑后的代码是否能够覆盖sTime的行,因为我最近遇到了一个问题。有一个datagridview填充从sql语句填充的列表中的列。我为sTime添加了一个列(事实证明我可能不需要行#所以你会注意到我删除了它)然而我需要将我的循环从sTime合并到正在填充的列表中发生的循环中dgv。现在我尝试以几种不同的方式将其合并,但是发生的事情是最后一次sTime用于dgv的所有80个条目(如下例所示)或者如果我移动“}”括号围绕某些然后组合它们然后使用第一个sTime创建80个dgv条目,然后使用第二个sTime创建80个dgv条目。因此,不是在dgv中的80个条目,而是在它旁边的每个单独的sTime,最终在dgv 80x80中有6,400个条目。所以我不确定如何将这两个结合起来。

        var sLines = File.ReadAllLines("//dnc/WJ/MTI-WJ/" + cboPartProgram.Text)
             .Where(s => !s.StartsWith("'"))
             .Select(s => new
             {
                 SValue = Regex.Match(s, "(?<=S)[\\d.]*").Value
             })
             .ToArray();

        string lastSValue = "";
        foreach (var line in sLines)
        {
            string val = line.SValue == string.Empty ? lastSValue : line.SValue;
            lastSValue = val;
        }



            foreach (WjDwellOffsets offset in dwellTimes)
            {
                origionalDwellOffsets.Add(offset.dwellOffset);

                dgvDwellTimes.Rows.Add(new object[] { offset.positionId, lastSValue, offset.dwellOffset, 0, offset.dwellOffset, "Update", (offset.dateTime > new DateTime(1900, 1, 1)) ? offset.dateTime.ToString() : "" });
                DataGridViewDisableButtonCell btnCell = ((DataGridViewDisableButtonCell)dgvDwellTimes.Rows[dgvDwellTimes.Rows.Count - 1].Cells[5]);
                btnCell.Enabled = false;
            }

1 个答案:

答案 0 :(得分:1)

如果您唯一的条件是保留其中包含“S”的行,并且该数据样本表示整个行模式,那么这很简单(您可以使用Regex进一步过滤结果):

var sLines = File.ReadAllLines("filepath.txt")
                 .Where(s => !s.StartsWith("'") && s.Contains("S"))
                 .Select(s => new 
                 { 
                     LineNumber = Regex.Match(s, "^\\d*").Value,
                     SValue = Regex.Match(s, "(?<=S)[\\d.]*").Value
                 })
                 .ToArray();

// Use like this
foreach (var line in sLines)
{
    string num = line.LineNumber;
    string val = line.SValue;
}

要维护所有行,并且只是对某些行有相关信息,这个方法可能会有点调整,但它也需要一些外部处理。

var sLines = File.ReadAllLines("filepath.txt")
                 .Where(s => !s.StartsWith("'"))
                 .Select(s => new 
                 { 
                     LineNumber = Regex.Match(s, "^\\d*").Value,
                     SValue = Regex.Match(s, "(?<=S)[\\d.]*").Value
                 })
                 .ToArray();

// Use like this
string lastSValue = "";
foreach (var line in sLines)
{
    string num = line.LineNumber;
    string val = line.SValue == string.Empty ? lastSValue : line.SValue;

    // Do the stuff

    lastSValue = val;
}