0

我将 csv 文件读入列表。由于每个文件包含许多行且读取时间较长,因此我只需要检查每个文件的前 100 行。如何让 Linq 只读取前 100 行,然后继续读取下一个文件?

For(i=0;i<10;i++)
     line_list = (from line in File.ReadLines(files[i])
                  let field = line.Split(',')
                  where field[2] == "Apple" && !field[3].Contains("Banana")
                  select field).ToList();
4

3 回答 3

5

您可以使用Enumerable.Take只取前 100 行:

var first100Lines = File.ReadLines(path).Take(100);

对于它的价值,这里是一体的:

List<List<string[]>> allFileLineColumns = files
    .Select(fPath => 
        File.ReadLines(fPath)
            .Take(100)
            .Select(l => new { Line=l, Cols=l.Split(',') })
            .Where(x => x.Cols.Length >= 4 && x.Cols[2] == "Apple" && !x.Cols[3].Contains("Banana"))
            .Select(x => x.Cols)
            .ToList()
    ).ToList();

虽然我会将它分成多个部分以增加可读性。

于 2013-01-17T13:54:19.513 回答
0

这是 linq 的一个奇怪用例,但请尝试 take()...

For(i=0;i<10;i++)
     line_list = (from line in File.ReadLines(files[i]).Take(100)
                  let field = line.Split(',')
                  where field[2] == "Apple" && !field[3].Contains("Banana")
                  select field).ToList();
于 2013-01-17T13:54:30.143 回答
0

我认为您需要将结果连接到 line_list

          for(i=0; i<10; i++)
          {
              var fieldsList = from line in File.ReadLines(files[i])
                               let field = line.Split(',')
                               where field[2] == "Apple" && !field[3].Contains("Banana")
                               select field;

                line_list = line_list.Concat(fieldsList.Take(100).ToList()).ToList();
          }
于 2013-01-17T13:59:33.260 回答