tpc4 done

This commit is contained in:
Tiago Sousa 2023-03-16 12:21:08 +00:00
parent c9179c9823
commit 741d95dd79
9 changed files with 194 additions and 0 deletions

4
TPC4/alunos2.csv Normal file
View file

@ -0,0 +1,4 @@
Número,Nome,Curso,Notas{5},,,,,
3162,Cândido Faísca,Teatro,12,13,14,15,16
7777,Cristiano Ronaldo,Desporto,17,12,20,11,12
264,Marcelo Sousa,Ciência Política,18,19,19,20,18
1 Número,Nome,Curso,Notas{5},,,,,
2 3162,Cândido Faísca,Teatro,12,13,14,15,16
3 7777,Cristiano Ronaldo,Desporto,17,12,20,11,12
4 264,Marcelo Sousa,Ciência Política,18,19,19,20,18

38
TPC4/alunos2.json Normal file
View file

@ -0,0 +1,38 @@
[
{
"Número": "3162",
"Nome": "Cândido Faísca",
"Curso": "Teatro",
"Notas": [
12,
13,
14,
15,
16
]
},
{
"Número": "7777",
"Nome": "Cristiano Ronaldo",
"Curso": "Desporto",
"Notas": [
17,
12,
20,
11,
12
]
},
{
"Número": "264",
"Nome": "Marcelo Sousa",
"Curso": "Ciência Política",
"Notas": [
18,
19,
19,
20,
18
]
}
]

4
TPC4/alunos3.csv Normal file
View file

@ -0,0 +1,4 @@
Número,Nome,Curso,Notas{3,5},,,,,
3162,Cândido Faísca,Teatro,12,13,14,,
7777,Cristiano Ronaldo,Desporto,17,12,20,11,12
264,Marcelo Sousa,Ciência Política,18,19,19,20,
1 Número,Nome,Curso,Notas{3,5},,,,,
2 3162,Cândido Faísca,Teatro,12,13,14,,
3 7777,Cristiano Ronaldo,Desporto,17,12,20,11,12
4 264,Marcelo Sousa,Ciência Política,18,19,19,20,

35
TPC4/alunos3.json Normal file
View file

@ -0,0 +1,35 @@
[
{
"Número": "3162",
"Nome": "Cândido Faísca",
"Curso": "Teatro",
"Notas": [
12,
13,
14
]
},
{
"Número": "7777",
"Nome": "Cristiano Ronaldo",
"Curso": "Desporto",
"Notas": [
17,
12,
20,
11,
12
]
},
{
"Número": "264",
"Nome": "Marcelo Sousa",
"Curso": "Ciência Política",
"Notas": [
18,
19,
19,
20
]
}
]

4
TPC4/alunos4.csv Normal file
View file

@ -0,0 +1,4 @@
Número,Nome,Curso,Notas{3,5}::sum,,,,,
3162,Cândido Faísca,Teatro,12,13,14,,
7777,Cristiano Ronaldo,Desporto,17,12,20,11,12
264,Marcelo Sousa,Ciência Política,18,19,19,20,
1 Número,Nome,Curso,Notas{3,5}::sum,,,,,
2 3162,Cândido Faísca,Teatro,12,13,14,,
3 7777,Cristiano Ronaldo,Desporto,17,12,20,11,12
4 264,Marcelo Sousa,Ciência Política,18,19,19,20,

20
TPC4/alunos4.json Normal file
View file

@ -0,0 +1,20 @@
[
{
"Número": "3162",
"Nome": "Cândido Faísca",
"Curso": "Teatro",
"Notas": 39
},
{
"Número": "7777",
"Nome": "Cristiano Ronaldo",
"Curso": "Desporto",
"Notas": 72
},
{
"Número": "264",
"Nome": "Marcelo Sousa",
"Curso": "Ciência Política",
"Notas": 76
}
]

4
TPC4/alunos5.csv Normal file
View file

@ -0,0 +1,4 @@
Número,Nome,Curso,Notas{3,5}::media,,,,,
3162,Cândido Faísca,Teatro,12,13,14,,
7777,Cristiano Ronaldo,Desporto,17,12,20,11,12
264,Marcelo Sousa,Ciência Política,18,19,19,20,
1 Número,Nome,Curso,Notas{3,5}::media,,,,,
2 3162,Cândido Faísca,Teatro,12,13,14,,
3 7777,Cristiano Ronaldo,Desporto,17,12,20,11,12
4 264,Marcelo Sousa,Ciência Política,18,19,19,20,

20
TPC4/alunos5.json Normal file
View file

@ -0,0 +1,20 @@
[
{
"Número": "3162",
"Nome": "Cândido Faísca",
"Curso": "Teatro",
"Notas": 13.0
},
{
"Número": "7777",
"Nome": "Cristiano Ronaldo",
"Curso": "Desporto",
"Notas": 14.4
},
{
"Número": "264",
"Nome": "Marcelo Sousa",
"Curso": "Ciência Política",
"Notas": 19.0
}
]

65
TPC4/tpc4.py Normal file
View file

@ -0,0 +1,65 @@
import re
import json
def parse_header(header):
regex = re.compile(r"(\w+)(?:{(?:(\d+),)?(\d+)}(?:::(\w+))?)?")
capture_list = regex.findall(header.strip())
header_order = []
lists = {}
funcs = {}
for id, min, max, func in capture_list:
header_order.append(id)
if max != "":
lists[id] = (int(min) if min else max, int(max))
if func != "":
funcs[id] = func
return header_order, lists, funcs
def parse_data(lines, header_order, lists, funcs):
data_regex = ""
for id in header_order:
if id in lists:
min, max = lists[id]
if min == max:
num = '{' + str(max) + '}'
else:
num = '{' + str(min) + ',' + str(max) + '}'
data_regex += rf"(?P<{id}>([^,]+,?){num}),?"
else:
data_regex += rf"(?P<{id}>[^,]+),?"
data_regex = re.compile(data_regex)
data = []
for line in lines:
for match in data_regex.finditer(line.strip()):
data.append(match.groupdict())
for elem in data:
for id in header_order:
if id in lists:
elem[id] = [int(num) for num in re.findall(r"\d+",elem[id])]
if id in funcs:
if funcs[id] == "sum":
elem[id] = sum(elem[id])
elif funcs[id] == "media":
elem[id] = sum(elem[id]) / len(elem[id])
return data
def main():
for i in range(2,6):
test_file = f"alunos{i}"
f = open(f"{test_file}.csv", "r")
lines = f.readlines()
header_order, lists, funcs = parse_header(lines[0])
data = parse_data(lines[1:], header_order, lists, funcs)
json_file = open(f"{test_file}.json","w")
json.dump(data,json_file,indent=4,ensure_ascii=False)
if __name__ == "__main__":
main()