AscParseController.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. class AscParseController
  3. {
  4. public function Run ($ascFile, $jsonFile = "")
  5. {
  6. if ($jsonFile == "") {
  7. $jsonFile = substr($ascFile, 0, -4) . ".json";
  8. }
  9. if (!strpos($jsonFile, "\\")) {
  10. $jsonFile = dirname($ascFile) . "\\" . $jsonFile;
  11. }
  12. $report = $this->parseFile($ascFile);
  13. file_put_contents($jsonFile, json_encode($report));
  14. }
  15. public function parseFile ($fileName)
  16. {
  17. $ascFile = utf8_encode(file_get_contents($fileName));
  18. $layers = explode("\r\n\r\n", $ascFile);
  19. $meta = explode("\r\n", array_shift($layers));
  20. $report = array(
  21. 'Titel' => str_replace("\"", "", $meta[0]),
  22. 'Datum' => str_replace("\"", "", $meta[1]),
  23. 'Filter' => explode(";", str_replace("\"", "", $meta[2])),
  24. 'Bericht' => $this->parseLayers($layers)
  25. );
  26. return $report;
  27. }
  28. private function parseLayers ($layers)
  29. {
  30. $result = array();
  31. foreach ($layers as $layer) {
  32. $result[] = $this->parseLayer($layer);
  33. }
  34. return $result;
  35. }
  36. private function parseLayer ($layer)
  37. {
  38. $page = explode("\r\n", $layer);
  39. $result = array(
  40. 'Ebene' => str_replace("\"", "", array_shift($page)),
  41. 'Header' => $this->parseTableHeader(array_shift($page)),
  42. 'Struktur' => $this->parseStructure($page),
  43. 'Tabelle' => $this->parseTable($page)
  44. );
  45. return $result;
  46. }
  47. private function parseTableHeader ($header)
  48. {
  49. $title = explode(";", str_replace("\"", "", $header));
  50. $result = array();
  51. foreach ($title as $col) {
  52. $format = "Dezimal2";
  53. if (trim($col) == "") {
  54. $format = "Text";
  55. }
  56. if (strpos($col, "%") > 0) {
  57. $format = "Prozent1";
  58. }
  59. $result[] = array(
  60. 'Titel' => $col,
  61. 'Format' => $format
  62. );
  63. }
  64. return $result;
  65. }
  66. private function parseStructure ($rows)
  67. {
  68. $structure = array();
  69. $elements = array();
  70. foreach ($rows as $row) {
  71. if (trim($row) == "") {
  72. continue;
  73. }
  74. $cols = explode(";", str_replace("\"", "", $row));
  75. $title = array_shift($cols);
  76. $level = explode(".", $title);
  77. $structure = $this->addElement($structure, $level);
  78. $elements["." . $title] = $cols;
  79. }
  80. return $this->getNodes($structure, $elements);
  81. }
  82. private function addElement ($structure, $level)
  83. {
  84. if (count($level) == 0) {
  85. return $structure;
  86. }
  87. $title = array_shift($level);
  88. if (!isset($structure[$title])) {
  89. $structure[$title] = array();
  90. }
  91. $structure[$title] = $this->addElement($structure[$title], $level);
  92. return $structure;
  93. }
  94. private function getNodes ($structure, $elements, $title = "")
  95. {
  96. $result = array();
  97. foreach ($structure as $key => $sub) {
  98. $t = $title . "." . $key;
  99. $e = array('Ebene' => $key);
  100. if (count($sub) > 0) {
  101. $e['Struktur'] = $this->getNodes($sub, $elements, $t);
  102. }
  103. if (isset($elements[$t])) {
  104. $e['Zeile'] = $elements[$t];
  105. }
  106. $result[] = $e;
  107. }
  108. return $result;
  109. }
  110. private function parseTable ($rows)
  111. {
  112. $result = array();
  113. foreach ($rows as $row) {
  114. if (trim($row) == "") {
  115. continue;
  116. }
  117. $cols = explode(";", str_replace("\"", "", $row));
  118. $title = array_shift($cols);
  119. $level = explode(".", $title);
  120. $result[] = array(
  121. 'Tiefe' => count($level),
  122. 'Ebene' => array_pop($level),
  123. 'Zeile' => $cols
  124. );
  125. }
  126. return $result;
  127. }
  128. }