【问题标题】:How to Bulk Insert csv with double quotes around all values?如何在所有值周围使用双引号批量插入 csv?
【发布时间】:2010-09-21 00:46:17
【问题描述】:

我正在尝试将 .csv 文件插入 SQL Server 2008 R2。

.csv 为 300+MB,来自 http://ipinfodb.com/ip_database.php 完成 (城市),400 万条记录。

这是前 5 行,第一行 = 列标题:

"ip_start";"country_code";"country_name";"region_code";"region_name";"city";"zipcode";"latitude";"longitude";"metrocode"
"0";"RD";"Reserved";;;;;"0";"0";
"16777216";"AU";"Australia";;;;;"-27";"133";
"17367040";"MY";"Malaysia";;;;;"2.5";"112.5";
"17435136";"AU";"Australia";;;;;"-27";"133";

我尝试了导入和导出数据以及 BULK INSERT,但还不能正确导入它们。

我应该使用 bcp 吗?它可以处理剥离"" 吗?怎么样?

非常感谢。

【问题讨论】:

  • ...或者您可以使用正则表达式替换去除双引号...
  • 文件太大,需要很长时间才能删除
  • 如果你想走这条路,你可以在真正的文本编辑器中打开它,比如 Textpad 或 Ultraedit,然后在引号上执行查找/替换,用空字符串替换它们。我使用这些实用程序处理了 180MB 的文件,而且很轻松 - 你可以试一试。

标签: sql-server sql-server-2008 csv bulkinsert


【解决方案1】:

知道了,忘记将 Text Qualifier 设置为 ":

【讨论】:

    【解决方案2】:

    您的数据看起来非常不一致,因为 NULL 值也不带有引号。

    我相信您可以创建一个格式文件来自定义您的特定 csv 文件及其在 SQL SERVER 中的特定终止符。

    在此处查看更多信息: http://lanestechblog.blogspot.com/2008/08/sql-server-bulk-insert-using-format.html

    【讨论】:

      【解决方案3】:

      这是单次导入还是您要安排定期导入?如果这是一次性任务,您应该能够使用导入和导出向导。文本限定符将是引号 ("),请务必选择 第一个数据行中的列名,并且您需要传达字段分隔符是分号 (;)。

      我不确定文件的格式是否正确 - 每个数据行后面的最后一个分号可能有问题。如果遇到任何错误,只需在文件中添加一个新的列标题即可。

      编辑:我刚刚做了一个快速测试,最后的分号将被视为该行中最终值的一部分。我建议在标题(第一)行的末尾添加一个 ;"tempheader" - 这将导致 SQL 将最后的分号视为分隔符,并且您可以在导入完成后删除该额外的列。

      【讨论】:

      • 我明天会再次尝试导入和导出向导,但它今天早些时候一直崩溃。
      【解决方案4】:

      在 C# 中,您可以使用此代码,为我工作

       public bool CSVFileRead(string fullPathWithFileName, string fileNameModified, string tableName)
          {
              SqlConnection con = new SqlConnection(ConfigurationSettings.AppSettings["dbConnectionString"]);
              string filepath = fullPathWithFileName;
              StreamReader sr = new StreamReader(filepath);
              string line = sr.ReadLine();
              string[] value = line.Split(',');
              DataTable dt = new DataTable();
              DataRow row;
              foreach (string dc in value)
              {
                  dt.Columns.Add(new DataColumn(dc));
              }
              while (!sr.EndOfStream)
              {
                  //string[] stud = sr.ReadLine().Split(',');
                  //for (int i = 0; i < stud.Length; i++)
                  //{
                  //    stud[i] = stud[i].Replace("\"", "");
                  //}
                  //value = stud;
                  value = sr.ReadLine().Split(',');
                  if (value.Length == dt.Columns.Count)
                  {
                      row = dt.NewRow();
                      row.ItemArray = value;
                      dt.Rows.Add(row);
                  }
              }
              SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
              bc.DestinationTableName = tableName;
              bc.BatchSize = dt.Rows.Count;
              con.Open();
              bc.WriteToServer(dt);
              bc.Close();
              con.Close();
      
              return true;
          }
      

      【讨论】:

        猜你喜欢
        • 2011-04-03
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        • 1970-01-01
        • 2019-02-15
        • 1970-01-01
        相关资源
        最近更新 更多