
| Current Path : /proc/thread-self/root/home/ift/52_procpy/fibu/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : //proc/thread-self/root/home/ift/52_procpy/fibu/ktocsv.py |
# coding: utf
import os,re,sys,time,glob
#******************************************************************************
class Ktocsv ():
def __init__ (self,*pars):
if pars[0] == "__main__" and len(pars) > 1:
self.__class__.__dict__[pars[1]](self,*pars[2:])
return(None)
#******************************************************************************
def mark (self,remark=""):
t = time.perf_counter()
if 't0' in vars(self):
print ( ("%9.2f" % ((t-self.t0)*1000)) + " ms for: " + remark )
self.t0 = t
#******************************************************************************
def s (self,file=None,skip_input=None): # sort kto
zeilen = {}
tage = []
try:
zeilen0 = open(file).read().split("\n")
except:
zeilen0 = []
if not skip_input:
for zeile in sys.stdin:
zeilen0.append(zeile.strip())
for zeile in zeilen0:
zeile = re.sub(r"^(\d\d\d\d\d\d\d\d) +\-?(\d+\.\d\d) +\-?(\d+\.\d\d) +","",zeile)
if zeile.strip() == "":
continue
betrag = " "
while (0 == 0):
if "vorgemerkt" in zeile or "nfangssaldo\"" in zeile or "ndsaldo\"" in zeile:
break
m = re.search(";\"?([\-\+]?\d+)[\,\.](\d\d)\"?($|;\"?EUR|; +;|;\"?H|;\"?S)",zeile)
if m:
betrag = "%9.2f" % ((1-int("S" in m.group(3))*2)*float(m.group(1)+"."+m.group(2)))
break
m = re.search(";\"?([\-\+]?\d+)\.(\d\d\d)\,(\d\d)\"?($|;\"?EUR|; +;|;\"?H|;\"?S)",zeile)
if m:
betrag = "%9.2f" % ((1-int("S" in m.group(4))*2)*float(m.group(1)+m.group(2)+"."+m.group(3)))
break
m = re.search("[\; \"]([\-\+]?\d+)[\,\.](\d\d)[\; \"]",zeile)
if m:
betrag = "%9.2f" % (float(m.group(1)+"."+m.group(2)))
break
break
datum = "00000000"
while (0 == 0):
m = re.search("^\S+ +(20\d\d)(\d\d)(\d\d)(\D|$)",zeile)
if m and int(m.group(2)+m.group(3)) > 0:
datum = m.group(1) + m.group(2) + m.group(3)
break
m = re.search("^\S+ (\D*)(\d\d)\.(\d\d)\.(20|)(\d\d)(\D|$)",zeile)
if m:
datum = m.group(4) + m.group(5) + m.group(3) + m.group(2)
break
m = re.search("\"?(\d\d)\.(\d\d)\.(20|)(\d\d)[\"\.\,\;]",zeile)
if m:
datum = "20" + m.group(4) + m.group(2) + m.group(1)
break
betrag = " "
break
if not datum in zeilen:
zeilen[datum] = []
tage.append(datum)
zeilen[datum].append([betrag,zeile])
tage.sort()
sum = 0.00
text = []
zeile0 = []
for datum in tage:
if datum == "00000000":
continue
for entry in zeilen[datum]:
betrag = entry[0]
zeile = entry[1]
# print(zeile0)
# print(zeile)
# print("")
zeile1 = re.sub(r"^(\d\d\d\d\d\d\d\d) +\-?(\d+\.\d\d) +\-?(\d+\.\d\d) +","",zeile)
# print(zeile1)
zeile1 = re.sub(r"^([a-zA-Z\_\-\.0-9]+).csv\: +","",zeile1)
# print("-",zeile)
# print(".",zeile1)
if zeile1 in zeile0:
continue
zeile0.append(zeile1)
if "." in betrag or "," in betrag:
sum = "%11.2f" % (float(sum) + float(betrag))
zeile1 = sum + " " + betrag + " " + zeile
else:
zeile1 = " " + " " + betrag + " " + zeile
text.append(datum + " " + zeile1)
if len(text) > 0:
text = "\n".join(text)
try:
open(file,"w").write(text+"\n")
except:
print(text)
#**************************************************************************
def x (self,files="**.csv"): # extract files
if os.path.isdir(files):
files = re.sub("//","/",files + "/**.csv")
text0 = []
files1 = []
files = re.sub(r"\\","",files,99)
for pattern in self.pattern_expand(files).split(","):
for file in glob.glob(pattern):
files1.append(file)
open("__csv__","w").write("\n".join(files1)+"\n")
for file in files1:
file1 = re.sub(r"^(.*)\/(.*)$","\\2",file)
for zeile in open(file).read().split("\n"):
zeile = zeile.strip()
if zeile == "":
continue
zeile = re.sub(r"^(\d\d\d\d\d\d\d\d) +\-?(\d+\.\d\d) +\-?(\d+\.\d\d) +","",zeile)
if not re.search(r"^(\S+)\.csv\: +",zeile):
zeile = file1 + ": " + zeile
print(zeile)
#**************************************************************************
def lohn (self,files=None): # extract salary slips
werte = {}
bezeichnung = {}
monat = "000000"
zeilen = []
if files:
files = re.sub(r"\\","",files,99)
for pattern in self.pattern_expand(files).split(","):
for file in glob.glob(pattern):
for zeile in open(file).read().split("\n"):
zeilen.append(zeile,strip())
else:
for zeile in sys.stdin:
zeilen.append(zeile.strip())
for zeile in zeilen:
m = re.search(r"^([A-Z][A-Z]\S*) +(\-?\d+\.\d\d) +(\-?\d+\.\d\d) +(\-?\d+\.\d\d) +(.*?)$",zeile.strip())
if m:
if not m.group(1) in werte:
werte[m.group(1)] = 0.00
bezeichnung[m.group(1)] = m.group(5)
werte[m.group(1)] = werte[m.group(1)] + float(m.group(2)) + float(m.group(3))
continue
m = re.search(r"^(LOHN-AN) +(\-?\d+\.\d\d) +(\S+)",zeile.strip())
if m:
if "KUG" in m.group(3):
art = "LOHN-KUG"
else:
art = "LOHN-AN"
if not art in werte:
werte[art] = 0.00
bezeichnung[art] = "Gehalt " + art
werte[art] = werte[art] + float(m.group(2))
continue
m = re.search(r" (\d\d)/(\d\d\d\d)[, ]",zeile)
if m and int(m.group(2)+m.group(1)) > int(monat):
monat = m.group(2)+m.group(1)
for art in werte:
print(monat+" " + ("%13.2f" % werte[art]) + " " + bezeichnung[art])
#**************************************************************************
def d (self,files="**.csv"): # subtract file, difference
if os.path.isdir(files):
files = re.sub("//","/",files + "/**.csv")
try:
files1 = open("__csv__").read()
except:
files1 = ""
files1 = files1.split("\n")
text0 = []
files = re.sub(r"\\","",files,99)
for pattern in self.pattern_expand(files).split(","):
for file in glob.glob(pattern):
if file in files1:
continue
for zeile in open(file).read().split("\n"):
zeile = zeile.strip()
if zeile == "":
continue
zeile = re.sub(r"^(\d\d\d\d\d\d\d\d) *\-?(\d+\.\d\d) +\-?(\d+\.\d\d) +","",zeile)
zeile1 = re.sub(r"^(\S+)\: +","",zeile)
text0.append(zeile1)
text = []
for zeile in sys.stdin:
# print("xxx",zeile)
zeile = zeile.strip()
zeile = re.sub(r"^(\d\d\d\d\d\d\d\d) *\-?(\d+\.\d\d) +\-?(\d+\.\d\d) +","",zeile)
zeile1 = re.sub(r"^(\S+)\: +","",zeile)
if not zeile1 in text0:
text.append(zeile)
if len(text) > 0:
print("\n".join(text))
#**************************************************************************
def qd (self,files="**.csv"):
self.q(files,1)
#**************************************************************************
def q (self,files="**.csv",dryrun=0): # the content of one file is subtracted to all chosen files
if os.path.isdir(files):
files = re.sub("//","/",files + "/**.csv")
text0 = []
for zeile in sys.stdin:
zeile = zeile.strip()
if zeile == "":
continue
zeile = re.sub(r"^(\d\d\d\d\d\d\d\d) +\-?(\d+\.\d\d) +\-?(\d+\.\d\d) +","",zeile)
zeile1 = re.sub(r"^(\S+)\: +","",zeile)
text0.append(zeile1)
files = re.sub(r"\\","",files,99)
for pattern in self.pattern_expand(files).split(","):
for file in glob.glob(pattern):
text = []
zaehler = 0 # Anzahl der Zeilen, die nicht uebernommen werden
for zeile in open(file).read().split("\n"):
zeile = zeile.strip()
zeile = re.sub(r"^(\d\d\d\d\d\d\d\d) +\-?(\d+\.\d\d) +\-?(\d+\.\d\d) +","",zeile)
zeile1 = re.sub(r"^(\S+)\: +","",zeile)
if not zeile1 in text0:
if not zeile.strip() == "":
text.append(zeile)
else:
zaehler = zaehler + 1
if zaehler > 0:
print(file,"has changed",len(text),"/",zaehler)
if dryrun == 0:
open(file,"w").write("\n".join(text)+"\n")
self.s(file,".")
#**************************************************************************
def pattern_expand (self,patterns):
new_pattern = []
for pattern in patterns.split(","):
if "**" in pattern:
pattern1 = ( re.sub(r"\*\*","*",pattern) + "," +
re.sub(r"\*\*","*/*",pattern) + "," +
re.sub(r"\*\*","*/*/*",pattern) + "," +
re.sub(r"\*\*","*/*/*/*",pattern) + "," +
re.sub(r"\*\*","*/*/*/*/*",pattern) + "," +
re.sub(r"\*\*","*/*/*/*/*/*",pattern) + "," +
re.sub(r"\*\*","*/*/*/*/*/*/*",pattern) )
new_pattern.append(pattern1)
else:
new_pattern.append(pattern)
return(",".join(new_pattern))
#**************************************************************************
def join (self):
zeile0 = ""
for file in sys.stdin:
file1 = file.strip()
text = open(file1).read()
text1 = ""
zeile0 = ""
for zeile in text.split("\n"):
zeile = zeile.strip()
if re.search(r"^\"\d\d\.\d\d\.\d\d\d\d\"",zeile):
text1 = text1 + zeile0 + "\n"
zeile0 = zeile
else:
zeile0 = zeile0 + zeile
open(file1+"~","w").write(text)
open(file1,"w").write(text1)
#**************************************************************************
if __name__ == "__main__":
Ktocsv(*tuple(["__main__"]+sys.argv[1:]))