| | |
| | | return str(v) |
| | | |
| | | |
| | | def pick_columns(cell, nrows, ncols): |
| | | """æè¡¨å¤´å
³é®åå®ä½åï¼åä¸å段å½ä¸å¤æ¬¡æ¶ï¼åâè¡å·æå°ãå
¶æ¬¡æ¯å½ä¸è¯æçâçé£ä¸ªã""" |
| | | def pick_columns(cell, nrows, ncols, merges=None): |
| | | """æè¡¨å¤´å
³é®åå®ä½åï¼åä¸å段å½ä¸å¤æ¬¡æ¶ï¼åâè¡å·æå°ãå
¶æ¬¡æ¯å½ä¸è¯æçâçé£ä¸ªã |
| | | |
| | | 两级表头ï¼ç»è¡¨å¤´ï¼å¤çï¼è¥æå段çå½ä¸è½å¨**è·¨å¤åçåå¹¶åå
æ ¼**éï¼è¯´æå®æ¯ç»è¡¨å¤´ï¼ |
| | | ä¸è½ç´æ¥å½æè¯¥å段çåï¼æ¤æ¶å¨æ¬åå¹¶åºå
æé¤âå
¶å®åæ®µæ´æ·±çå表头âæå çåï¼ |
| | | è¥åªå©å¯ä¸ä¸åï¼å该åå°±æ¯æ¬å段çåã |
| | | ä¾ï¼éå·ãä¼ä¸ææ¥æ±æ»ãR5 ç»è¡¨å¤´ãèªå¹´åç´¯è®¡å®ææèµï¼ä¸å
ï¼ãåå¹¶ I:J:Kï¼ |
| | | å表头 I=æ¬å¹´è®¡åæèµï¼ä¸å
ï¼ãJ=å计ãK=å
¶ä¸ï¼æ¬æå®ææèµ â |
| | | ãèªå¹´å累计ãåºè½å¨ Jï¼ä¸æèµç³»ç» G å 5507.5 ä¸è´ï¼ï¼è䏿¯ Iï¼8000ï¼é£å
¶å®æ¯æ¬å¹´è®¡åæèµï¼ã |
| | | """ |
| | | hits = F.scan_fields(cell, nrows, ncols) |
| | | cols = {} |
| | | best = {} |
| | | for f in FIELDS: |
| | | if f not in hits: |
| | | continue |
| | | best = sorted(hits[f], key=lambda h: (h[0], len(h[2])))[0] |
| | | cols[f] = F.colindex(best[1]) |
| | | if f in hits: |
| | | best[f] = sorted(hits[f], key=lambda h: (h[0], len(h[2])))[0] |
| | | cols = {} |
| | | for f, h in best.items(): |
| | | row1, letter, _txt = h |
| | | c0 = F.colindex(letter) |
| | | span = F.merge_span(merges, row1, c0) |
| | | if span and (span[1] - span[0]) > 1: |
| | | taken = set() |
| | | for f2, h2 in best.items(): |
| | | if f2 == f or h2[0] <= row1: |
| | | continue |
| | | c2 = F.colindex(h2[1]) |
| | | if span[0] <= c2 < span[1]: |
| | | taken.add(c2) |
| | | free = [c for c in range(span[0], span[1]) if c not in taken] |
| | | if len(free) == 1: |
| | | cols[f] = free[0] |
| | | continue |
| | | cols[f] = c0 |
| | | return cols, hits |
| | | |
| | | |
| | | def parse_sheet(cell, nrows, ncols, city=None): |
| | | def parse_sheet(cell, nrows, ncols, city=None, merges=None): |
| | | """è§£æä¸å¼ å·¥ä½è¡¨ â (项ç®è¡å表, 段信æ¯, æ ¡éªä¿¡æ¯)""" |
| | | cols, hits = pick_columns(cell, nrows, ncols) |
| | | cols, hits = pick_columns(cell, nrows, ncols, merges) |
| | | namec = cols.get('项ç®åç§°') |
| | | if namec is None: |
| | | return [], {}, {} |
| | |
| | | bodies = [a.body] if a.body else ['客è¿ï¼å®¢è¿ç«ï¼', 'ç©æµï¼ç©æµååºï¼'] |
| | | md = '%dæ' % int(a.month.split('-')[1]) |
| | | |
| | | records, report = [], [] |
| | | records, report, checks = [], [], [] |
| | | report.append('# å¸å·ææ¥è§£ææ¥åï¼%sï¼' % a.month) |
| | | report.append('') |
| | | report.append('ï¼åªè¯»è§£æï¼ä¸è¡ä¸ä¸ªé¡¹ç®è¡ï¼æç»è§åå `.tsv`ï¼') |
| | |
| | | sel = F.pick_sheet(sheets, ym=ym) |
| | | if not sel: |
| | | report.append('| %s | ï¼æªéä¸å·¥ä½è¡¨ï¼ | | | | | |' % f[:44]) |
| | | checks.append({'åç±»': body_key, 'å¸å·': city_file or '', 'æä»¶': f, 'å·¥ä½è¡¨': '', |
| | | 'ç¶æ': 'æªéä¸å·¥ä½è¡¨', '项ç®è¡æ°': 0, 'ä¸è´æ§': 'â'}) |
| | | continue |
| | | nm, nr, nc, cell, _hits = sel |
| | | rows, seg, extra = parse_sheet(cell, nr, nc, city=city_file) |
| | | merges = F.sheet_merges(path).get(nm, []) |
| | | rows, seg, extra = parse_sheet(cell, nr, nc, city=city_file, merges=merges) |
| | | city = seg.get('å¸å·') or city_file or city_by_override(f) or '' |
| | | sums = {k: sum(num(r.get(k)) or 0 for r in rows) for k in NUM_FIELDS} |
| | | sub = extra.get('å°è®¡å计è¡') or {} |
| | | sub_txt, ok = [], 'â' |
| | | if not sub and extra.get('å¸å·è¡å¼'): |
| | | sub = {'R%s(å¸å·è¡)' % (seg.get('å¸å·è¡') or '?'): extra['å¸å·è¡å¼']} |
| | | tok = tval = None |
| | | if sub: |
| | | key, val = pick_total(sub) |
| | | tok, tval = key, val |
| | | sub_txt.append('%s=%s' % (key, '/'.join(pretty(val.get(k)) for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ')))) |
| | | if len(sub) > 1: |
| | | sub_txt.append('ï¼å¦æ %d è¡å°è®¡/å计ï¼' % (len(sub) - 1)) |
| | | same = all(abs((val.get(k) or 0) - sums[k]) < 0.05 |
| | | for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ')) |
| | | ok = 'â
ä¸è´' if same else 'â ï¸ ä¸ä¸è´' |
| | | ck = {'åç±»': body_key, 'å¸å·': city, 'æä»¶': f, 'å·¥ä½è¡¨': nm, 'ç¶æ': 'OK', |
| | | '项ç®è¡æ°': len(rows), 'å计è¡': '', 'ä¸è´æ§': ok} |
| | | for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ'): |
| | | ck['æ±å_' + k] = sums[k] |
| | | if sub: |
| | | ck['å计è¡'] = tok |
| | | for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ'): |
| | | ck['å计_' + k] = tval.get(k) |
| | | checks.append(ck) |
| | | report.append('| %s | %s | %s | %d | %s | %s | %s |' % ( |
| | | f[:44], nm[:14], city, len(rows), |
| | | '/'.join(pretty(sums[k]) for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ')), |
| | |
| | | records.append(rec) |
| | | except Exception as e: |
| | | report.append('| %s | ï¼è§£æå¤±è´¥ï¼%s: %sï¼ | | | | | |' % (f[:44], type(e).__name__, str(e)[:60])) |
| | | checks.append({'åç±»': body_key, 'å¸å·': city_file or '', 'æä»¶': f, 'å·¥ä½è¡¨': '', |
| | | 'ç¶æ': 'è§£æå¤±è´¥ï¼%s: %s' % (type(e).__name__, str(e)[:80]), |
| | | '项ç®è¡æ°': 0, 'ä¸è´æ§': 'â'}) |
| | | report.append('') |
| | | |
| | | # å¸å·æ±æ»ï¼è·¨æä»¶åå¹¶åå¸å·ï¼ |
| | |
| | | *(pretty(s[f]) for f in ('æ»æèµ', 'èªå¼å§å»ºè®¾ç´¯è®¡', 'æ¬å¹´è®¡åæèµ', 'èªå¹´å累计', 'æ¬æå®æ')))) |
| | | report.append('') |
| | | |
| | | ck_cols = ['åç±»', 'å¸å·', 'æä»¶', 'å·¥ä½è¡¨', 'ç¶æ', '项ç®è¡æ°', 'ä¸è´æ§', 'å计è¡', |
| | | 'æ±å_èªå¼å§å»ºè®¾ç´¯è®¡', 'æ±å_èªå¹´å累计', 'æ±å_æ¬æå®æ', |
| | | 'å计_èªå¼å§å»ºè®¾ç´¯è®¡', 'å计_èªå¹´å累计', 'å计_æ¬æå®æ'] |
| | | p_ck = os.path.join(out, 'è§£ææ ¡éª_%s.tsv' % a.month) |
| | | with io.open(p_ck, 'w', encoding='utf-8-sig') as fh: |
| | | fh.write('\t'.join(ck_cols) + '\n') |
| | | for c in checks: |
| | | fh.write('\t'.join(pretty(c.get(k, '')) if isinstance(c.get(k), float) else str(c.get(k, '')) |
| | | for k in ck_cols) + '\n') |
| | | print('æ ¡éªè®°å½æ° = %d' % len(checks)) |
| | | |
| | | cols = ['åç±»', 'å¸å·', 'æä»¶', 'å·¥ä½è¡¨', 'è¡å·', 'åºå·', 'åç±»'] + FIELDS |
| | | tsv = os.path.join(out, 'è§£æç»æ_%s.tsv' % a.month) |
| | | with io.open(tsv, 'w', encoding='utf-8-sig') as fh: |
| | |
| | | print('项ç®è¡å计 = %d' % len(records)) |
| | | print('wrote', p_md) |
| | | print('wrote', tsv) |
| | | print('wrote', p_ck) |
| | | |
| | | |
| | | if __name__ == '__main__': |