-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsub_table.py
71 lines (61 loc) · 4.11 KB
/
sub_table.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#########################
## SUBJECT TABLE ##
#########################
import ProjectLibrary as prj
import csv
import re
#------------------------------------------------
# FASE PRELIMINARE
# wf: file da scrivere
# rf: file da leggere
# colum_needed: colonne presente nel csv o non di cui ho bisogno per creare sub_table
# csvwriter.writerow(column_needed): vado a scrivere l'header del mio csv
# col_pos: mi recupero la posizione delle colonne necessarie dal csv letto
#------------------------------------------------
with open('subject_table.csv', 'w', newline='') as wf:
csvwriter = csv.writer(wf)
with open('answerdatacorrect.csv', 'r') as rf:
header = rf.readline().strip().split(',')
column_needed = ['SubjectId', 'Description']
csvwriter.writerow(column_needed)
col_pos = prj.column_position(header, column_needed)
#-----------------------------------------------
# FASE DI COSTRUZIONE DEL CSV FILE
# count: sarà la nostra chiave primaria incrementale univoca
# lines: racchiude tutte le line del mio csv ad esclusione della prima che è già stata letta
# meta_lines: si riferisce alle righe lette dal file sub_meta_table creato precedentemente con lo scopo di ordinare
# in via crescente (per livello) le materie
# no_duplicates: sarà l'insieme dei valori unici dei nostri subjectid (i.e. [3,101,115,342]). Vado dunque prima a lavorare per cercare le combinazioni
# uniche dei subjectid forniti dalla tabella principale. Questa ridurrà molto i tempi di calcolo.
# for pos, el... : in questo ciclo for si vanno a prendere i valori di cui ho bisogno dal csv in lettura
# sfruttando l'indice delle colonne in col_pos. Inoltre vado a fare un match tra i valori dati nel subjectid
# della tabella principali (lista di id) con i singoli id della materie nel csv dei metadati. Iterando
# vado così a recuperare sia la descrizione testuale delle materie che a riordinare in via crescente di livello gli id.
# alla fine si aumenta il count di uno e si va ad assegnare come id unico creando la variabile new_row.
#-----------------------------------------------
with open('subject_meta_table.csv', 'r') as metadata:
header_m = metadata.readline().strip().split(',')
count = 0
lines = rf.read().splitlines()
meta_lines = metadata.read().splitlines()
no_duplicates_id = set()
for line in lines:
for pos, el in enumerate(re.split(r',(?=\w|")', line)):
if pos == col_pos[0]: # SubjectId es. [3,101,115,342]
no_duplicates_id.add(el)
else:
continue
for el in no_duplicates_id: # Lo scopo dei due cicli for successivi è di fare il match con la tabella dei metadati e
# recuperare le informazioni della descrizione mentre riordino per livello. Infatti nel set
# dei non duplicati gli id delle materie non sono ordinati per livello
subject_id = []
description = []
for meta_line in meta_lines:
m_line = meta_line.replace(', ', '; ') # per fare lo split correttamente
splitted_line = m_line.split(',')
if eval(splitted_line[0]) in set(eval(el.strip('"'))): # vedo se id materia è nel in el (set per fare ricerca più veloce)
subject_id.append(eval(splitted_line[0]))
description.append(splitted_line[1].replace(';', ',').strip('"')) #appendo descrizione testuale riportando ; = ,
count+=1
new_row = (count, (subject_id, description)) #scrivo riga con id incrementale e tupla contenente id materia e descrizione testuale
csvwriter.writerow(new_row)