| | |
| | | return bool(re.match(r'^-?\d+(\.\d+)?$', norm(v))) |
| | | |
| | | |
| | | def profile(cell, nrows, ncols, hits, city=None): |
| | | namecol = None |
| | | if '项ç®åç§°' in hits: |
| | | namecol = hits['项ç®åç§°'][0][1] |
| | | def _num_count(cell, nrows, col, start_row1): |
| | | """ç»è®¡è¯¥åå¨è¡¨å¤´è¡ä»¥ä¸çæ°å¼åå
æ ¼ä¸ªæ°ï¼ç¨äºåºååååï¼å¦ãèªå¼å§å»ºè®¾ç´¯è®¡å®ææèµãä¸ãâ¦æ°å¢å»ºçé¢ç§¯ãï¼ã""" |
| | | n = 0 |
| | | for r in range(start_row1, min(nrows, 800)): |
| | | v = cell(r, col) |
| | | if isinstance(v, (int, float)) and not isinstance(v, bool): |
| | | n += 1 |
| | | return n |
| | | |
| | | |
| | | def pick_columns(cell, nrows, ncols, merges=None, fields=None): |
| | | """æè¡¨å¤´å
³é®åå®ä½å â ({åæ®µ: 0 åºåå·}, hits)ã |
| | | |
| | | ä¸¤çº§è¡¨å¤´æ¶æ§ï¼è¥æå段çå½ä¸è½å¨**è·¨å¤åçåå¹¶åå
æ ¼**éï¼è¯´æå®æ¯ç»è¡¨å¤´ï¼ä¸è½ç´æ¥å½è¯¥å段çåï¼ |
| | | æ¤æ¶å¨æ¬åå¹¶åºå
æé¤ãå
¶å®åæ®µæ´æ·±çå表头ãæå çåï¼è¥åªå©å¯ä¸ä¸åï¼åè¯¥åææ¯æ¬å段çåã |
| | | ä¾ï¼éå·ãä¼ä¸ææ¥æ±æ»ãR5 ç»è¡¨å¤´ãèªå¹´åç´¯è®¡å®ææèµï¼ä¸å
ï¼ãåå¹¶ I5:K5ï¼ |
| | | å表头 I=æ¬å¹´è®¡åæèµãJ=å计ãK=å
¶ä¸ï¼æ¬æå®ææèµ â |
| | | ãèªå¹´å累计ãè½å¨ Jï¼ä¸æèµç³»ç» G åä¸è´ï¼ï¼è䏿¯ Iï¼é£æ¯æ¬å¹´è®¡åæèµï¼ã |
| | | """ |
| | | hits = scan_fields(cell, nrows, ncols) |
| | | fields = list(fields) if fields else [k for k, _ in FIELD_PAT] |
| | | best = {} |
| | | for f in fields: |
| | | if f not in hits: |
| | | continue |
| | | uniq, seen = [], set() |
| | | for h in sorted(hits[f], key=lambda h: (h[0], colindex(h[1]))): |
| | | if h[1] in seen: |
| | | continue |
| | | seen.add(h[1]); uniq.append(h) |
| | | # åååæ¶æ§ï¼ä¼å
ãè¡¨å¤´ä¸æ¹ççææ°åãçé£ä¸åã |
| | | # ä¾ï¼æ¦æ±ç©æµãèªå¼å§å»ºè®¾ç´¯è®¡å®ææèµï¼ä¸å
ï¼ãH ä¸ãèªå¼å§å»ºè®¾ç´¯è®¡æ°å¢å»ºçé¢ç§¯ãP ååï¼ |
| | | # åªæ H åææ°å â å Hï¼æâå½ä¸è¯æçâä¼éå Pï¼é£æ¯å»ºçé¢ç§¯ï¼ã |
| | | withnum = [h for h in uniq if _num_count(cell, nrows, colindex(h[1]), h[0]) > 0] |
| | | pool = withnum or uniq |
| | | best[f] = sorted(pool, key=lambda h: (h[0], colindex(h[1])))[0] |
| | | cols = {} |
| | | for f, h in best.items(): |
| | | row1, letter, _txt = h |
| | | c0 = colindex(letter) |
| | | span = 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 = 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 profile(cell, nrows, ncols, hits, city=None, merges=None): |
| | | cols, _ = pick_columns(cell, nrows, ncols, merges) |
| | | namecol = colname(cols['项ç®åç§°']) if '项ç®åç§°' in cols else None |
| | | data_start = data_end = None |
| | | project_rows = 0 |
| | | groups = [] |
| | |
| | | hi = segs[i + 1][0] if i + 1 < len(segs) else 10 ** 9 |
| | | break |
| | | if namecol is not None: |
| | | nc = colindex(namecol) |
| | | anchors = [colindex(hits[k][0][1]) for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ»æèµ') if k in hits] |
| | | nc = cols['项ç®åç§°'] |
| | | anchors = [cols[k] for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ»æèµ') if k in cols] |
| | | for r in range(min(nrows, 800)): |
| | | if not (lo <= r + 1 < hi): |
| | | continue |
| | |
| | | data_start = data_start or r + 1 |
| | | data_end = r + 1 |
| | | project_rows += 1 |
| | | return dict(namecol=namecol, data_start=data_start, data_end=data_end, |
| | | return dict(namecol=namecol, cols=cols, data_start=data_start, data_end=data_end, |
| | | project_rows=project_rows, groups=groups[:6], |
| | | city=city or '', city_row=city_row or '', segments=segs[:8], |
| | | header_rows=sorted({h[0] for v in hits.values() for h in v})) |
| | |
| | | sel = pick_sheet(open_sheets(p), ym=ym) |
| | | if sel: |
| | | nm, nr, nc, cell, hits = sel |
| | | pr = profile(cell, nr, nc, hits, city=file_city) |
| | | pr = profile(cell, nr, nc, hits, city=file_city, |
| | | merges=sheet_merges(p).get(nm, [])) |
| | | rec.update(å·¥ä½è¡¨=nm, 表头è¡=','.join(map(str, pr['header_rows'])), |
| | | æ°æ®èµ·=pr['data_start'], æ°æ®æ¢=pr['data_end'], |
| | | 项ç®è¡æ°=pr['project_rows'], åç§°å=pr['namecol'] or '', |
| | |
| | | å¸å·=pr['city'] or (file_city or ''), å¸å·è¡=pr['city_row'], |
| | | å¸å·æ®µ=';'.join('R%s:%s' % s for s in pr['segments'])) |
| | | for k in KEY: |
| | | if k in hits: |
| | | rec[k + 'å'] = hits[k][0][1] |
| | | if k in pr['cols']: |
| | | rec[k + 'å'] = colname(pr['cols'][k]) |
| | | except Exception as e: |
| | | rec['é误'] = '%s: %s' % (type(e).__name__, e) |
| | | rows.append(rec) |