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©:

  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©:

  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©:

  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©:

  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=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