1.1 Huge refractor, save multiple csvs as one xml

This commit is contained in:
2021-06-02 14:41:22 +02:00
parent 19f1ac487a
commit 4a6d34da4d
3 changed files with 145 additions and 70 deletions

View File

@@ -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
)
pause

View File

@@ -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,62 +12,46 @@ 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
requiredData = ['Notes', 'Meter n°', 'Reading', 'Reading data']
dataColNumbers = []
print()
for col in requiredData:
colnum = findColumn(col, csvArr[0])
def findColumnNumbers(csvHeaderArray, requiredHeaders):
colNumbers = []
for col in requiredHeaders:
colnum = findColumn(col, csvHeaderArray)
print(f'"{col}" oszlop sorszáma: {colnum}')
dataColNumbers.append(colnum)
colNumbers.append(colnum)
print()
return colNumbers
# Gets the data from all rows, based on column numbers:
# print(dataColNumbers)
# ----------------------------- Get required data ---------------------------- #
def getReqData(csvRows, colNumbers):
outData = []
csvArr.pop(0)
for row in csvArr:
for row in csvRows:
dict1 = {}
for i, reqCol in enumerate(dataColNumbers):
for i, reqCol in enumerate(colNumbers):
dict1[requiredData[i]] = row[reqCol]
outData.append(dict1)
return outData
# print(outData)
# --------------------- Convert data to required formats --------------------- #
def getXmlData(data):
xmlData = []
for dict in outData:
for dict in data:
theDate = datetime.datetime.strptime(
dict["Reading data"], '%d. %m. %Y %H:%M:%S')
xmlDict = {
@@ -81,20 +65,108 @@ for dict in outData:
"TenyLeoIdo": theDate.strftime('%H%M%S')
}
xmlData.append(xmlDict)
return xmlData
# -------------------------------- Check data -------------------------------- #
def checkData(xmlData):
print()
print('Adatok ellenőrzése')
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 = []
for i, table in enumerate(csvArrs):
print(f'Oszlopok keresése: {csvFileNames[i]}:')
dataColNumbers.append(findColumnNumbers(table[0], requiredData))
# ----------------------------- Get required data ---------------------------- #
# Remove headers from csv:
for table in csvArrs:
table.pop(0)
# Get data based on column numbers:
reqData = []
for i, table in enumerate(csvArrs):
reqData.append(getReqData(table, dataColNumbers[i]))
# ---------------- Convert to required formats and check data ---------------- #
# 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)
# print(xmlReqData)
# for i in xmlReqData:
# print(i)
# ------------------------------- 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)

View File

@@ -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