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