gcstruct.py 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import pandas as pd
  2. import xml.etree.ElementTree as ET
  3. import json
  4. import re
  5. from bs4 import BeautifulSoup
  6. config = {
  7. 'default': ["SKR51", "Herkunft_KST", "Absatzkanal", "Kostentraeger", "Marke", "Standort", "Manuelle_Konten"],
  8. 'special': {
  9. 'Planner': ["Kostenstelle", "Konto_1", "Ebene1", "Ebene2"],
  10. 'Test': ["Ebene1", "Ebene2"]
  11. }
  12. }
  13. columns = ["Konto_Nr", "Konto_Bezeichnung", "Konto_Art", "Kostenstelle", "STK", "Konto_1", "Konto_2", "Konto_3", "Konto_4", "Konto_5"]
  14. def get_tree(node, parents):
  15. result = []
  16. for child in node:
  17. parents.append(child.attrib['Name'])
  18. result.append({ "id": ";".join(parents) + ";"*(10 - len(parents)), "text": child.attrib['Name'], "children": get_tree(child, parents) })
  19. parents.pop()
  20. return result
  21. def structure_from_tree(node):
  22. result = []
  23. result.append(node['id'])
  24. for child in node['children']:
  25. result.extend(structure_from_tree(child))
  26. return result
  27. def xml_from_tree (xml_node, tree_node):
  28. for child in tree_node['children']:
  29. element = ET.SubElement(xml_node, "Ebene")
  30. element.set("Name", child['text'])
  31. xml_from_tree(element, child)
  32. def split_it(text, index):
  33. try:
  34. return re.findall(r"([^;]+) - ([^;]*);;", text)[0][index]
  35. except:
  36. return ""
  37. def get_structure_and_tree ():
  38. df = pd.read_csv("gcstruct/Kontenrahmen/Kontenrahmen.csv", sep=";", encoding="ansi", decimal=",", converters={i: str for i in range(0, 200)}) #, index_col="Konto_Nr")
  39. for i, structure in enumerate(config['default']):
  40. first = i*10 + 1
  41. df[structure] = df['Ebene'+str(first)] + ";" + df['Ebene'+str(first+1)] + ";" + df['Ebene'+str(first+2)] + ";" + df['Ebene'+str(first+3)] + ";" + df['Ebene'+str(first+4)] + ";" + df['Ebene'+str(first+5)] + ";" + df['Ebene'+str(first+6)] + ";" + df['Ebene'+str(first+7)] + ";" + df['Ebene'+str(first+8)] + ";" + df['Ebene'+str(first+9)]
  42. df['LetzteEbene' + str(i+1) + '_Nr'] = df[structure].apply(lambda x: split_it(x, 0))
  43. df['LetzteEbene' + str(i+1) + '_Bez'] = df[structure].apply(lambda x: split_it(x, 1))
  44. df = df[columns + config['default'] + ['LetzteEbene' + str(i+1) + '_Nr' for i in range(len(config['default']))] + ['LetzteEbene' + str(i+1) + '_Bez' for i in range(len(config['default']))]]
  45. json_result = { "Kontenrahmen": df.to_dict("records") }
  46. # df2 = pd.read_csv("gcstruct/Strukturen/Kontenrahmen.csv/SKR51.csv", sep=";", encoding="ansi", decimal=",", converters={i: str for i in range(0, 200)})
  47. # print(df2.head())
  48. for i, structure in enumerate(config['default']):
  49. tree = ET.parse("gcstruct/Xml/" + structure + ".xml")
  50. json_result[structure] = get_tree(tree.getroot(), [])
  51. json.dump(json_result, open("gcstruct/SKR51.json", "w"), indent=2)
  52. def post_structure_and_tree ():
  53. json_post = json.load(open("gcstruct/SKR51.json", "r"))
  54. # Kontenrahmen.csv
  55. ebenen = ["Ebene" + str(i) for i in range(1, len(config['default'])*10+1)]
  56. header = ";".join(columns + ebenen)
  57. cols = columns + config['default']
  58. with open("gcstruct/Kontenrahmen/Kontenrahmen_out.csv", "w", encoding="ansi") as f:
  59. f.write(header + "\n")
  60. for row in json_post['Kontenrahmen']:
  61. f.write(";".join([row[e] for e in cols]) + "\n")
  62. # print(header)
  63. # xml und evtl. Struktur.csv
  64. for i, structure in enumerate(config['default']):
  65. with open("gcstruct/Strukturen/Kontenrahmen.csv/" + structure + "_out.csv", "w", encoding="ansi") as f:
  66. f.write(";".join(["Ebene" + str(i*10 + j) for j in range(1, 11)]) + "\n")
  67. rows = structure_from_tree({"id": ";"*9, "children": json_post[structure] })
  68. f.write("\n".join(rows))
  69. #with open("gcstruct/Strukturen/Kontenrahmen.csv/" + structure + "_2.csv", "w", encoding="ansi") as f:
  70. root = ET.Element("Ebene")
  71. root.set("Name", structure)
  72. xml_from_tree(root, {"id": ";"*9, "children": json_post[structure] })
  73. with open("gcstruct/Xml/" + structure + "_out.xml", "w", encoding="utf-8") as f:
  74. f.write(BeautifulSoup(ET.tostring(root), "xml").prettify())
  75. get_structure_and_tree()
  76. # post_structure_and_tree()