Как Массовая Вставка CSV с двойными кавычками вокруг всех значений? - PullRequest
3 голосов
/ 21 сентября 2010

Я пытаюсь вставить файл .csv в SQL Server 2008 R2.

.csv равен 300 + МБ из http://ipinfodb.com/ip_database.php Завершено (Город), 4,0 млн записей.

Вот первые 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? может ли справиться с зачисткой ""? как?

Большое спасибо.

Ответы [ 4 ]

5 голосов
/ 21 сентября 2010

Понял, забыл установить Текстовый классификатор как ":

enter image description here

1 голос
/ 21 сентября 2010

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

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

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

0 голосов
/ 31 мая 2014

В 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;
    }
0 голосов
/ 21 сентября 2010

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

Я не уверен, что файл правильно отформатирован - последняя точка с запятой после каждой строки данных может быть проблемой. Если вы нажмете какие-либо ошибки, просто добавьте новый заголовок столбца в файл.* РЕДАКТИРОВАТЬ: я только что сделал быстрый тест, точки с запятой в конце будут рассматриваться как часть окончательного значения в этой строке. Я бы предложил добавить "tempheader" в конце строки вашего (первого) заголовка - это будетзаставьте SQL интерпретировать последнюю точку с запятой как разделитель, и вы можете удалить этот дополнительный столбец после завершения импорта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...