Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# net中指定大小的多个csv文件的大型数据表_C#_.net_Csv_Filesplitting - Fatal编程技术网

C# net中指定大小的多个csv文件的大型数据表

C# net中指定大小的多个csv文件的大型数据表,c#,.net,csv,filesplitting,C#,.net,Csv,Filesplitting,我有一个包含数百万条记录的大型数据表。我需要将其导出到多个特定大小的CSV文件中。例如,我选择文件大小为5MB,当我说导出时,Datatable将导出为4个CSV文件,每个文件大小为5MB,最后一个文件大小可能会因剩余记录的不同而不同。我在这里介绍了许多解决方案,也查看了csvhelper库,但所有处理大型文件的处理都会被拆分为多个CSV,而不是内存中的数据表,根据指定的文件大小将其拆分为多个CSV文件。我想用C#做这件事。这方面的任何帮助都将是巨大的 谢谢 Jay感谢@H.G.Sandhage

我有一个包含数百万条记录的大型数据表。我需要将其导出到多个特定大小的CSV文件中。例如,我选择文件大小为5MB,当我说导出时,Datatable将导出为4个CSV文件,每个文件大小为5MB,最后一个文件大小可能会因剩余记录的不同而不同。我在这里介绍了许多解决方案,也查看了csvhelper库,但所有处理大型文件的处理都会被拆分为多个CSV,而不是内存中的数据表,根据指定的文件大小将其拆分为多个CSV文件。我想用C#做这件事。这方面的任何帮助都将是巨大的

谢谢
Jay

感谢@H.G.Sandhagen和@jdweng的投入。目前,我已经编写了以下代码来完成所需的工作。我知道它并不完美,如果我们能够像Nick.McDermaid指出的那样预先确定数据表项数组的长度,肯定可以做一些增强,并且可以提高效率。从现在起,我将用这段代码来解锁我自己,并在编码后发布最终的优化版本

public void WriteToCsv(DataTable table, string path, int size)
        {
            int fileNumber = 0;
            StreamWriter sw = new StreamWriter(string.Format(path, fileNumber), false);
            //headers  
            for (int i = 0; i < table.Columns.Count; i++)
            {
                sw.Write(table.Columns[i]);
                if (i < table.Columns.Count - 1)
                {
                    sw.Write(",");
                }
            }
            sw.Write(sw.NewLine);

            foreach (DataRow row in table.AsEnumerable())
            {
                sw.WriteLine(string.Join(",", row.ItemArray.Select(x => x.ToString())));
                if (sw.BaseStream.Length > size) // Time to create new file!
                {
                    sw.Close();
                    sw.Dispose();
                    fileNumber ++;
                    sw = new StreamWriter(string.Format(path, fileNumber), false);
                }
            }

            sw.Close();
        }
public void WriteToCsv(数据表、字符串路径、整数大小)
{
int fileNumber=0;
StreamWriter sw=新StreamWriter(string.Format(路径、文件号),false);
//标题
for(int i=0;ix.ToString()));
if(sw.BaseStream.Length>size)//创建新文件的时间到了!
{
sw.Close();
sw.Dispose();
fileNumber++;
sw=新StreamWriter(string.Format(路径、文件号),false);
}
}
sw.Close();
}

感谢@H.G.Sandhagen和@jdweng的投入。目前,我已经编写了以下代码来完成所需的工作。我知道它并不完美,如果我们能够像Nick.McDermaid指出的那样预先确定数据表项数组的长度,肯定可以做一些增强,并且可以提高效率。从现在起,我将用这段代码来解锁我自己,并在编码后发布最终的优化版本

public void WriteToCsv(DataTable table, string path, int size)
        {
            int fileNumber = 0;
            StreamWriter sw = new StreamWriter(string.Format(path, fileNumber), false);
            //headers  
            for (int i = 0; i < table.Columns.Count; i++)
            {
                sw.Write(table.Columns[i]);
                if (i < table.Columns.Count - 1)
                {
                    sw.Write(",");
                }
            }
            sw.Write(sw.NewLine);

            foreach (DataRow row in table.AsEnumerable())
            {
                sw.WriteLine(string.Join(",", row.ItemArray.Select(x => x.ToString())));
                if (sw.BaseStream.Length > size) // Time to create new file!
                {
                    sw.Close();
                    sw.Dispose();
                    fileNumber ++;
                    sw = new StreamWriter(string.Format(path, fileNumber), false);
                }
            }

            sw.Close();
        }
public void WriteToCsv(数据表、字符串路径、整数大小)
{
int fileNumber=0;
StreamWriter sw=新StreamWriter(string.Format(路径、文件号),false);
//标题
for(int i=0;ix.ToString()));
if(sw.BaseStream.Length>size)//创建新文件的时间到了!
{
sw.Close();
sw.Dispose();
fileNumber++;
sw=新StreamWriter(string.Format(路径、文件号),false);
}
}
sw.Close();
}

我有一个类似的问题,这就是我如何用CsvHelper解决它的

答案可以很容易地调整为使用DataTable作为源

