meta data for this page
  •  

Ez a dokumentum egy előző változata!


#!/bin/bash
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT_FILE="${1:-tsm_output_${TIMESTAMP}.xlsx}"
shopt -s nullglob
OUT_FILES=("$SCRIPT_DIR"/*.out)
shopt -u nullglob
if [ ${#OUT_FILES[@]} -eq 0 ]; then
    echo "HIBA: Nem talalhato .out fajl: $SCRIPT_DIR"
    exit 1
fi
python3 -c "import openpyxl" 2>/dev/null || pip3 install openpyxl --quiet --break-system-packages 2>/dev/null || pip3 install openpyxl --quiet --user
python3 - "$SCRIPT_DIR" "$OUTPUT_FILE" << 'PYEOF'
import os, sys, re, csv
from io import StringIO
from pathlib import Path
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter

def convert_value(val):
    """Szöveget számmá alakít ha lehet."""
    if not val or not isinstance(val, str):
        return val
    val = val.strip()
    if not val:
        return val
    # Ezres elválasztó vessző eltávolítása (pl. "1,234.56" -> "1234.56")
    # De csak ha tizedesponttal van (angol formátum)
    cleaned = val
    if ',' in val and '.' in val:
        # Angol formátum: 1,234.56
        cleaned = val.replace(',', '')
    elif ',' in val and '.' not in val:
        # Lehet magyar formátum (1.234,56) vagy sima ezres (1,234)
        # Ellenőrizzük, hogy a vessző után 3 számjegy van-e (ezres elválasztó)
        parts = val.split(',')
        if len(parts) == 2 and len(parts[1]) == 3 and parts[1].isdigit():
            # Ezres elválasztó: 1,234 -> 1234
            cleaned = val.replace(',', '')
        elif len(parts) == 2 and parts[1].replace('-','').isdigit():
            # Magyar tizedes: 1234,56 -> 1234.56
            cleaned = val.replace(',', '.')
    
    # Próbáljuk int-ként
    try:
        if '.' not in cleaned and cleaned.lstrip('-').isdigit():
            return int(cleaned)
    except:
        pass
    
    # Próbáljuk float-ként
    try:
        f = float(cleaned)
        # Ha egész szám, int-ként adjuk vissza
        if f == int(f) and abs(f) < 1e15:
            return int(f)
        return f
    except:
        pass
    
    return val

def remove_hdr(c):
    ls=c.split('\n');r=[];ds=False
    for l in ls:
        if 'ANS8000I' in l:ds=True;continue
        if l.strip().startswith('ANS800'):continue
        if not ds:
            if any(x in l for x in ['IBM Spectrum','Command Line','(c) Copyright','Session established','Server Version','Server date','Last access']):continue
            if l.strip()=='' and not r:continue
        if ds:r.append(l)
    if not r:r=[l for l in ls if not any(x in l for x in ['IBM Spectrum','Command Line','(c) Copyright','Session established','Server Version','Server date','Last access'])]
    return '\n'.join(r)

def parse_fw(c):
    ls=c.split('\n');di=None
    for i,l in enumerate(ls):
        if re.match(r'^[\s-]+$',l) and l.count('-')>10:di=i;break
    if di is None or di==0:return None
    hl=ls[:di];dl=ls[di];dls=ls[di+1:]
    cp=[];ind=False;st=0
    for i,ch in enumerate(dl):
        if ch=='-' and not ind:ind=True;st=i
        elif ch!='-' and ind:ind=False;cp.append((st,i))
    if ind:cp.append((st,len(dl)))
    if not cp:return None
    hd=[]
    for s,e in cp:
        pts=[]
        for h in hl:
            if len(h)>s:
                p=h[s:min(e,len(h))].strip().replace('-','')
                if p:pts.append(p)
        hd.append(' '.join(pts))
    res=[hd];cr=None
    for l in dls:
        if not l.strip() or l.strip().startswith('ANS'):continue
        fc=l[:cp[0][1]].strip() if cp else ''
        ic=(fc=='' and l.strip())
        if ic and cr:
            for idx,(s,e) in enumerate(cp):
                if len(l)>s:
                    cl=l[s:min(e,len(l))].strip()
                    if cl:
                        if cr[idx].endswith('-'):cr[idx]=cr[idx][:-1]+cl
                        elif cr[idx]:cr[idx]+=cl
                        else:cr[idx]=cl
        else:
            if cr:res.append([convert_value(re.sub(r'-\s*','',x).strip()) for x in cr])
            cr=[]
            for s,e in cp:cr.append(l[s:min(e,len(l))].strip() if len(l)>s else '')
    if cr:res.append([convert_value(re.sub(r'-\s*','',x).strip()) for x in cr])
    return res

def parse_csv(c):
    ls=c.strip().split('\n');r=[]
    for l in ls:
        if not l.strip() or l.strip().startswith('ANS'):continue
        try:
            rd=csv.reader(StringIO(l))
            for rw in rd:
                if rw:r.append([convert_value(x.strip()) for x in rw])
        except:r.append([convert_value(x.strip().strip('"')) for x in l.split(',')])
    return r if r else None

def parse_sys(c):
    secs=re.split(r'\*{10,}',c);ad=[]
    for s in secs:
        s=s.strip()
        if not s:continue
        tm=re.search(r'---> (.+?)(?:\n|$)',s)
        t=tm.group(1).strip() if tm else ""
        tb=parse_fw(s)
        if tb and len(tb)>1:
            for i,r in enumerate(tb):r.insert(0,"Section" if i==0 else t)
            ad.extend(tb if not ad else tb[1:])
    return ad if ad else None

def detect(c):
    c=remove_hdr(c)
    if not c.strip():return None
    if '***' in c and '--->' in c:return parse_sys(c)
    ls=c.split('\n')
    for l in ls[:20]:
        if re.match(r'^[\s-]+$',l) and l.count('-')>10:return parse_fw(c)
    cc=sum(1 for l in ls[:10] if ',' in l)
    if cc>3:return parse_csv(c)
    return [[convert_value(l.strip())] for l in ls if l.strip()]

def sn(fn):
    n=Path(fn).stem
    if '_' in n:p=n.split('_',1);n=p[1] if len(p)>1 and p[1] else n
    for c in ['\\','/','*','?',':','[',']']:n=n.replace(c,'_')
    return n[:31]

sd=Path(sys.argv[1]);of=sd/sys.argv[2];fs=sorted(sd.glob('*.out'))
if not fs:print("HIBA");sys.exit(1)
print(f"Talaltam {len(fs)} .out fajlt")
wb=Workbook();wb.remove(wb.active)
hf=PatternFill(start_color='4472C4',end_color='4472C4',fill_type='solid')
hfn=Font(bold=True,color='FFFFFF')
bd=Border(left=Side(style='thin'),right=Side(style='thin'),top=Side(style='thin'),bottom=Side(style='thin'))
un={}
for f in fs:
    print(f"  Feldolgozas: {f.name}")
    try:ct=open(f,'r',encoding='utf-8',errors='replace').read()
    except Exception as e:print(f"    HIBA: {e}");continue
    dt=detect(ct)
    if not dt:dt=[[l] for l in ct.split('\n') if l.strip()][:100]
    if not dt:continue
    bs=sn(f.name);nm=bs;cn=1
    while nm in un:nm=f"{bs[:28]}_{cn}";cn+=1
    un[nm]=True
    ws=wb.create_sheet(title=nm)
    for ri,rw in enumerate(dt,1):
        for ci,cl in enumerate(rw,1):
            ws.cell(ri,ci,value=cl)
            if ri==1:ws.cell(ri,ci).font=hfn;ws.cell(ri,ci).fill=hf;ws.cell(ri,ci).alignment=Alignment(wrap_text=True)
            ws.cell(ri,ci).border=bd
    for ci in range(1,ws.max_column+1):
        mx=max((len(str(c.value or '')) for c in ws[get_column_letter(ci)]),default=10)
        ws.column_dimensions[get_column_letter(ci)].width=min(mx+2,50)
    if len(dt)>1:ws.auto_filter.ref=ws.dimensions
    ws.freeze_panes='A2'
wb.save(of)
print(f"\nKesz! {of}")
print(f"Osszesen {len(wb.sheetnames)} munkalap")
PYEOF