此代码对序号位置为 12 的当事方名称应用分组
group line by line[12] into newGroup
现在我想知道如何在序数位置为 0 表示line[0]
的多个字段上应用 group
line[0]
将同时具有日期和时间。 我只是喜欢按时间部分分组。 这样我就可以提取时间部分
DateTime.Parse(line[0].Substring(line[0].Length-8))
var csvlines = File.ReadAllLines(@"M:smdr(backup08-06-2015).csv");
var csvLinesData = csvlines.Skip(1).Select(l => l.Split(',').ToArray());
var groupOfUser = from line in csvLinesData
group line by line[12] into newGroup
orderby newGroup.Key
select newGroup;
var user = (from userOfGrp in groupOfUser
select
new User()
{
CSRName = userOfGrp.Key,
Incomming = userOfGrp.Count(x => x[4] == "I"),
Outgoing = userOfGrp.Count(x => x[4] == "O")
}).ToList();
1)只需帮助我在多个字段上进行分组,一个是行[12],另一个是行[0]2)line[0]
将有日期和时间部分,例如"2015/06/08 07:59:12",我必须仅在line[0]
的时间部分应用组
编辑 1
此行group r by new { prop1 = r[12], ((DateTime)r[0]).TimeOfDay } into g
引发错误 无法将类型"字符串"转换为"系统.日期时间"
void Main()
{
var csvlines = File.ReadAllLines(@"c:smdr.csv");
var csvLinesData = csvlines.Skip(1).Select(l => l.Split(',').ToArray());
var csvData = csvLinesData.Where(l => (l[6] != "VM Channel" && l[6] != "Voice Mail")).ToArray();
var user = (from r in csvData
group r by new { prop1 = r[12], Time = ((DateTime)r[0]).TimeOfDay } into g
orderby g.Count()
select new User
{
CSRName=g.Key,
Incomming=(from r1 in g
where r1[3]=="I"
select r1).Count(),
outgoing = (from r1 in g
where r1[3] == "O"
select r1).Count()
}).ToList();
}
class User
{
public string CSRName;
public int outgoing;
public int Incomming;
}
如果我很了解你,你需要这个:
from line in csvLinesData
group line by new
{
prop1 = line[12],
Time = DateTime.Parse(line[0]).TimeOfDay
} into newGroup
orderby newGroup.Key.prop1, newGroup.Key.Time
select newGroup;
由于line[0]
显然是一个字符串,因此您必须将其解析为DateTime
值。我展示了最简单的方法来做到这一点,但也许你应该构建一些更安全的东西,因为不是每个字符串都可以解析为DateTime
。但这超出了这个问题的范围。
请注意,匿名类型具有命名属性,您可能希望重命名prop1
。