很久以前写过一个应用程序的请求,他们希望现有数据网格视图中的另一列具有当前的钻取时间。这些时间来自机器读取和运行的文件。下面是一个文件示例。
现在寻找的数字是带有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;
}
答案 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;
}