274 lines
8.5 KiB
Python
274 lines
8.5 KiB
Python
import time
|
|
import yaml
|
|
import re
|
|
import json
|
|
|
|
# --- TASK 0 --- #
|
|
|
|
TAB_SIZE = 2
|
|
tab = 0
|
|
tabArray = 0
|
|
result = '{\n'
|
|
brackets = []
|
|
|
|
|
|
def task0():
|
|
global TAB_SIZE, tab, tabArray, result, brackets
|
|
|
|
def append_to_result(string):
|
|
global result, tab
|
|
result += f'{" " * (tabArray + tab + 2)}{string}'
|
|
|
|
with open('input-csv.yaml', encoding='UTF-8') as inpt:
|
|
inpt = inpt.readlines()
|
|
for key, i in enumerate(inpt):
|
|
i = i.split(':')
|
|
if tab != len(i[0]) - len(i[0].lstrip()):
|
|
if tab < len(i[0]) - len(i[0].lstrip()):
|
|
tab = len(i[0]) - len(i[0].lstrip())
|
|
else:
|
|
tab = len(i[0]) - len(i[0].lstrip())
|
|
result = result[:len(result) - 2] + '\n'
|
|
append_to_result(brackets.pop() + ',\n')
|
|
if i[0].strip()[0] == '-':
|
|
if tab == tabArray and ']' not in brackets:
|
|
append_to_result('[\n')
|
|
brackets.append(']')
|
|
tabArray += 2
|
|
i[0] = i[0].lstrip()[1:].strip()
|
|
append_to_result('{\n')
|
|
brackets.append('}')
|
|
tab += TAB_SIZE
|
|
if i[1].strip() == '':
|
|
br = ''
|
|
if inpt[key+1].split(':')[0].strip()[0] == '-':
|
|
br = '[]'
|
|
else:
|
|
br = '{}'
|
|
append_to_result(f'"{i[0].strip()}": {br[0]}\n')
|
|
brackets.append(br[1])
|
|
else:
|
|
def shielding(s: str):
|
|
return s.replace("\\", "\\\\").replace("\"", "\\\"")
|
|
i = list(map(shielding, i))
|
|
append_to_result(f'"{i[0].strip()}": "{":".join(i[1:]).strip()}",\n')
|
|
if brackets is not None:
|
|
for _ in range(len(brackets)):
|
|
tab -= TAB_SIZE
|
|
result = result[:len(result) - 2] + '\n'
|
|
i = brackets.pop()
|
|
append_to_result(i + ',\n')
|
|
|
|
result = result[:len(result) - 2] + '\n'
|
|
result += '}'
|
|
|
|
# --- TASK 1 --- #
|
|
|
|
|
|
def task1():
|
|
with open('input-csv.yaml', encoding='UTF-8') as inpt:
|
|
obj = yaml.safe_load(inpt)
|
|
json.dumps(obj, ensure_ascii=False).encode('utf8')
|
|
|
|
|
|
# --- TASK 2 --- #
|
|
|
|
TAB_SIZE = 2
|
|
tab = 0
|
|
tabArray = 0
|
|
result = '{\n'
|
|
brackets = []
|
|
|
|
|
|
def task2():
|
|
global TAB_SIZE, tab, tabArray, result, brackets
|
|
|
|
def append_to_result(string):
|
|
global result, tab, tabArray
|
|
result += f'{" " * (tabArray + tab + 2)}{string}'
|
|
|
|
with open('input-csv.yaml', encoding='UTF-8') as inpt:
|
|
inpt = inpt.readlines()
|
|
for key, i in enumerate(inpt):
|
|
i = i.split(':')
|
|
|
|
# Обработка табов
|
|
deltaTab = len(re.findall(r'(?<!-) ', i[0]))
|
|
if tab != deltaTab:
|
|
if tab < deltaTab:
|
|
tab = deltaTab
|
|
else:
|
|
tab = deltaTab
|
|
result = result[:len(result) - 2] + '\n'
|
|
append_to_result(brackets.pop() + ',\n')
|
|
|
|
# Обработка массивов
|
|
if re.findall(r' *- .*', i[0]):
|
|
if tab == tabArray and ']' not in brackets:
|
|
append_to_result('[\n')
|
|
brackets.append(']')
|
|
tabArray += TAB_SIZE
|
|
i[0] = i[0].lstrip()[1:].strip()
|
|
append_to_result('{\n')
|
|
brackets.append('}')
|
|
tab += TAB_SIZE
|
|
|
|
# Обработка вложенных объектов
|
|
if i[1].strip() == '':
|
|
if re.findall(r' *- .*', inpt[key+1].split(':')[0]):
|
|
br = '[]'
|
|
else:
|
|
br = '{}'
|
|
append_to_result(f'"{i[0].strip()}": {br[0]}\n')
|
|
brackets.append(br[1])
|
|
else:
|
|
def shielding(s: str):
|
|
return s.replace("\\", "\\\\").replace("\"", "\\\"")
|
|
i = list(map(shielding, i))
|
|
append_to_result(f'"{i[0].strip()}": "{":".join(i[1:]).strip()}",\n')
|
|
# Закрытие файла
|
|
if brackets is not None:
|
|
for _ in range(len(brackets)):
|
|
tab -= TAB_SIZE
|
|
result = result[:len(result) - 2] + '\n'
|
|
append_to_result(brackets.pop() + ',\n')
|
|
result = result[:len(result) - 2] + '\n'
|
|
|
|
result += '}'
|
|
|
|
|
|
# --- TASK 3 --- #
|
|
|
|
TAB_SIZE = 2
|
|
tab = 0
|
|
tabArray = 0
|
|
result = '{\n'
|
|
brackets = []
|
|
array = 0
|
|
simpleArray = False
|
|
|
|
|
|
def append_to_result(string):
|
|
global result, tab
|
|
result += f'{" " * (tabArray + tab + 2)}{string}'
|
|
|
|
|
|
def compute_tab_size(yamlFile):
|
|
for i in yamlFile[1:]:
|
|
deltaTab = len(i) - len(i.lstrip())
|
|
if deltaTab != 0:
|
|
return deltaTab
|
|
return 0
|
|
|
|
|
|
def task3():
|
|
with open('input.yaml', encoding='UTF-8') as inpt:
|
|
inpt = inpt.readlines()
|
|
TAB_SIZE = compute_tab_size(inpt)
|
|
|
|
for key, i in enumerate(inpt):
|
|
if i.lstrip()[0] == '#':
|
|
continue
|
|
|
|
if i.count(':') == 0 and i.strip()[0] == '-':
|
|
append_to_result(f'{transform(i.strip()[2:])},\n')
|
|
simpleArray = True
|
|
continue
|
|
if simpleArray:
|
|
result = result[:len(result) - 2] + '\n'
|
|
append_to_result(brackets.pop() + ',\n')
|
|
simpleArray = False
|
|
|
|
i = [i.split('#')[0].split(':')[0], ':'.join(i.split('#')[0].split(':')[1:])]
|
|
|
|
# Обработка табов
|
|
deltaTab = len(i[0]) - len(i[0].lstrip())
|
|
if tab != deltaTab:
|
|
if tab < deltaTab:
|
|
tab = deltaTab
|
|
else:
|
|
result = result[:len(result) - 2] + '\n'
|
|
append_to_result(brackets.pop() + ',\n')
|
|
if abs(deltaTab - tab)//TAB_SIZE > 1:
|
|
result = result[:len(result) - 2] + '\n'
|
|
append_to_result(brackets.pop() + ',\n')
|
|
tab = deltaTab
|
|
|
|
# Обработка массивов
|
|
if i[0].strip()[0] == '-':
|
|
i[0] = i[0].lstrip()[1:].strip()
|
|
append_to_result('{\n')
|
|
brackets.append('}')
|
|
tab += TAB_SIZE
|
|
|
|
# Обработка вложенных объектов
|
|
if i[1].strip() == '':
|
|
br = ''
|
|
if inpt[key+1].split(':')[0].strip()[0] == '-':
|
|
br = '[]'
|
|
else:
|
|
br = '{}'
|
|
append_to_result(f'"{i[0].strip()}": {br[0]}\n')
|
|
brackets.append(br[1])
|
|
else:
|
|
def transform(s: str):
|
|
try:
|
|
return int(s)
|
|
except:
|
|
try:
|
|
return float(s)
|
|
except:
|
|
if s.strip() in ["y", "Y", "yes", "Yes", "YES", "n", "N", "no", "No", "NO", "true", "True", "TRUE"]:
|
|
return "true"
|
|
elif s.strip() in ["false", "False", "FALSE", "on", "On", "ON", "off", "Off", "OFF"]:
|
|
return "false"
|
|
return '"' + s.replace("\\", "\\\\").replace("\"", "\\\"").strip() + '"'
|
|
|
|
|
|
i = list(map(transform, i))
|
|
append_to_result(f'{i[0]}: {i[1]},\n')
|
|
if brackets is not None:
|
|
for _ in range(len(brackets)):
|
|
tab -= TAB_SIZE
|
|
result = result[:len(result) - 2] + '\n'
|
|
i = brackets.pop()
|
|
append_to_result(i + ',\n')
|
|
|
|
result = result[:len(result) - 2] + '\n'
|
|
result += '}'
|
|
with open('output.json', 'w', encoding='UTF-8') as output:
|
|
print(result)
|
|
result = result.replace('\n', '')
|
|
r = ''
|
|
data = False
|
|
for key, i in enumerate(result):
|
|
if i != ' ' and not data:
|
|
r += i
|
|
if data:
|
|
r += i
|
|
if i == '"' and result[key - 1:key+1] != r'\"':
|
|
data = not data
|
|
output.write(r)
|
|
print(r)
|
|
|
|
|
|
t0 = time.perf_counter()
|
|
for _ in range(100):
|
|
task0()
|
|
print('Задание 0: ', time.perf_counter() - t0)
|
|
|
|
t1 = time.perf_counter()
|
|
for _ in range(100):
|
|
task1()
|
|
print('Задание 1: ', time.perf_counter() - t1)
|
|
|
|
t2 = time.perf_counter()
|
|
for _ in range(100):
|
|
task2()
|
|
print('Задание 2: ', time.perf_counter() - t2)
|
|
|
|
t3 = time.perf_counter()
|
|
for _ in range(100):
|
|
task2()
|
|
print('Задание 3: ', time.perf_counter() - t3)
|