воскресенье, 10 июня 2018 г.

Разбиение файла импорта 1С на сайт на части

Вводная: Есть хостинг, есть сайт у сайта есть импорт товаров из 1С. Из 1С УТ файлы выгружаются, через стандартный механизм обмена с web-сайтом.
Но скрипту импорта периодически не хватает памяти, чтобы загрузить всё. И падает с ошибкой. Было решено "разбивать" файлы на части по 1000 товаров. И загружать последовательно.

Решение:
            Directory.EnumerateFiles(Environment.CurrentDirectory)
                     .Where(file => Path.GetFileName(file).StartsWith("output")).ToList()
                     .ForEach(File.Delete);
            
            XDocument source = XDocument.Load("import.xml");

            int iteration = 0;

            while (iteration * 1000 < source.Descendants("Товар").Count())
            {
                XDocument xdoc = new XDocument(source);

                var allElements = xdoc.Descendants("Товар").OrderBy(a => a.Element("Ид")?.Value);

                var whatToLeave = xdoc
                                    .Descendants("Товар")
                                    .OrderBy(w => w.Element("Ид")?.Value)
                                    .Skip(1000 * iteration).Take(1000);

                allElements.Except(whatToLeave).ToList().ForEach(e => e.Remove());

                iteration++;
                xdoc.Save($"output{iteration}.xml");
            }