少し前のプロジェクトの1つで、そのようなステートメントを「解析」して処理する必要がありました。 次に、インターネットを検索したところ、見た目が悪いか、既成のソリューションを共有したくないということがわかりました。
1CのWebサイトにアクセスして、経験が浅いプログラマでもフォーマットが非常にシンプルで理解しやすいことがわかりました。
抽出ファイルは、単純なテキストドキュメントです。
ファイル例
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
したがって、ドキュメントがテキストの場合、「解析」は簡単です。 ファイル内のデータは次の形式で表示されます。
=
したがって、ファイルを文字列の配列として取得し、この配列の循環を開始するだけで十分です。 便宜上、パーサーはオブジェクトの配列を返します。
Document.php-宛先ルールを持つドキュメントモデル
<?php namespace bank; class Document { public $doctype; public $inbankid; public $docdate; public $summ; public $outdate; public $indate; public $payeraccount; public $payerinfo; public $payerinn; public $payer; public $payerdealaccount; public $payerbank1; public $payerbank2; public $payerbik; public $payerfixaccount; public $recieveraccount; public $recieverinfo; public $recieverinn; public $reciever1; public $recieverdealaccount; public $recieverbank1; public $recieverbank2; public $recieverbik; public $recieverfixaccount; public $paytype; public $paydirection; public $makerstatus; public $payerkpp; public $recieverkpp; public $showerkbk; public $okato; public $showerfundament; public $showerperiod; public $showernumber; public $showerdate; public $showertype; public $paymentperiod; public $quenue; public function __construct() { } public function rules($rule) { $rules = [ '' => 'doctype', '' => 'inbankid', '' => 'docdate', '' => 'summ', '' => 'outdate', '' => 'indate', '' => 'payeraccount', '' => 'payerinfo', '' => 'payerinn', '1' => 'payer', '' => 'payerdealaccount', '1' => 'payerbank1', '2' => 'payerbank2', '' => 'payerbik', '' => 'payerfixaccount', '' => 'recieveraccount', '' => 'recieverinfo', '' => 'recieverinn', '1' => 'reciever1', '' => 'recieverdealaccount', '1' => 'recieverbank1', '2' => 'recieverbank2', '' => 'recieverbik', '' => 'recieverfixaccount', '' => 'paytype', '' => 'paydirection', '' => 'makerstatus', '' => 'payerkpp', '' => 'recieverkpp', '' => 'showerkbk', '' => 'okato', '' => 'showerfundament', '' => 'showerperiod', '' => 'showernumber', '' => 'showerdate', '' => 'showertype', '' => 'paymentperiod', '' => 'quenue', ]; return $rules[$rule]; } public function set($section, $param) { $rulled = $this->rules($section); $this->$rulled = $param; } } ?>
Bank.php-ドキュメントパーサークラス
<?php include 'Document.php'; // class Bank { protected $documents; // "" // function __construct($fileaddr) { $maas = file($fileaddr); // $documents = []; // $docid = 0; // ID 0 foreach ($maas as $key => $value) { // $value2 = rtrim($value); // $value2 = mb_convert_encoding($value2, "utf-8", "windows-1251"); // utf-8 windows-1251 $result = explode('=', $value2); // => if (count($result) == 2) { // if ($result[0] == '') { // $workflow = new Document(); // } if (isset($workflow)) { // $workflow->set($result[0], $result[1]); // , } } else { // if ($result[0] == '') { // $documents[$docid] = $workflow; // $docid++; // } } } $this->documents = $documents; // } function getDocs() { return $this->documents; // } } ?>
検証コード
<?php include 'Bank.php'; // $file = 'export_to_1c.txt'; // $bank = new Bank($file); // $docs = $bank->getDocs(); // var_dump($docs);// ?>
クラスでは交換形式の微妙な違いを考慮していないため、一部の大規模プロジェクトでこの「パーサー」を使用することはお勧めしません。
エラー処理もありません。 このクラスは教育目的でのみ作成されたもので、天才であると主張するものではありませんが、出発点としての私の観点からは、非常に適しています。
ご静聴ありがとうございました。コメントをありがとうございます。