Ребята , всем привет ! , спасибо вашему форуму , и всем кто помогал мне дописать этот скрипт
Каждый день обрабатываю логи , в архиве +100 тхт файлов
Скрипт работает по файловой системе (удаляет , сохраняет , объединяет, открывает , делает всё для результата )
Макрос ( module 1 ) каждый файл тхт всталяет как отдельный лист (страницу ) и на каждом листе делает Условное форматирование в столбце F
Макрос2 ( module 2 ) точно также вставляет файл из папки , ну только 1 , и удаляет строки по условию где сработало условное форматирование
Python
import os
import time
import tarfile
import sys
import subprocess
from pathlib import Path
import fileinput
import glob
#time.sleep(время в секундах ) пауза на несколько секунд
print('Скрипт начал начал работу , ждите окончание ')
path='C:\\Users\\g.nerovniy\\Desktop\\log1' #путь откуда берется ахрив .tar
path2='C:\\Users\\g.nerovniy\\Desktop\\log' #путь где будет происходить работа с файлами ( распаковка , удаление ,обьеденение )
print('Удаление ненужный файлов ')
directory='C:\\Users\\g.nerovniy\\Desktop\\log\\'# удаляются все файлы в папке
os.chdir(directory)
files=glob.glob('*.txt')#
for filename in files:#
os.unlink(filename)#
time.sleep(5) #
print("Готово! ")#
print("Копирование файлов , распаковка файлов ")#
for file_name in os.listdir(path):# распаковка архива с path в path2
base_name, ext = os.path.splitext(file_name)#
abs_file_name = os.path.join(path, file_name)#
tar = tarfile.open(abs_file_name, 'r' )#
tar.extractall(path2)#
name_file_ok = file_name[:-7]# срезаное имя файла , если 2020-01-01.tar.gz то 2020-01-01
time.sleep(3)#
print('Распаковка и копирование завершено!')
print('Запуск LibreOffice')
time.sleep(3)
command = ("C:/Program Files/LibreOffice/program/scalc.exe -norestore " )# запуск либр офис
p = subprocess.Popen(command)
print("Запуск макроса ")
time.sleep(5)
command = ("C:/Program Files/LibreOffice/program/scalc.exe macro:///standard.module1.main" )# запуск макроса
p = subprocess.Popen(command)
time.sleep(15)#
command = ("C:/Program Files/LibreOffice/program/scalc.exe macro:///standard.module1.delle" )# запуск второго макроса
p = subprocess.Popen(command)
print("Обьеденение файлов")
time.sleep(1) #
file_list = glob.glob("C:\\Users\\g.nerovniy\\Desktop\\log\\*.txt")#объеденение всех тхт файлов в один
with open('C:\\Users\\g.nerovniy\\Desktop\\log\\mismatching.txt', 'w') as file:#
input_lines = fileinput.input(file_list)#
file.writelines(input_lines)#
print("Обьеденение завершено ")
time.sleep(1) #
print('Удаление ненужный файлов ')#удаление всех файлов в папке начинаюищхся на 0
directory='C:\\Users\\g.nerovniy\\Desktop\\log\\'#
os.chdir(directory)#
files=glob.glob('0*.*')#
for filename in files:#
os.unlink(filename)#
time.sleep(1) #
print("Удаление завершено ")
print("Запуск LibreOffice ")
command = ("C:/Program Files/LibreOffice/program/scalc.exe -norestore " )#запуск либр офис
p = subprocess.Popen(command)
print("Запуск макроса")
time.sleep(3)
command = ("C:/Program Files/LibreOffice/program/scalc.exe macro:///standard.module2.main" )# запуск макроса их сторого модуля
p = subprocess.Popen(command)
time.sleep(15)#
command = ("C:/Program Files/LibreOffice/program/scalc.exe macro:///standard.module2.delsave" )#зупуск второго макроса
p = subprocess.Popen(command)
time.sleep(25)#
print("Готово! ")
print("Перемещение файлов по папкам")
okpath=name_file_ok+'.ods'# было 2020-01-01 стало 2020-01-01.ods
for path in Path('C:\\Users\\g.nerovniy\\Desktop\\').glob('Logi.ods'):# перенос файлов с рабочего стола , по папкам
path.replace(Path('C:\\Users\\g.nerovniy\\Desktop\\') / okpath)#
time.sleep(1)
for path in Path('C:\\Users\\g.nerovniy\\Desktop\\').glob('mis.ods')#:
path.replace(Path('C:\\Users\\g.nerovniy\\Desktop\\Mismatching\\') / okpath)#
print('Перемещение завершено!')
Libre calc Basic (если не ошибаюсь )
Module 1
private sub main
dim p$, f$, t$, rw&, cl&, a(), i&
dim wb as object, ws as object, c as object
p="C:\Users\g.nerovniy\Desktop\log\" 'путь откуда брать тхт файлы
f=dir(p+"*.txt")
if len(f) then wb=thiscomponent else exit sub
do
wb.sheets.insertnewbyname(f,i)
ws=wb.sheets(i):i=i+1:rw=0
open p+f for input as #1
do while not eof(#1)
line input #1, t
a=split(t)
for cl=0 to ubound(a)
c=ws.getcellbyposition(cl,rw)
select case cl
case 0 to 2, 5 to 7
c.setvalue(a(cl))
case else
c.setstring(a(cl))
end select
next
rw=rw+1
loop
close #1
setFormat ws, rw
f=dir
loop while len(f)
oDoc = ThisComponent
oDoc.Sheets.removeByName("Лист1")
end sub
sub setFormat(ws as object, rw&)
dim r as object, cf as object
r=ws.getcellrangebyname("f1:f"+rw)
cf=r.conditionalformat
condFormat "0.95", "" , "Good", 3, cf
condFormat "0.9", "0.95", "Neutral", 7, cf
condFormat "0.85", "0.8999", "Bad", 7, cf
condFormat "0", "0.85", "Error", 7, cf
r.conditionalformat=cf
End Sub
sub condFormat(formula1$, formula2$, style$, o&, cf as object)
dim p(3) As new com.sun.star.beans.PropertyValue
p(0).name="StyleName"
p(0).value=style
p(1).name="Operator"
p(1).value=o
p(2).name="Formula1"
p(2).value=formula1
if len(formula2) then
p(3).name="Formula2"
p(3).value=formula2
end if
cf.addnew(p)
' Application.Wait Time:=Now + TimeValue("0:00:02")
'delle
end sub
sub delle
odoc=thiscomponent
oSheet = oDoc.CurrentController.getActiveSheet()
myrows=oSheet.getrows
Dim args(0) As New com.sun.star.beans.PropertyValue
oDoc.storeToURL("file:///C:/Users/g.nerovniy/Desktop/Logi.ods", args())
oDoc.close(true)
end sub
Module 2
private sub main
dim p$, f$, t$, rw&, cl&, a(), i&
dim wb as object, ws as object, c as object
p="C:\Users\g.nerovniy\Desktop\log\"
f=dir(p+"*.txt")
if len(f) then wb=thiscomponent else exit sub
do
wb.sheets.insertnewbyname(f,i)
ws=wb.sheets(i):i=i+1:rw=0
open p+f for input as #1
do while not eof(#1)
line input #1, t
a=split(t)
for cl=0 to ubound(a)
c=ws.getcellbyposition(cl,rw)
select case cl
case 0 to 2, 5 to 7
c.setvalue(a(cl))
case else
c.setstring(a(cl))
end select
next
rw=rw+1
loop
close #1
setFormat ws, rw
f=dir
loop while len(f)
oDoc = ThisComponent
oDoc.Sheets.removeByName("Лист1")
end sub
sub setFormat(ws as object, rw&)
dim r as object, cf as object
r=ws.getcellrangebyname("f1:f"+rw)
cf=r.conditionalformat
condFormat "0.95", "" , "Good", 3, cf
condFormat "0.9", "0.95", "Neutral", 7, cf
condFormat "0.85", "0.8999", "Bad", 7, cf
condFormat "0", "0.85", "Error", 7, cf
r.conditionalformat=cf
End Sub
sub condFormat(formula1$, formula2$, style$, o&, cf as object)
dim p(3) As new com.sun.star.beans.PropertyValue
p(0).name="StyleName"
p(0).value=style
p(1).name="Operator"
p(1).value=o
p(2).name="Formula1"
p(2).value=formula1
if len(formula2) then
p(3).name="Formula2"
p(3).value=formula2
end if
cf.addnew(p)
end sub
sub delsave
odoc=thiscomponent
oSheet = oDoc.CurrentController.getActiveSheet()
myrows=oSheet.getrows
rowmax=3000
rowmin=0
For i=rowmax To rowmin step -1
textnd = osheet.getcellbyposition(5,i).string
If textnd >="0,95" Then
myrows.removebyindex(i,1)
End if
Next i
Dim args(0) As New com.sun.star.beans.PropertyValue
oDoc.storeToURL("file:///C:/Users/g.nerovniy/Desktop/mis.ods", args())
oDoc.close(true)
end sub
Если есть предложение как улучшить код , пишите ,буду рад
