读入列表并选择特定数字
Reading into list and picking specific numbers
一个很久以前写的应用程序的请求进来了,他们想要现有数据网格视图上的另一列具有当前钻孔时间。这些时间来自机器读取的文件和 运行。下面是一个文件示例。
现在要查找的数字是带有 S 的数字。现在,第一个数字是行号。行号也需要抓取,因为时间需要与行匹配。所以我必须将其读入列表,获取行号,然后获取相关的 "s" 时间编号。我会将这些 "s times" 添加到已有行号的现有 table 中,因此我会将这些 "s times" 添加到相应行号旁边的新列中。我有点卡在这里。
感谢任何帮助。
我知道我可以像这样阅读所有内容
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
...等等
现在,数据库中有一个程序table。有列
Program Line Time
Program1 1
Program1 2
Program1 3
Program1 4
等等
因此 "s" 次将添加到现有 table 的时间列中。但是从第1,2,3,4行等中取出的"s"次将与table.
的行列重合
因此,此示例中的最终结果将是
Program Line Time
Program1 1 2.75
Program1 2 2.5
Program1 3 2
更新
我不确定编辑后的代码是否可以覆盖 w/out sTime 行,因为我最近遇到了一个问题 运行。有一个数据网格视图从 sql 语句填充的列表中填充列。我为 sTime 添加了一列(事实证明我可能不需要行 # 所以你会注意到我删除了它)但是我需要将我的循环从 sTime 合并到正在填充的列表中发生的循环中dgv。现在我尝试以几种不同的方式合并它,但是发生的是最后一个 sTime 用于 dgv 的所有 80 个条目(如下例所示),或者如果我将“}”括号移动到一些然后将它们组合起来,然后使用第一个 sTime 创建 80 个 dgv 条目,然后使用第二个 sTime 创建 80 个 dgv 条目。因此,在 dgv 80x80 中,您最终会得到 6,400 个条目,而不是 dgv 中的每个单独的 sTime 条目。所以我不确定如何将这两个结合起来工作。
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;
}
如果您唯一的条件是保留其中包含 "S" 的行,并且如果该数据样本表示整体行模式,那么这非常简单(并且您可以使用正则表达式来进一步过滤您的结果):
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;
}
一个很久以前写的应用程序的请求进来了,他们想要现有数据网格视图上的另一列具有当前钻孔时间。这些时间来自机器读取的文件和 运行。下面是一个文件示例。
现在要查找的数字是带有 S 的数字。现在,第一个数字是行号。行号也需要抓取,因为时间需要与行匹配。所以我必须将其读入列表,获取行号,然后获取相关的 "s" 时间编号。我会将这些 "s times" 添加到已有行号的现有 table 中,因此我会将这些 "s times" 添加到相应行号旁边的新列中。我有点卡在这里。
感谢任何帮助。
我知道我可以像这样阅读所有内容
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
...等等
现在,数据库中有一个程序table。有列
Program Line Time
Program1 1
Program1 2
Program1 3
Program1 4
等等
因此 "s" 次将添加到现有 table 的时间列中。但是从第1,2,3,4行等中取出的"s"次将与table.
的行列重合因此,此示例中的最终结果将是
Program Line Time
Program1 1 2.75
Program1 2 2.5
Program1 3 2
更新
我不确定编辑后的代码是否可以覆盖 w/out sTime 行,因为我最近遇到了一个问题 运行。有一个数据网格视图从 sql 语句填充的列表中填充列。我为 sTime 添加了一列(事实证明我可能不需要行 # 所以你会注意到我删除了它)但是我需要将我的循环从 sTime 合并到正在填充的列表中发生的循环中dgv。现在我尝试以几种不同的方式合并它,但是发生的是最后一个 sTime 用于 dgv 的所有 80 个条目(如下例所示),或者如果我将“}”括号移动到一些然后将它们组合起来,然后使用第一个 sTime 创建 80 个 dgv 条目,然后使用第二个 sTime 创建 80 个 dgv 条目。因此,在 dgv 80x80 中,您最终会得到 6,400 个条目,而不是 dgv 中的每个单独的 sTime 条目。所以我不确定如何将这两个结合起来工作。
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;
}
如果您唯一的条件是保留其中包含 "S" 的行,并且如果该数据样本表示整体行模式,那么这非常简单(并且您可以使用正则表达式来进一步过滤您的结果):
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;
}