This repository has been archived by the owner on Nov 22, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathextrahuj.py
186 lines (144 loc) · 5.53 KB
/
extrahuj.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
from glob import glob
import csv
import tarfile
import os
import gzip
from collections import defaultdict, OrderedDict
# ## Číselníky
# Napřed načteme číselníky, které budeme používat jako slovníky pro údaje v samotném CEDRu.
# Tohle budem držet v paměti a pak za chodu nahrazovat.
print('Načítám číselníky')
gfn = glob('data/ciselnik*.tar.gz')
cdt = dict()
for gf in gfn:
tf = tarfile.open(gf, 'r:gz')
for fnm in tf.getmembers():
if '/ciselnik' not in fnm.name: continue
if not fnm.name.endswith('.n3'): continue
# print(fnm)
ff = tf.extractfile(fnm.name)
for j in ff:
if b'/title>' not in j: continue
d = j.split()
key = d[0][1:-1].decode('ascii')
val = (b' '.join(d[2:-1])).decode('unicode-escape')
if val.startswith('"'):
val = val[1:val.rindex('"')]
cdt[key] = val
def extrahuj(ff, chces, tfn):
"""
Hlavní funkce pro extkrakci vlastností z jedné CEDR tabulky.
Načtení všech dat do RAM není nutné, průběžně se kontroluje, zda je
možné vyexportovat část dat (pro ty řádky, kde máme všechny sloupce).
Přijímá tři argumenty:
- ff: file handler vstupu
- chces: seznam sloupců, které chceme vytáhnout
- tfn: název souboru, kam se to bude sypat
"""
ns = '<http://cedropendata.mfcr.cz/c3lod/'
ns2 = '<http://reference.data.gov.uk/doc/'
schces = set(chces)
lc = len(chces)
ret = dict()
counts = defaultdict(lambda: 0) # (int) by stacilo, ne?
fb = open(tfn, 'w')
# jen header
w = csv.writer(fb)
w.writerow(chces)
for j, ln in enumerate(ff):
if j % (1000*100) == 0: print('%s: %d' % (tfn, j), end='\r')
if j>0 and j % (1000*1000) == 0:
kc = list(counts.keys()) # protoze budem menit
for k in kc:
if counts[k] != lc: continue # jeste nemame vse
w.writerow(ret[k].values())
del ret[k]
del counts[k]
els = ln.decode('unicode-escape').split()
if len(els) == 4:
els = els[:3] # mazem tecku na konci
else:
els = els[:2] + [' '.join(els[2:-1])] # pro pripad ze ma treti pole mezery (-1 pro vynechani tecky)
idd = els[0][els[0].rindex('/')+1:-1]
if '#' not in els[1]: continue # title
slvs = els[1][els[1].index('#')+1:-1]
if slvs not in schces: continue
assert els[2][0] in ['<', '"']
if els[2][0] == '<':
assert els[2].startswith(ns) or els[2].startswith(ns2), els[2]
# gov.uk:
if els[2].startswith(ns2):
if not els[2].startswith('<http://reference.data.gov.uk/doc/year/'):
raise KeyError('pro gov.uk umime jen roky, a to rucne, protoze nemame ciselnik, dostal sem %s' % els[2])
trd = els[2][-5:-1]
else:
trd = cdt[els[2][1:-1]]
#trd = els[2][len(ns):-1] # -1 pro trimovani '>'
#trd = els[2][els[2].rindex('/')+1:-1] # id po slovese
else:
# hodnota mezi uvozovkama
if '"' not in els[2][1:]:
trd = els[2][1:].strip()
else:
trd = els[2][1:els[2][1:].rindex('"')+1]
if idd not in ret:
ret[idd] = OrderedDict.fromkeys(chces)
ret[idd][slvs] = trd
counts[idd] += 1
# vypsat zbyvajici
for j,k in ret.items():
w.writerow(k.values())
fb.close()
def cti_vazby(ff, slvs, tfn):
"""
Pro extrakci vybraných vztahů z n3 souboru.
Vytáhne jen potřebný sloupec. Použijeme pro napojení našich CSV souborů.
"""
hd = False
slvs = bytes('#%s>' % slvs, encoding='ascii')
tf = open(tfn, 'w', encoding='ascii', newline='')
cw = csv.writer(tf)
for j, rw in enumerate(ff):
if slvs not in rw: continue
dd = rw.decode('ascii').split()
if not hd:
hda = dd[0].split('/')[-2]
hdb = dd[2].split('/')[-2]
hd = True
cw.writerow([hda, hdb])
a = dd[0][dd[0].rindex('/')+1:-1]
b = dd[2][dd[2].rindex('/')+1:-1]
cw.writerow([a, b])
tf.close()
# =========================================
"""
Jdem načítat jednotlivé soubory a parsovat je.
Pro jednoduchost jsem veškeré argumenty naházel
do extrahuj.csv. Je tam jméno tar.gz souboru,
jméno n3 souboru v něm, seznam sloupců a název
výsledného souboru.
"""
print('Načítám data')
if not os.path.isdir('csv'):
os.mkdir('csv')
with open('extrahuj.csv') as cf:
cr = csv.reader(cf)
hd = next(cr)
ex = [{hd[j]: vl for j,vl in enumerate(row)} for row in cr]
for j, ee in enumerate(ex):
print('\nProcesuju %s (%d/%d)' % (ee['targz'], j+1, len(ex)))
with tarfile.open(ee['targz'], 'r:gz') as tf:
ff = tf.extractfile(ee['soubor'])
extrahuj(ff, ee['chcem'].split(', '), ee['cil'])
# Vazby
# =====
print('Načítám vazby')
with tarfile.open('./data/Rozhodnuti.n3.tar.gz', 'r:gz') as tf:
ff = tf.extractfile('./cedr/Rozhodnuti.n3')
cti_vazby(ff, 'rozpoctoveObdobi', 'csv/_rozpoctoveObdobi.csv')
with tarfile.open('./data/PrijemcePomoci.n3.tar.gz', 'r:gz') as tf:
ff = tf.extractfile('./cedr/PrijemcePomoci.n3')
cti_vazby(ff, 'obdrzelDotaci', 'csv/_obdrzelDotaci.csv')
with tarfile.open('./data/Dotace.n3.tar.gz', 'r:gz') as tf:
ff = tf.extractfile('./cedr/Dotace.n3')
cti_vazby(ff, 'byloRozhodnuto', 'csv/_byloRozhodnuto.csv')