public void SplitCsvTest()
{

  var inventoryRecords = new List<InventoryCsvItem>();

  for (int i = 0; i < 100000; i++)
  {
    inventoryRecords.Add(new InventoryCsvItem { ListPrice = i + 1, Quantity = i + 1 });
  }

  const decimal MAX_BYTES = 5 * 1024 * 1024; // 5 MB

  List<byte[]> parts = new List<byte[]>();

  using (var memoryStream = new MemoryStream())
  {
    using (var streamWriter = new StreamWriter(memoryStream))
    using (var csvWriter = new CsvWriter(streamWriter))
    {
      csvWriter.WriteHeader<InventoryCsvItem>();
      csvWriter.NextRecord();

      csvWriter.Flush();
      streamWriter.Flush();

      var headerSize = memoryStream.Length;
      foreach (var record in inventoryRecords)
      {

        csvWriter.WriteRecord(record);
        csvWriter.NextRecord();

        csvWriter.Flush();
        streamWriter.Flush();

        if (memoryStream.Length > (MAX_BYTES - headerSize))
        {
          parts.Add(memoryStream.ToArray());

          memoryStream.SetLength(0);
          memoryStream.Position = 0;

          csvWriter.WriteHeader<InventoryCsvItem>();
          csvWriter.NextRecord();
        }
      }

      if (memoryStream.Length > headerSize)
      {
        parts.Add(memoryStream.ToArray());
      }
    }


  }

  for(int i = 0; i < parts.Count; i++)
  {
    var part = parts[i];

    File.WriteAllBytes($"C:/Temp/Part {i + 1} of {parts.Count}.csv", part);
  }
}
public void SplitCsvTest()
{
var inventoryRecords=新列表();
对于(int i=0;i<100000;i++)
{
Add(新的InventoryCsvItem{ListPrice=i+1,Quantity=i+1});
}
常量十进制最大字节数=5*1024*1024;//5 MB
列出零件=新列表();
使用(var memoryStream=new memoryStream())
{
使用(var streamWriter=新streamWriter(memoryStream))
使用(var csvWriter=新的csvWriter(streamWriter))
{
csvWriter.WriteHeader();
csvWriter.NextRecord();
csvWriter.Flush();
streamWriter.Flush();
var headerSize=内存流长度;
foreach(inventoryRecords中的var记录)
{
CSV编写器写入记录(记录);
csvWriter.NextRecord();
csvWriter.Flush();
streamWriter.Flush();
if(memoryStream.Length>(最大字节数-headerSize))
{
parts.Add(memoryStream.ToArray());
memoryStream.SetLength(0);
memoryStream.Position=0;
csvWriter.WriteHeader();
csvWriter.NextRecord();
}
}
如果(memoryStream.Length>headerSize)
{
parts.Add(memoryStream.ToArray());
}
}
}
对于(int i=0;i
我有一个类似的问题,这就是我如何用CsvHelper解决它的

答案可以很容易地调整为使用DataTable作为源

public void SplitCsvTest()
{

  var inventoryRecords = new List<InventoryCsvItem>();

  for (int i = 0; i < 100000; i++)
  {
    inventoryRecords.Add(new InventoryCsvItem { ListPrice = i + 1, Quantity = i + 1 });
  }

  const decimal MAX_BYTES = 5 * 1024 * 1024; // 5 MB

  List<byte[]> parts = new List<byte[]>();

  using (var memoryStream = new MemoryStream())
  {
    using (var streamWriter = new StreamWriter(memoryStream))
    using (var csvWriter = new CsvWriter(streamWriter))
    {
      csvWriter.WriteHeader<InventoryCsvItem>();
      csvWriter.NextRecord();

      csvWriter.Flush();
      streamWriter.Flush();

      var headerSize = memoryStream.Length;
      foreach (var record in inventoryRecords)
      {

        csvWriter.WriteRecord(record);
        csvWriter.NextRecord();

        csvWriter.Flush();
        streamWriter.Flush();

        if (memoryStream.Length > (MAX_BYTES - headerSize))
        {
          parts.Add(memoryStream.ToArray());

          memoryStream.SetLength(0);
          memoryStream.Position = 0;

          csvWriter.WriteHeader<InventoryCsvItem>();
          csvWriter.NextRecord();
        }
      }

      if (memoryStream.Length > headerSize)
      {
        parts.Add(memoryStream.ToArray());
      }
    }


  }

  for(int i = 0; i < parts.Count; i++)
  {
    var part = parts[i];

    File.WriteAllBytes($"C:/Temp/Part {i + 1} of {parts.Count}.csv", part);
  }
}
public void SplitCsvTest()
{
var inventoryRecords=新列表();
对于(int i=0;i<100000;i++)
{
Add(新的InventoryCsvItem{ListPrice=i+1,Quantity=i+1});
}
常量十进制最大字节数=5*1024*1024;//5 MB
列出零件=新列表();
使用(var memoryStream=new memoryStream())
{
使用(var streamWriter=新streamWriter(memoryStream))
使用(var csvWriter=新的csvWriter(streamWriter))
{
csvWriter.WriteHeader();
csvWriter.NextRecord();
csvWriter.Flush();
streamWriter.Flush();
var headerSize=内存流长度;
foreach(inventoryRecords中的var记录)
{
CSV编写器写入记录(记录);
csvWriter.NextRecord();
csvWriter.Flush();
斯特里亚