Stack Overflow на русском Asked by Andrey Sherman on February 9, 2021
Необходимо загрузить большой csv файл в БД (1,5 Гб). Пробовал делать построчную запись с помощью INSERT – это очень долго. 100 000 строк загружается примерно 2 минуты. В файле 120 000 000 строк. Прочитал, что можно использовать SQLBulkCopy и это будет в разы быстрее. Но вопрос в том, можно ли сделать загрузку CSV с разбивкой по столбцам? Например у меня в CSV Series и Number столбцы с разделителем “,”. Таблица тоже с двумя аналогичными столбцами. Есть какие-нибудь еще более быстрые способы загрузки или как сделать мапинг полей
string line = "";
string con_str = "server;Database=base;Trusted_Connection=True;";
using (SqlConnection connection = new SqlConnection(con_str))
{
connection.Open();
using (StreamReader file = new StreamReader(new BufferedStream(File.OpenRead(@"D:bzip2WriteLines.csv"), 10 * 1024 * 1024)))
{
//string table = "ElmaBadPassport";
while ((line = file.ReadLine()) != null)
{
if (line.Length == 11)
{ string[] values = line.Split(',');
SqlCommand cmd = new SqlCommand("Insert INTO ElmaBadPassport(Series,Number) VALUES (@series, @number)",connection);
cmd.Parameters.AddWithValue("@series",values[0].ToString());
cmd.Parameters.AddWithValue("@Number", values[1].ToString());
cmd.ExecuteNonQuery();
//Console.WriteLine(cmd.ExecuteNonQuery());
}
}
}
connection.Close();
}
Для однократного решения задачи я рекомендую использовать ESF Migration ToolKit
, который отлично справляется со своей работой в то время, как стандартное средство импорта /экспорта в SSMS делает вставку по 1 записи. Правда минус в том, что он платный...
Если все таки хочется- это самому реализовать, то есть класс SqlBulkCopyColumnMapping
, где можно задать маппинг одного поля на другое. Однако, хоть СУБД и пофигу на регистр колонок, однако, BulkCopy
не пофиг и он не найдет соответствие схожих имен, но с разным регистром.
А еще, на сколько я знаю, можно прямо из MS SQL через скрипт сделать BULK INSERT:
BULK INSERT SchoolsTemp
FROM 'C:CSVDataSchools.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = 'n', --Use to shift the control to next row
ERRORFILE = 'C:CSVDATASchoolsErrorRows.csv',
TABLOCK
)
Правда, не пробовал.
P.S Ну и не забудь в целевой таблице грохнуть всех индексы и ключи, так это тормозит вставку.
Answered by iluxa1810 on February 9, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP