Загрузка данных из текстовых файлов, выбирая SQL запросом данные из этих файлов Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Рассмотрим вариант как это сделать! Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt
Код Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt
Код Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов. Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл
schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
ОБ_ФайлДанных= Новый Файл( Стр_КаталогДанных) ;
Если НЕ ОБ_ФайлДанных. ЭтоКаталог( ) Тогда
Сообщить( "Необходимо указать каталог данных!" , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецЕсли ;
Если НЕ ОБ_ФайлДанных. Существует( ) Тогда
Сообщить( "Каталог "" " + Стр_КаталогДанных+ """ не существует!" , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецЕсли ;
ОБ_АДОКонект = Новый COMОбъект( "ADODB.Connection" ) ;
ОБ_АДОРекордсетШапка = Новый COMОбъект( "ADODB.Recordset" ) ;
ОБ_АДОРекордсетСтроки = Новый COMОбъект( "ADODB.Recordset" ) ;
Стр_ОкончаниеФайла= "" ;
ФайлыШапок = НайтиФайлы( Стр_КаталогДанных, "Head_*.txt" ) ;
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла= Сред( ФайлШапки. ИмяБезРасширения, 6 ) ;
Стр_таблицаШапки= ФайлШапки. Имя;
Стр_ТаблицаСтрок= "Rows_" + Стр_ОкончаниеФайла+ ".txt" ;
Стр_ИмяФайлСтрок= ДобавлениеСлеша( Стр_КаталогДанных) + Стр_ТаблицаСтрок;
ФайлСтрок= Новый Файл( Стр_ИмяФайлСтрок) ;
Если НЕ ФайлСтрок. Существует( ) Тогда
Сообщить( "Не найден файл строк для файла шапки "" " + Стр_таблицаШапки+ """ ! Пара файлов не обработана" , СтатусСообщения. Важное) ;
Продолжить;
КонецЕсли ;
ФайлСхемыДанных= Новый Файл( ДобавлениеСлеша( Стр_КаталогДанных) + "schema.ini" ) ;
Если ФайлСхемыДанных. Существует( ) Тогда
Попытка
УдалитьФайлы( ФайлСхемыДанных. Путь, ФайлСхемыДанных. Имя) ;
Исключение
Сообщить( "Не возможно удалить файл "" " + ФайлСхемыДанных. ПолноеИмя+ """ для создания новой схемы данных! Проверте атрибуты файла" , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
КонецЕсли ;
Стр_СхемаДанныхТхт= "[" + Стр_таблицаШапки+ "]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|[" + Стр_ТаблицаСтрок+ "]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9" ;
ТекстСхемы= Новый ЗаписьТекста( ФайлСхемыДанных. ПолноеИмя, КодировкаТекста. ANSI) ;
ТекстСхемы. Записать( Стр_СхемаДанныхТхт) ;
ТекстСхемы. Закрыть( ) ;
Попытка
ОБ_АДОКонект. Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Стр_КаталогДанных+ ";Extended Properties='text;FMT=Delimited;HDR=NO'" ) ;
Исключение
Сообщить( "Невозможно открыть соединение!" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Стр_SQL = "S_elect * FROM " + Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка= ОБ_АДОКонект. Execute( Стр_SQL) ;
Исключение
Сообщить( "Ошибка выполнения запроса "" " + Стр_SQL+ """ !" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Пока НЕ ОБ_АДОРекордсетШапка. EOF Цикл
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка. Fields( "NumberNote" ) . Value;
Стр_КодКА= ОБ_АДОРекордсетШапка. Fields( "StoreNum" ) . Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка. Fields( "DataNote" ) . Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка. Fields( "DataDev" ) . Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка. Fields( "DataDes" ) . Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка. Fields( "CountLine" ) . Value;
Сообщить( "Заказ № " + Стр_НомерЗаказа+ " от " + Д_ДатаЗаказа+ " Код контрагента: " + Стр_КодКА+ " Дата доставки: " + Д_ДатаДоставки) ;
Стр_SQL = "S_elect * FROM " + Стр_ТаблицаСтрок+ " WHERE NumberNote='" + Стр_НомерЗаказа+ "'" ;
Попытка
ОБ_АДОРекордсетСтроки= ОБ_АДОКонект. Execute( Стр_SQL) ;
Исключение
Сообщить( "Ошибка выполнения запроса "" " + Стр_SQL+ """ !" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Сч= 0 ;
Сообщить( " № Артикул Количество" ) ;
Пока НЕ ОБ_АДОРекордсетСтроки. EOF Цикл
Сч= Сч+ 1 ;
Стр_Артикул= СокрЛП( ОБ_АДОРекордсетСтроки. Fields( "Articul" ) . Value) ;
Ч_Количество= ОБ_АДОРекордсетСтроки. Fields( "Counts" ) . Value;
Сообщить( "" + Сч+ " " + Стр_Артикул+ " " + Ч_Количество) ;
ОБ_АДОРекордсетСтроки. MoveNext( ) ;
КонецЦикла ;
ОБ_АДОРекордсетШапка. MoveNext( ) ;
КонецЦикла ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Автор:
Журавлев Михаил Викторович Категория:
Конвертация данных, Обмен, Перенос Загрузка данных из текстовых файлов с выборкой через ADO. Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов.
Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
ОБ_ФайлДанных= Новый Файл( Стр_КаталогДанных) ;
Если НЕ ОБ_ФайлДанных. ЭтоКаталог( ) Тогда
Сообщить( "Необходимо указать каталог данных!" , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецЕсли ;
Если НЕ ОБ_ФайлДанных. Существует( ) Тогда
Сообщить( "Каталог "" " + Стр_КаталогДанных+ """ не существует!" , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецЕсли ;
ОБ_АДОКонект = Новый COMОбъект( "ADODB.Connection" ) ;
ОБ_АДОРекордсетШапка = Новый COMОбъект( "ADODB.Recordset" ) ;
ОБ_АДОРекордсетСтроки = Новый COMОбъект( "ADODB.Recordset" ) ;
Стр_ОкончаниеФайла= "" ;
ФайлыШапок = НайтиФайлы( Стр_КаталогДанных, "Head_*.txt" ) ;
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла= Сред( ФайлШапки. ИмяБезРасширения, 6 ) ;
Стр_таблицаШапки= ФайлШапки. Имя;
Стр_ТаблицаСтрок= "Rows_" + Стр_ОкончаниеФайла+ ".txt" ;
Стр_ИмяФайлСтрок= ДобавлениеСлеша( Стр_КаталогДанных) + Стр_ТаблицаСтрок;
ФайлСтрок= Новый Файл( Стр_ИмяФайлСтрок) ;
Если НЕ ФайлСтрок. Существует( ) Тогда
Сообщить( "Не найден файл строк для файла шапки "" " + Стр_таблицаШапки+ """ ! Пара файлов не обработана" , СтатусСообщения. Важное) ;
Продолжить;
КонецЕсли ;
ФайлСхемыДанных= Новый Файл( ДобавлениеСлеша( Стр_КаталогДанных) + "schema.ini" ) ;
Если ФайлСхемыДанных. Существует( ) Тогда
Попытка
УдалитьФайлы( ФайлСхемыДанных. Путь, ФайлСхемыДанных. Имя) ;
Исключение
Сообщить( "Не возможно удалить файл "" " + ФайлСхемыДанных. ПолноеИмя+ """ для создания новой схемы данных! Проверте атрибуты файла" , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
КонецЕсли ;
Стр_СхемаДанныхТхт= "[" + Стр_таблицаШапки+ "]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|[" + Стр_ТаблицаСтрок+ "]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9" ;
ТекстСхемы= Новый ЗаписьТекста( ФайлСхемыДанных. ПолноеИмя, КодировкаТекста. ANSI) ;
ТекстСхемы. Записать( Стр_СхемаДанныхТхт) ;
ТекстСхемы. Закрыть( ) ;
Попытка
ОБ_АДОКонект. Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Стр_КаталогДанных+ ";Extended Properties='text;FMT=Delimited;HDR=NO'" ) ;
Исключение
Сообщить( "Невозможно открыть соединение!" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Стр_SQL = "S_elect * FROM " + Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка= ОБ_АДОКонект. Execute( Стр_SQL) ;
Исключение
Сообщить( "Ошибка выполнения запроса "" " + Стр_SQL+ """ !" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Пока НЕ ОБ_АДОРекордсетШапка. EOF Цикл
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка. Fields( "NumberNote" ) . Value;
Стр_КодКА= ОБ_АДОРекордсетШапка. Fields( "StoreNum" ) . Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка. Fields( "DataNote" ) . Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка. Fields( "DataDev" ) . Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка. Fields( "DataDes" ) . Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка. Fields( "CountLine" ) . Value;
Сообщить( "Заказ № " + Стр_НомерЗаказа+ " от " + Д_ДатаЗаказа+ " Код контрагента: " + Стр_КодКА+ " Дата доставки: " + Д_ДатаДоставки) ;
Стр_SQL = "S_elect * FROM " + Стр_ТаблицаСтрок+ " WHERE NumberNote='" + Стр_НомерЗаказа+ "'" ;
Попытка
ОБ_АДОРекордсетСтроки= ОБ_АДОКонект. Execute( Стр_SQL) ;
Исключение
Сообщить( "Ошибка выполнения запроса "" " + Стр_SQL+ """ !" + ОписаниеОшибки( ) , СтатусСообщения. Важное) ;
Возврат Ложь ;
КонецПопытки ;
Сч= 0 ;
Сообщить( " № Артикул Количество" ) ;
Пока НЕ ОБ_АДОРекордсетСтроки. EOF Цикл
Сч= Сч+ 1 ;
Стр_Артикул= СокрЛП( ОБ_АДОРекордсетСтроки. Fields( "Articul" ) . Value) ;
Ч_Количество= ОБ_АДОРекордсетСтроки. Fields( "Counts" ) . Value;
Сообщить( "" + Сч+ " " + Стр_Артикул+ " " + Ч_Количество) ;
ОБ_АДОРекордсетСтроки. MoveNext( ) ;
КонецЦикла ;
ОБ_АДОРекордсетШапка. MoveNext( ) ;
КонецЦикла ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Автор
Журавлев Михаил Викторович Категория:
JSON, XML, TXT, CSV, DBF