Обработка (парсинг) типовой выгрузки с интернет-банка

user99

Постоялец
Регистрация
13 Янв 2008
Сообщения
141
Реакции
15
Подскажите пожалуйста (намекните) как реализовать простой парсинг .txt выгрузки с интернет банка.
Цель какая, запускается скрипт в моем понимании нужно циклом обработать все операции из данного фаила, и по номеру счета в комментариях проставляем отметку оплачено.

Пробовал уже и через fgets открывать и массивы пробовал создавать.. разделить фаил так и не получилось на нужные куски кода..

Начало секции получается с Номер по КонецДокумента. Нужно загнать в переменные.


1CClientBankExchange
ВерсияФормата=1.02
Кодировка=Windows
Отправитель=Cистема Солнышко Интернет-Банк
Получатель=Бухгалтерский учет, редакция 4.4
ДатаНачала=27.11.2013
ДатаКонца=27.11.2014
РасчСчет=12345678901234567890
СекцияРасчСчет
ДатаНачала=27.11.2013
ДатаКонца=27.11.2014
РасчСчет=12345678901234567890
НачальныйОстаток=0
ВсегоПоступило=68770
ВсегоСписано=68770
КонечныйОстаток=0
КонецРасчСчет
СекцияДокумент=Банковский ордер
Номер=1
Дата=26.12.2013
Сумма=1000
ДатаСписано=26.12.2013
ДатаПоступило=
ПлательщикСчет=12345678901234567890
Плательщик=ИНН 778899001122 Иванов Иван Иванович (ИП)
ПлательщикИНН= 778899001122
Плательщик1=Иванов Иван Иванович (ИП)
ПлательщикРасчСчет=12345678901234567890
ПлательщикБанк1=ОАО АКБ "Солнышко"
ПлательщикБанк2=г. МОСКВА
ПлательщикБИК=044525201
ПлательщикКорсчет=98765432198765432100
ПлательщикКорсчет=98765432198765432100
ПолучательСчет=89765456787654345678
Получатель=ИНН 7765434566\775001001 ОАО АКБ "Солнышко"
ПолучательИНН=7765434566
Получатель1=ОАО АКБ "Солнышко"
ПолучательРасчСчет=89765456787654345678
ПолучательБанк1=ОАО АКБ "Солнышко"
ПолучательБанк2=г. МОСКВА
ПолучательБИК=044525201
ПолучательКорсчет=98765432198765432100
ВидОплаты=17
НазначениеПлатежа=Комиссия за открытие счета согласно тарифам ОАО АКБ "Солнышко"
КонецДокумента
СекцияДокумент=Платежное поручение
Номер=176
Дата=26.12.2013
Сумма=4770
ДатаСписано=
Плательщик=ИНН 7725747515\772501001 ООО "ВИОСН"
ПлательщикИНН=7725747515
ПлательщикСчет=40702810822000034869
Плательщик1=ООО "ВИОСН"
ПлательщикРасчСчет=40702810822000034869
ПлательщикБанк1=АКБ "АБСОЛЮТ БАНК" (ОАО)
ПлательщикБанк2=г. МОСКВА
ПлательщикБИК=044525976
ПлательщикКорсчет=30101810500000000976
ДатаПоступило=26.12.2013
Получатель=ИНН 778899001122 ИП Иванов Иван Иванович
ПолучательИНН=778899001122
ПолучательСчет=12345678901234567890
Получатель1=ИП Иванов Иван Иванович
ПолучательРасчСчет=12345678901234567890
ПолучательБанк1=ОАО АКБ "Солнышко"
ПолучательБанк2=г. МОСКВА
ПолучательБИК=044525201
ПолучательКорсчет=98765432198765432100
ВидОплаты=01
СрокПлатежа=26.12.2013
Очередность=5
НазначениеПлатежа=Оплата по счету №1 от 26 декабря (за услуги по обслуживанию сайта ) НДС не облагается.
КонецДокумента
СекцияДокумент=Банковский ордер
Номер=1
Дата=10.01.2014
Сумма=20
ДатаСписано=10.01.2014
ДатаПоступило=
ПлательщикСчет=12345678901234567890
Плательщик=ИНН 778899001122 Иванов Иван Иванович (ИП)
ПлательщикИНН=778899001122
Плательщик1=Иванов Иван Иванович (ИП)
ПлательщикРасчСчет=12345678901234567890
ПлательщикБанк1=ОАО АКБ "Солнышко"
ПлательщикБанк2=г. МОСКВА
ПлательщикБИК=044525201
ПлательщикКорсчет=98765432198765432100
ПолучательСчет=70601810200021210220
Получатель=ИНН 7765434566\775001001 ОАО АКБ "Солнышко"
ПолучательИНН=7765434566
Получатель1=ОАО АКБ "Солнышко"
ПолучательРасчСчет=70601810200021210220
ПолучательБанк1=ОАО АКБ "Солнышко"
ПолучательБанк2=г. МОСКВА
ПолучательБИК=044525201
ПолучательКорсчет=98765432198765432100
ВидОплаты=17
НазначениеПлатежа=Плата за прием и обработку платежных документов
КонецДокумента
СекцияДокумент=Платежное поручение
Номер=1
Дата=10.01.2014
Сумма=3500
ДатаСписано=10.01.2014
Плательщик=ИНН 778899001122\772801001 Иванов Иван Иванович (ИП)
ПлательщикИНН=778899001122
ПлательщикСчет=12345678901234567890
Плательщик1=Иванов Иван Иванович (ИП)
ПлательщикРасчСчет=12345678901234567890
ПлательщикБанк1=ОАО АКБ "Солнышко"
ПлательщикБанк2=г. МОСКВА
ПлательщикБИК=044525201
ПлательщикКорсчет=98765432198765432100
ДатаПоступило=
Получатель=ИНН 7707704692\772801001 ОАО "Единая электронная торговая площадка"
ПолучательИНН=7707704692
ПолучательСчет=40702810000760001497
Получатель1=ОАО "Единая электронная торговая площадка"
ПолучательРасчСчет=40702810000760001497
ПолучательБанк1=ОАО "БАНК МОСКВЫ"
ПолучательБанк2=г. МОСКВА
ПолучательБИК=044525219
ПолучательКорсчет=30101810500000000219
ВидОплаты=01
СтатусСоставителя=01
ПлательщикКПП=772801001
ПолучательКПП=772801001
ПоказательКБК=00000000000000000000
ОКАТО=0
ПоказательОснования=0
ПоказательПериода=0
ПоказательНомера=0
ПоказательДаты=10.01.2014
ПоказательТипа=0
СрокПлатежа=10.01.2014
Очередность=5
НазначениеПлатежа=Сумма 3500.00, в т.ч. НДС - 388,99
КонецДокумента
КонецФайла
 
