Ответ 1
Я знаю, что это не настоящее решение, но я использую фиктивную таблицу для импорта с набором nvarchar для всего. Затем я делаю вставку, которая удаляет символы и выполняет преобразования. Это не очень хорошо, но это делает работу.
Мне нужно импортировать большой 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) ужасно бесполезна.
Я знаю, что это не настоящее решение, но я использую фиктивную таблицу для импорта с набором nvarchar для всего. Затем я делаю вставку, которая удаляет символы и выполняет преобразования. Это не очень хорошо, но это делает работу.
Попробуйте FIELDTERMINATOR='","'
Вот отличная ссылка, чтобы помочь с первой и последней цитатой... посмотрите, как он использовал подстроку SP
http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file
Еще один хак, который я иногда использую, - это открыть CSV в Excel, а затем написать инструкцию sql в ячейку в конце каждой строки. Например:
=concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")")
Заполнение может заполнить это в каждую строку для вас. Затем просто скопируйте и вставьте вывод в новое окно запроса.
Это старая школа, но если вам нужно только делать импорт время от времени, это экономит вас на том, чтобы читать всю неясную документацию по "правильному" способу сделать это.
Попробуйте OpenRowSet. Это можно использовать для импорта файлов Excel. Excel может открывать CSV файлы, поэтому вам нужно только выяснить правильную [ConnectionString] [2].
[2]: Driver = {Microsoft Text Driver (*.txt; *.csv)}; Dbq = c:\txtFilesFolder \; Extensions = asc, csv, tab, txt;
Id говорит, что FileHelpers использует библиотеку с открытым исходным кодом
Вам нужно сделать это программно или это одноразовый снимок?
Используя Enterprise Manager, щелкните правой кнопкой мыши Import Data, чтобы выбрать разделитель.
Вы должны следить за BCP/BULK INSERT, потому что ни BSP, ни Bulk Insert не обрабатывают это хорошо, если цитирование несовместимо, даже с файлами формата (даже файлы формата XML не предлагают вариант) и фиктивный [ "] символы в начале и конце и используя [", "] в качестве разделителя. Технически CSV файлы не должны иметь [" ] символов, если нет встроенных символов [,]
Именно по этой причине файлы с разделителями-запятыми иногда называются файлами с ограниченной комедией.
OpenRowSet потребует Excel на сервере и может быть проблематичным в 64-разрядных средах - я знаю, что это проблема с использованием Excel в Jet в 64-разрядной версии.
SSIS действительно лучше всего, если файл, вероятно, будет отличаться от ваших ожиданий в будущем.
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 **' %" '**
Чтобы импортировать 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);
}
}
}
}
}
Yup, K Richard прав: FIELDTERMINATOR = '","'
Подробнее см. http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file.
Вы также можете использовать DTS или SSIS.
У вас есть контроль над форматом ввода? | (трубы), и \t обычно делают для лучших терминаторов поля.
Если вы выясните, как получить файл, обработанный в DataTable, я бы предложил класс SqlBulkInsert для его вставки в SQL Server.
Это старый вопрос, поэтому я пишу это, чтобы помочь любому, кто наткнется на него.
SQL Server 2017 вводит параметр FIELDQUOTE, который предназначен для этого конкретного случая использования.