diff --git a/BudaPortaXmlConvert.bat b/BudaPortaXmlConvert.bat index beb29bc..0686d50 100644 --- a/BudaPortaXmlConvert.bat +++ b/BudaPortaXmlConvert.bat @@ -1,11 +1,5 @@ @echo off -if exist %1\* ( - for /R "%1" %%f in (*.csv) do ( python %~dp0\BudaPortaXmlConvert.py "%%f") - @REM for /f %%a IN ('dir /b /s %1') do python %~dp0\BudaPortaXmlConvert.py "%%a" - @REM echo Directory -) else ( - python %~dp0\BudaPortaXmlConvert.py %1 -) +python %~dp0\BudaPortaXmlConvert.py %1 pause \ No newline at end of file diff --git a/BudaPortaXmlConvert.py b/BudaPortaXmlConvert.py index d7c8c1a..4da9e37 100644 --- a/BudaPortaXmlConvert.py +++ b/BudaPortaXmlConvert.py @@ -1,5 +1,5 @@ # BudaPortaXmlConvert -# Version: 1.0 +# Version: 1.1 # License: GNU LGPLv3 # Maintainer: Peter Gyetvai - gyetpet@mailbox.org # Repo: https://git.gyetvaipeter.hu/infeeeee/budaporta-xml @@ -12,89 +12,161 @@ import csv import datetime import os -# --------------------------------- Read arg --------------------------------- # -if len(sys.argv) != 2: - raise ValueError('Fájl hiányzik!') -csvPath = sys.argv[1] -print(f'Fájl olvasása: {csvPath}') -folder = os.path.dirname(csvPath) +# ---------------------------------------------------------------------------- # +# Function # +# ---------------------------------------------------------------------------- # -# --------------------------------- Read csv --------------------------------- # - -csvArr = [] -if os.path.isdir(csvPath): - os.listdir(csvPath) -else: - with open(csvPath, newline='') as csvfile: - incsv = csv.reader(csvfile, delimiter=';') - for row in incsv: - csvArr.append(row) - - -# ---------------------------- Find column numbers --------------------------- # - +# Finds the number of column def findColumn(text, array): for i, elem in enumerate(array): if elem == text: return i raise ValueError('Oszlop nem található!' + text) +# Finds all column numbers, returns an array of positions + + +def findColumnNumbers(csvHeaderArray, requiredHeaders): + colNumbers = [] + for col in requiredHeaders: + colnum = findColumn(col, csvHeaderArray) + print(f'"{col}" oszlop sorszáma: {colnum}') + colNumbers.append(colnum) + print() + return colNumbers + +# Gets the data from all rows, based on column numbers: + + +def getReqData(csvRows, colNumbers): + outData = [] + for row in csvRows: + dict1 = {} + for i, reqCol in enumerate(colNumbers): + dict1[requiredData[i]] = row[reqCol] + outData.append(dict1) + return outData + + +def getXmlData(data): + xmlData = [] + for dict in data: + theDate = datetime.datetime.strptime( + dict["Reading data"], '%d. %m. %Y %H:%M:%S') + xmlDict = { + "KeszulekAzon": dict["Notes"], + "Gyariszam": dict["Meter n°"], + "MeroAllas": dict["Reading"].replace(',', '.').replace(' ', ''), + "MertekEgyseg": "m3", + "LeoMod": "20", + "LeoMegjegyzes": "06", + "TenyLeoDatum": theDate.strftime('%Y%m%d'), + "TenyLeoIdo": theDate.strftime('%H%M%S') + } + xmlData.append(xmlDict) + return xmlData + + +def checkData(xmlData): + print() + missingData = False + for mérő in xmlData: + for adat in mérő: + if len(mérő[adat]) == 0: + missingData = True + print(f'Adat hiányzik: "{adat}" a következő sorból:') + print(mérő) + return missingData + +# ---------------------------------------------------------------------------- # +# Code # +# ---------------------------------------------------------------------------- # + requiredData = ['Notes', 'Meter n°', 'Reading', 'Reading data'] + +# --------------------------------- Read arg --------------------------------- # +if len(sys.argv) != 2: + raise ValueError('Útvonal hiányzik!') +csvPath = sys.argv[1] +print(f'Útvonal olvasása: {csvPath}') +folder = os.path.dirname(csvPath) + +# --------------------------------- Read csv --------------------------------- # + +csvArrs = [] +csvFileNames = [] +if os.path.isdir(csvPath): + folder = csvPath + print(f'Fájlok a mappában: {os.listdir(csvPath)}') + for i, file in enumerate(os.listdir(csvPath)): + csvFileNames.append(file) + with open(os.path.join(csvPath, file), newline='') as csvfile: + incsv = csv.reader(csvfile, delimiter=';') + csvArrs.append([]) + + for row in incsv: + csvArrs[i].append(row) + +else: + csvFileNames[0] = csvPath + with open(csvPath, newline='') as csvfile: + incsv = csv.reader(csvfile, delimiter=';') + csvArrs[0] = [] + for row in incsv: + csvArrs[0].append(row) + + +# ---------------------------- Find column numbers --------------------------- # + +# Get the number of each column: dataColNumbers = [] -print() -for col in requiredData: - colnum = findColumn(col, csvArr[0]) - print(f'"{col}" oszlop sorszáma: {colnum}') - dataColNumbers.append(colnum) - - -# print(dataColNumbers) +for i, table in enumerate(csvArrs): + print(f'Oszlopok keresése: {csvFileNames[i]}:') + dataColNumbers.append(findColumnNumbers(table[0], requiredData)) # ----------------------------- Get required data ---------------------------- # -outData = [] -csvArr.pop(0) -for row in csvArr: - dict1 = {} - for i, reqCol in enumerate(dataColNumbers): - dict1[requiredData[i]] = row[reqCol] - outData.append(dict1) +# Remove headers from csv: +for table in csvArrs: + table.pop(0) -# print(outData) +# Get data based on column numbers: +reqData = [] +for i, table in enumerate(csvArrs): + reqData.append(getReqData(table, dataColNumbers[i])) -# --------------------- Convert data to required formats --------------------- # +# ---------------- Convert to required formats and check data ---------------- # -xmlData = [] -for dict in outData: - theDate = datetime.datetime.strptime( - dict["Reading data"], '%d. %m. %Y %H:%M:%S') - xmlDict = { - "KeszulekAzon": dict["Notes"], - "Gyariszam": dict["Meter n°"], - "MeroAllas": dict["Reading"].replace(',', '.').replace(' ', ''), - "MertekEgyseg": "m3", - "LeoMod": "20", - "LeoMegjegyzes": "06", - "TenyLeoDatum": theDate.strftime('%Y%m%d'), - "TenyLeoIdo": theDate.strftime('%H%M%S') - } - xmlData.append(xmlDict) +# get only required for xml, fill static values +xmlReqData = [] +for i, table in enumerate(reqData): + print(f'Fájl ellenőrzése: {csvFileNames[i]}') + currXmlData = getXmlData(table) + if not checkData(currXmlData): + print('Fájl hibátlan') + print() + xmlReqData.append(currXmlData) -# -------------------------------- Check data -------------------------------- # +# print(xmlReqData) +# for i in xmlReqData: +# print(i) -print() -print('Adatok ellenőrzése') -for mérő in xmlData: - for adat in mérő: - if len(mérő[adat]) == 0: - print(f'Adat hiányzik: "{adat}" a következő sorból:') - print(mérő) - print() + +# ------------------------------- Merge arrays ------------------------------- # + +allXmlData = [] +for array in xmlReqData: + for mérő in array: + allXmlData.append(mérő) + +for i in allXmlData: + print(i) # ----------------------------- Generate filename ---------------------------- # + now = datetime.datetime.now() fileNameBase = 'SZLA_' + now.strftime('%Y%m%d%H%M%S') + '_' fileNameNotFound = True @@ -113,7 +185,7 @@ print() # --------------------------------- Write xml -------------------------------- # data = ET.Element('Leolvasasok') -for mérő in xmlData: +for mérő in allXmlData: currSub = ET.SubElement(data, 'Leolvasas') for adat in mérő: a = ET.SubElement(currSub, adat) diff --git a/BudaPortaXmlConvertSeparate.bat b/BudaPortaXmlConvertSeparate.bat new file mode 100644 index 0000000..f45147e --- /dev/null +++ b/BudaPortaXmlConvertSeparate.bat @@ -0,0 +1,9 @@ +@echo off + +if exist %1\* ( + for /R "%1" %%f in (*.csv) do ( python %~dp0\BudaPortaXmlConvert.py "%%f") +) else ( + python %~dp0\BudaPortaXmlConvert.py %1 +) + +pause \ No newline at end of file