如何将巨大的.csv导入sql数据库?

时间:2013-08-19 12:56:51

标签: c# sql

我想将大约1 gig的巨大.csv文件导入数据库。

我的应用程序在visual studio 2010中以c#编码。它在本地运行,不需要在网络上使用。

我尝试使用sql compact工具箱脚本仅导入25mb会导致Visual Studio崩溃。

我尝试使用stringbuilder导致内存不足异常(使用大约4 GB的内存!)然后失败。

我尝试将这些文件导入Excel或Access,然后将它们转换为数据库也失败了。

哪些数据库可以更好地解决我的问题?

  • SQL Express
  • SQL Compact
  • 本地SQL Server数据库

另外,我应该使用哪种方法尽快导入它并将其加载到datagridview中?

感谢您的帮助。

4 个答案:

答案 0 :(得分:6)

如果CSV文件没有包含逗号的任何字符串,您可以从SQL直接BULK INSERT(如果是,则必须将分隔符更改为类似栏(|) )字符,首先。这是从平面文件到数据库获取数据的最直接方法,不需要任何中间程序,如SSIS或Excel

我经常使用它,它是从外部将数据导入SQL的最快速,最有效的方法。您的命令看起来像

BULK INSERT MyDatabase.dbo.MyTable 
      FROM MyFileName
           DATAFILETYPE='char',  
           FIELDTERMINATOR=',',
           BATCHSIZE=10000

最常见的策略是将数据加载到工作表中,进行必要的清理/转换,然后将其插入到实际的目标表中。

答案 1 :(得分:5)

如果您真的想使用C#实现这一目标,那么您需要做的是逐行读取CSV并在移动到下一个之前插入它。

我有类似的情况,我必须阅读2GB“CSV”(标签分隔)并加载到MSSQL。这是我如何设置它。

using (FileStream fs = new FileStream(@"C:\file.csv", FileMode.Open, FileAccess.Read, FileShare.None))
using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding(1252)))
{
    if (sr.ReadLine() == null) //Take this out if you don't have a header
    {
        throw new Exception("Empty file?!");
    }

    while (sr.Peek() >= 0)
    {
          String s = sr.ReadLine();

          //SPLIT

          //INSERT SQL
    }
}

答案 2 :(得分:1)

SQL Express和标准SQL Server都是您存储的理想选择。至于用于导入数据的内容,请使用SSIS。在SQL Express或Standard SQL Server实例上创建数据库后,右键单击该数据库,在Tasks菜单项下,您将看到Import Data的选项。它将引导您选择数据源,在您的情况下为Excel,然后将其导入数据库。

然后,在此过程结束时,可以保存此脚本。

答案 3 :(得分:1)

您可以在C#中使用SQLBulkImporter对象。 像魅力一样。