Member 10583196 Ответов: 1

Загрузка больших csv файлов в базу данных


Привет,

У меня есть csv-файл, который содержит что угодно от нескольких сотен записей до 50 000 записей, хотя у меня есть процесс работы, время, необходимое для завершения, мучительно медленное, поэтому я искал совет о наилучшем способе выполнения этого требования.

Сценарий заключается в том, что заказ может содержать что угодно до 50 000 кодов, номер заказа отсутствует в данных загрузки, поэтому он не может выполнить массовую вставку (или я не знаю, как это сделать).

CSV-файл имеет только одно поле, например

abcd123
efgh456


Любые советы или ссылки будут оценены по достоинству.

Что я уже пробовал:

Идентификатор заказа передается в контроллер вместе с данными файла. Метод контроллера ниже.

[HttpPost]
public ActionResult UploadNewMailingData(int id,HttpPostedFileBase attachmentcsv)
{
    CsvFileDescription csvFileDescription = new CsvFileDescription
    {
        SeparatorChar = ',',
        FirstLineHasColumnNames = true
    };
    CsvContext csvContext = new CsvContext();
    StreamReader streamReader = new StreamReader(attachmentcsv.InputStream);
    IEnumerable<MediaSaleRecord> list = csvContext.Read<MediaSaleRecord>(streamReader, csvFileDescription);
    MediaSaleRecord mediaSaleRecord =  new  MediaSaleRecord();
    List<MediaSaleRecord> myList = new List<MediaSaleRecord>();
    for (int n = 0;n<list.Count();n++)
    {
        mediaSaleRecord.CustomerID = list.ElementAt(n).CustomerID;
        mediaSaleRecord.MediaSaleID = id;
        myList.Add(mediaSaleRecord);
    }
    db.MediaSaleRecords.AddRange(myList);
    db.SaveChanges();
    return Redirect("Index");
}


кредит за вышеприведенный код идет к
Загрузите CSV-файлы (другие файлы, разделенные разделителями) на Sql Server в Asp.Net MVC-сначала используйте код EF[^]
Модель определяется просто и состоит только из:

    public class MediaSaleRecord
    {
        public int MediaSaleRecordID { get; set; }
        public int MediaSaleID { get; set; }
        public string CustomerID { get; set; }
    }
}

1 Ответов

Рейтинг:
2

RickZeeland

Альтернативой может быть CsvHelper: CsvHelper[^ но я сомневаюсь, что это будет быстрее.

То BCP утилита может быть настроена с помощью файла форматирования, см.: "Больше столбцов в таблице, чем в файле данных" в разделе: Работа с утилитой командной строки bcp-Simple Talk[^]
Но, боюсь, это не позволяет определить постоянные значения.

Лучшее решение, я думаю, это использовать 'промежуточная таблица- а затем вставить в целевую таблицу с помощью INSERT INTO DEST_TABLE SELECT ... SQL-запрос, см.: Форумы SQL Server-указание постоянного значения для столбца в bcp.[^]