2010-09-21 5 views
3

Я пытаюсь вставить CSV-файл в SQL Server 2008 R2.Как навалом Вставить csv с двойными кавычками вокруг всех значений?

. CSV 300+ MB от http://ipinfodb.com/ip_database.php Завершить (Город), 4.0M записи.

Here're верхние 5 строк, с 1-й линии = заголовки столбцов:

"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? может ли он обрабатывать снятие ""? как?

спасибо.

+0

... или вы можете заменить регулярное выражение на stri p out двойные кавычки ... –

+0

файл слишком велик, навсегда вычеркнет – Henry

+0

Если вы хотите пройти этот маршрут, вы можете открыть его в реальном текстовом редакторе, таком как Textpad или Ultraedit, и выполнить поиск/замену на кавычки заменяя их пустой строкой. Я работал с файлами 180 Мбайт, используя эти утилиты, и это было безболезненно - вы могли бы сделать это. – Mayo

ответ

5

Понял, забыл установить Text Qualifier в ":

enter image description here

0

Это один импорт или вы хотите запланировать повторяющийся импорт? Если это одноразовая задача, вы должны иметь возможность использовать мастер импорта и экспорта. Текст отборочные будет кавычка ("), не забудьте выбрать имена столбцов в первой строке данных, и вы хотите передать, что поле разделителем является точка с запятой (;).

Я m не уверен, что файл правильно отформатирован - последняя точка с запятой, следующая за каждой из строк данных, может быть проблемой. Если вы нажмете на какие-либо ошибки, просто добавьте в файл новый заголовок столбца.

EDIT: Я просто сделал быстрый test, точки с запятой в конце будут рассматриваться как часть окончательного значения в этой строке. Я бы предложил добавить «tempheader» в конце строки заголовка (первой) - это заставит SQL обрабатывать конечную точку с запятой как разделитель, и вы можете удалить этот дополнительный столбец после завершения импорта.

+0

Я попробую снова импортировать и экспортировать Wizard снова, но он продолжал сбой раньше сегодня. – Henry

1

Ваши данные выглядят довольно несовместимыми, поскольку значения NULL также не содержат предложение.

Я считаю, что вы можете создать файл формата для настройки в вашем конкретном файле csv и его конкретных терминаторах в SQL SERVER.

Подробнее здесь: http://lanestechblog.blogspot.com/2008/08/sql-server-bulk-insert-using-format.html

0

В 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; 
    } 
Смежные вопросы