user99, используйте для чтения файла функцию Для просмотра ссылки Войди или Зарегистрируйся
Данная функция представит данные в виде массива строк. Ну а далее дело техники и поставленных перед вами задач.
 
Только-что закончил проект по разбору выписок, использовал Logstash, загонял данные в elasticsearch, но можно и не только туда, а например в CSV который потом из PHP будет проще разобрать.
Совсем не PHP конечно, но изобретать велосипед не хотелось.
 
Последнее редактирование:
А какой функцией можно перехватить начало - конец по ключевым словам в массиве?
 
user99, наталкиваю дальше на мысль
Вы в итоге получили массив.
По формату 1CClientBankExchange вы имеете несколько документов.
И если вы файл будете проходить в цикле, то вы сможете сформировать несколько документов.
Начало и конец документа, если присмотреться к формату файла, вы сможете определить по ключам.
Типа
Код:
Начало 1 документа
     СекцияРасчСчет
Конец первого документа
     КонецРасчСчет
И далее
Код:
Начало документа в котором значение определяет тип документа
     СекцияДокумент
Конец документа
     КонецДокумента
Реально, дальше всё очень просто используя обычный цикл.
 
Последнее редактирование:
Получился код вида:

PHP:
<?php
$lines = file('Export_to_1c.txt');
foreach ($lines as $line_num => $line) {
$line = iconv('windows-1251', 'UTF-8', $line);
echo"<br>";

    echo "Строка #<b>{$line_num}</b> : $line";
}
?>

Все работает, получаем все данные в массив.
Теперь в сторону strpos копать для записи нужных данных в переменные?
array_search не находит данных по запросу например $num_doc = array_search('Номер=', $line);
 
Последнее редактирование модератором:
array_search ищет точное значение, учитывая что все равно идет перебор оно не сильно то и нужно.
Чтобы собрать документы в отдельные файлы нужно так.
Код:
<?php
$lines = file('Export_to_1c.txt');
$writedoc=false; // метка начала записи
$documents=array();
foreach ($lines as $line_num => $line) {
$line = iconv('windows-1251', 'UTF-8', $line);

if (strpos(' '.$line, 'Номер=')) { //Если строка содержит метку начала документа - то ставим метку начала записи в тру
   $writedoc=true; 
   $tmpdoc='';
   }

if ($writedoc) {
   $tmpdoc.=$line.';'; //пишем документ в строку
    }

if (strpos(' '.$line, 'КонецДокумента')) { //Ставим метку начала записи в false
   $writedoc=false;
   $documents[]=$tmpdoc; //Сбрасываем документ в массив
   }
}

print_r($documents); //выводим массив с документами
?>
 
Последнее редактирование:
Спасибо, но скрипт ругается на Undefined variable: documents in ...test2.php on line 27
 
то что ругается - это значит что он не находит строку.
Отредактировал, проверяй, там маленький костыль.
 
Заработало!
Можно еще один вопрос, как например получить в переменную

Array
(
[0] => Номер=1
;Дата=01.02.2017
;Сумма=900

Графу:
;Сумма=900 ?

$documents['0'], это я получаю все данные целиком.

Пробовал и так:
$data1 = $documents['0'];
$data = explode(";", $data1);
print_r $data;
 
Последнее редактирование:
Назад
Сверху