Подтвердить что ты не робот

Объемный импорт SQL из CSV

Мне нужно импортировать большой CSV файл в SQL-сервер. Я использую это:

BULK 
INSERT CSVTest
        FROM 'c:\csvfile.txt'
            WITH
    (
                FIELDTERMINATOR = ',',
                ROWTERMINATOR = '\n'
    )
GO

проблема заключается в том, что все мои поля окружены кавычками (""), поэтому строка выглядит следующим образом:

"1","","2","","sometimes with comma , inside", "" 

Могу ли я каким-то образом импортировать их и сказать SQL, чтобы использовать кавычки как разделители полей?

Изменить. Проблема с использованием "," как разделителя", как в приведенных примерах, заключается в следующем:  В большинстве примеров они импортируют данные, в том числе первые "в первом столбце и последние" в последнем, затем они идут вперед и снимают это. Увы, мой первый (и последний) столбец datetime и не позволит импортировать 20080902 как дату и время.

Из того, что я читал arround, я думаю, что FORMATFILE - это путь, но документация (включая MSDN) ужасно бесполезна.

4b9b3361

Ответ 1

Я знаю, что это не настоящее решение, но я использую фиктивную таблицу для импорта с набором nvarchar для всего. Затем я делаю вставку, которая удаляет символы и выполняет преобразования. Это не очень хорошо, но это делает работу.

Ответ 3

Еще один хак, который я иногда использую, - это открыть CSV в Excel, а затем написать инструкцию sql в ячейку в конце каждой строки. Например:

=concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")")

Заполнение может заполнить это в каждую строку для вас. Затем просто скопируйте и вставьте вывод в новое окно запроса.

Это старая школа, но если вам нужно только делать импорт время от времени, это экономит вас на том, чтобы читать всю неясную документацию по "правильному" способу сделать это.

Ответ 4

Попробуйте OpenRowSet. Это можно использовать для импорта файлов Excel. Excel может открывать CSV файлы, поэтому вам нужно только выяснить правильную [ConnectionString] [2].

[2]: Driver = {Microsoft Text Driver (*.txt; *.csv)}; Dbq = c:\txtFilesFolder \; Extensions = asc, csv, tab, txt;

Ответ 5

Id говорит, что FileHelpers использует библиотеку с открытым исходным кодом

Ответ 6

Вам нужно сделать это программно или это одноразовый снимок?

Используя Enterprise Manager, щелкните правой кнопкой мыши Import Data, чтобы выбрать разделитель.

Ответ 7

Вы должны следить за BCP/BULK INSERT, потому что ни BSP, ни Bulk Insert не обрабатывают это хорошо, если цитирование несовместимо, даже с файлами формата (даже файлы формата XML не предлагают вариант) и фиктивный [ "] символы в начале и конце и используя [", "] в качестве разделителя. Технически CSV файлы не должны иметь [" ] символов, если нет встроенных символов [,]

Именно по этой причине файлы с разделителями-запятыми иногда называются файлами с ограниченной комедией.

OpenRowSet потребует Excel на сервере и может быть проблематичным в 64-разрядных средах - я знаю, что это проблема с использованием Excel в Jet в 64-разрядной версии.

SSIS действительно лучше всего, если файл, вероятно, будет отличаться от ваших ожиданий в будущем.

Ответ 8

u можете попробовать этот код, который очень сладкий, если вы хотите, это приведет к удалению ненужных точек с запятой из вашего кода. если, например, ваши данные выглядят так:
"Келли", "Рейнольд", "[email protected]"

Bulk insert test1
from 'c:\1.txt' with ( 
    fieldterminator ='","'
    ,rowterminator='\n')

update test1<br>
set name =Substring (name , 2,len(name))
where name like **' "% '**

update test1
set email=substring(email, 1,len(email)-1)
where email like **' %" '**

Ответ 9

Чтобы импортировать CSV файл в таблицу данных

Затем вы можете вставлять массивы строк с помощью SQLBulkCopy

using System;
using System.Data;
using System.Data.SqlClient;

namespace SqlBulkInsertExample
{
    class Program
    {
      static void Main(string[] args)
        {
            DataTable prodSalesData = new DataTable("ProductSalesData");

            // Create Column 1: SaleDate
            DataColumn dateColumn = new DataColumn();
            dateColumn.DataType = Type.GetType("System.DateTime");
            dateColumn.ColumnName = "SaleDate";

            // Create Column 2: ProductName
            DataColumn productNameColumn = new DataColumn();
            productNameColumn.ColumnName = "ProductName";

            // Create Column 3: TotalSales
            DataColumn totalSalesColumn = new DataColumn();
            totalSalesColumn.DataType = Type.GetType("System.Int32");
            totalSalesColumn.ColumnName = "TotalSales";

            // Add the columns to the ProductSalesData DataTable
            prodSalesData.Columns.Add(dateColumn);
            prodSalesData.Columns.Add(productNameColumn);
            prodSalesData.Columns.Add(totalSalesColumn);

            // Let populate the datatable with our stats.
            // You can add as many rows as you want here!

            // Create a new row
            DataRow dailyProductSalesRow = prodSalesData.NewRow();
            dailyProductSalesRow["SaleDate"] = DateTime.Now.Date;
            dailyProductSalesRow["ProductName"] = "Nike";
            dailyProductSalesRow["TotalSales"] = 10;

            // Add the row to the ProductSalesData DataTable
            prodSalesData.Rows.Add(dailyProductSalesRow);

            // Copy the DataTable to SQL Server using SqlBulkCopy
            using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;"))
            {
                dbConnection.Open();
                using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
                {
                    s.DestinationTableName = prodSalesData.TableName;

                    foreach (var column in prodSalesData.Columns)
                        s.ColumnMappings.Add(column.ToString(), column.ToString());

                    s.WriteToServer(prodSalesData);
                }
            }
        }
    }
}

Ответ 11

Вы также можете использовать DTS или SSIS.

Ответ 12

У вас есть контроль над форматом ввода? | (трубы), и \t обычно делают для лучших терминаторов поля.

Ответ 13

Если вы выясните, как получить файл, обработанный в DataTable, я бы предложил класс SqlBulkInsert для его вставки в SQL Server.

Ответ 14

Это старый вопрос, поэтому я пишу это, чтобы помочь любому, кто наткнется на него.

SQL Server 2017 вводит параметр FIELDQUOTE, который предназначен для этого конкретного случая использования.