使用LINQ读取分隔文件

时间:2011-03-15 19:25:44

标签: c# linq .net-4.0

以下LINQ读取分隔文件。目前,它只输出recordId。我希望它输出文件中的所有字段,以便我可以对数据执行一些额外的LINQ操作。例如,我想按记录ID分组,按日期排序,然后取(x)结果。

  1. 我希望返回csv中的所有字段。我是否需要对变量进行decalre并设置使用索引值,就像我对FirstName,LastName和recordId所做的那样?没什么大不了的,但还有更好的方法吗?

  2. 我尝试删除return语句并使用new进行投影但不起作用。

  3. 有什么建议吗?

    谢谢!

    var recipients = File.ReadAllLines(path)
    .Select (record => 
    {
    string[] tokens = record.Split('|');
    
    string FirstName = tokens[2];
    string LastName = tokens[4];
    string recordId = tokens[13];
    
    return recordId;
    }
    )
    .GroupBy (recordId => {return recordId; } )
    .Dump();
    

5 个答案:

答案 0 :(得分:5)

将您的Select()项目更改为包含所需属性的匿名类型:

.Select (record => 
{
  string[] tokens = record.Split('|');

  string FirstName = tokens[2];
  string LastName = tokens[4];
  string recordId = tokens[13];

  return  new { RecordId = recordId, FirstName, LastName };
}

你也可以改写这个更多的succint:

File.ReadAllLines(path)
    .Select(record  => record.Split('|'))
    .Select(tokens => new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] })
    .GroupBy(x => x.RecordId)
    .Dump();

答案 1 :(得分:0)

var query = from l in lines选择创建自定义类型,然后你可以对其他任何内容进行分组{来自查询.....}

答案 2 :(得分:0)

注意 - 我实际上并不确定你在“分组”中想要实现的目标 - 你真的希望按ID分组吗?或者这也是OrderBy?

我认为你可以使用匿名类型实现你想要的东西,例如:

var recipients = File.ReadAllLines(path)
    .Select(record => record.Split('|'))
    .Select(split => new { 
         TheDate = Date.Parse(tokens[0]), // this might be the wrong index?
         FirstName = tokens[2], 
         LastName = tokens[4],
         RecordId = tokens[13],
    }) 
    .OrderBy(anon => anon.TheDate)
    .Dump();

如果您想使用实际类型,那么Jon Skeet的这篇文章可能有助于作为背景 - http://www.developerfusion.com/article/84468/linq-to-log-files/

答案 3 :(得分:0)

BrokenGlass已经回答了这个问题,但我只想指出这种语法看起来更干净(至少对我而言):

var recipients = File.ReadAllLines(path)
.Select(record => record.Split('|'))
.Select (tokens => 
    new {
        FirstName = tokens[2],
        LastName = tokens[4],
        recordId = tokens[5]
    }
)
.GroupBy(person => person.recordId )
.Dump();

这里并不需要带有语句块的lambdas。

答案 4 :(得分:0)

我会补充:

var recipients = (from record in File.ReadAllLines(path)
    let tokens = record.Split('|')
    let record2 = new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] }
    group record2 by record2.RecordId
).Dump();

在LINQ非功能语法中。

我将添加另一个变种,它使用select ... into代替let

var recipients = (from record in File.ReadAllLines(path)
    select record.Split('|') into tokens
    select new { RecordId = tokens[13], FirstName = tokens[2], LastName = tokens[4] } into record2
    group record2 by record2.RecordId
).Dump();

你需要对它们进行基准测试以找到最快的(它肯定会很有趣......明天早上我会试试)