8

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

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

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

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

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

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

  • SQL Express
  • SQL 紧凑型
  • 本地 SQL Server 数据库

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

谢谢你的帮助。

4

4 回答 4

7

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

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

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

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

于 2013-08-19T13:54:26.903 回答
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
    }
}
于 2013-08-19T19:32:23.280 回答
1

您可以在 C# 中使用 SQLBulkImporter 对象。奇迹般有效。

于 2013-08-19T15:23:10.450 回答
1

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

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

于 2013-08-19T12:59:18.777 回答