【问题标题】:CsvHelper - Split output files [duplicate]CsvHelper - 拆分输出文件[重复]
【发布时间】:2020-04-25 17:55:02
【问题描述】:

我正在使用 Csv Helper 编写一个包含数百万行的 Linq 查询。例如,我想将输出拆分为 100 万行。我可以这样做还是应该使用其他类型的写作方法?

这是我的代码:

var _path = UniversalVariables.outputCsvFiles + "entire_output.csv"; 

var pvQuery = from car in Cars 
              select car;


if (!Directory.Exists(UniversalVariables.outputCsvFiles))
{
    Directory.CreateDirectory(UniversalVariables.outputCsvFiles);
}

using (var sw = new StreamWriter(_path))
using (var csv = new CsvWriter(sw))
{
    csv.Configuration.Delimiter = UniversalVariables.csvDelimiter;
    csv.Configuration.HasHeaderRecord = true;

    csv.WriteHeader<Car>();
    csv.NextRecord();
    csv.WriteRecords(pvQuery);

    sw.Flush();
}

【问题讨论】:

标签: c# .net linq csvhelper


【解决方案1】:

您可以使用 Linq 将集合拆分为子集合(大小为 n 的块)。例如

pvQuery.Select((x,index)=>new {Value=x,Index=index})
              .GroupBy(x=>(int)(x.Index/numberOfItemsPerGroup))
              .Select(x=>x.Select(c=>c.Value));

使其成为扩展方法

static class Extensions
{
    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, int numberOfItemsPerGroup)
    {
        return source.Select((x,index)=>new {Value=x,Index=index})
              .GroupBy(x=>(int)(x.Index/numberOfItemsPerGroup))
              .Select(x=>x.Select(c=>c.Value));

    }
}

客户端代码

SourceCollection.Split(numberOfItemsPerGroup);

【讨论】:

  • 在这种情况下,我是否应该修改编写 CSV 的方式,例如将 CSV.WriteRecord 放在 foreach 循环中(遍历 LINQ)?关键是每个文件块的文件名都会不同。
  • @FelipeCabralJerônimo 是的,您可以循环收集并编写 csv
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2023-02-19
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
相关资源
最近更新 更多