#!/usr/bin/python # -*- coding: utf-8 -*- # kocio, 15.07.2005 # Skrypt do konwersji z plikow eksportu Handlu na listy adresow do korespondencji seryjnej # Zasadniczo ma wypluwac format taki, jak ze Sprzedazy, czyli pola rozdzielane srednikami, # zeby mozna bylo laczyc te eksporty i obrabiac lacznie. # # Na podstawie przykladow kodu z http://www.oreilly.com/catalog/lpython/chapter/ch09.html # Inicjalizacja zmiennych import os, sys, string, re licznikwierszy=dokument=0 wierszewyjscia=[] # Lista wierszy do sortowania i dowolnej obrobki przed wypluciem zakres="niewazny" # Proste sprawdzanie zakresu: w roznych zakresach powtarzaja sie niestety niektore nazwy # Slownik asocjacji kontrahent(id, kod)=>dokument(kodKH) do zamiany kodKH=kod->id, zeby bylo jak w Sprzedazy slownik={} # Czyszczenie ekranu - dla czytelnosci # os.system("clear") # Funkcja zwracajaca wartosc pola w danym wierszu def wartosc(ciag): pole = string.split(ciag,"=") try: # Pole wartosci, ciag tylko do 2 ostatnich znakow, zeby nie zlapac znaku nowego wiersza, czyli \r\n # ale uwaga: tylko pod POSIX-em! Pod Windows obcina za duzo. return pole[1][:-2] except IndexError: return "Blad: brak wartosci pola "+pole[0]+"!" # Funkcja zwracajaca liste osob z pola "opis" def osoby(ciag): # Wycinamy wszelkie opisy zaliczek: if re.search("zaliczk",ciag): return " " try: # Probujemy podzielic opis na poszczegolne osoby: listaosob = string.split(ciag,", ") try: # Probujemy zmienic kolejnosc imienia i nazwiska, zeby bylo jak w Sprzedazy: nowalistaosob=[] for osoba in listaosob: nazwisko = string.split(osoba)[0] imie = string.split(osoba)[1] osoba = imie + " " + nazwisko nowalistaosob.append(osoba) return nowalistaosob except IndexError: return " " except IndexError: return " " # Domyslne nazwy plikow, jesli nie podana jako opcja try: plik_wejscia=sys.argv[1] except IndexError: plik_wejscia="handel.txt" try: plik_wyjscia=sys.argv[2] except IndexError: plik_wyjscia="handelwynik.txt" # Nie ma skad brac, konczymy! try: wejscie = open(plik_wejscia, 'r') except IOError: print "Program zatrzymany, brak danych: podaj plik eksportu (domyslnie handel.txt)." print "Eksport z Handlu: wybieranie dokumentow szkolen przez Numer > FV*SZ*" sys.exit(0) # Glowna petla for wiersz in wejscie.readlines(): licznikwierszy+=1 # Przede wszystkim ustalamy, w zakresie ktorej sekcji jestesmy if re.match("Dokument{", wiersz): # Licznik na ekranie =} dokument+=1 print str(dokument) + "." zakres="dokument" elif re.match("Kontrahent{", wiersz): zakres="kontrahent" elif re.match("INFO{", wiersz) or re.match("Magazyn{", wiersz) or re.match("Towar{", wiersz): zakres="niewazny" # W sekcji "kontrahent" interesuje nas tylko cyfrowy "id" i alfanumeryczny "kod" elif (zakres=="kontrahent"): if re.match('\tid', wiersz): idKH=wartosc(wiersz) if re.match('\tkod', wiersz): # Budujemy slownik miedzy id-em a kodem kontrahenta slownik[wartosc(wiersz)]=[idKH] # W sekcji "dokument" zbieramy wiekszosc pol elif (zakres=="dokument"): if re.match('\tkodKH', wiersz): # Podmieniamy przez slownik nazwe na id [idKH]=slownik[wartosc(wiersz)] tempwierszwyjscia=idKH+";" # Zbieramy pola jak leci i doklejamy do lancucha, pozniej sie posortuje, kolejnosc w eksporcie i tak jest stala if re.match('\tkhnazwa', wiersz) or re.match('\tkhadres', wiersz) or re.match('\tkhdom', wiersz) or re.match('\tkhlokal', wiersz) or re.match('\tkhmiasto', wiersz) or re.match('\tkhkodpocz', wiersz) or re.match('\topis', wiersz): tempwierszwyjscia=tempwierszwyjscia+wartosc(wiersz)+";" # print "*", wartosc(wiersz) # Pole z nazwa katalogu jest ostatnie, wiec robimy juz caly wiersz if re.match ('\tNazwaKatalogu', wiersz): tempwierszwyjscia=tempwierszwyjscia+wartosc(wiersz)+";" #print "*", wartosc(wiersz) # Zmienimy kolejnosc pol 6 i 7 (kod i miasto), zeby bylo jak w Sprzedazy; # najpierw dzielimy na pola: pole = string.split(tempwierszwyjscia,";") # a teraz dla kazej osoby produkujemy osobny wiersz for osoba in osoby(pole[7]): #print "**", str(osoba) # poniewaz pola liczymy od 0, wiec faktycznie zamieniamy 5 i 6: wierszwyjscia = pole[0]+";"+pole[1]+";"+pole[2]+";"+pole[3]+";"+pole[4]+";"+pole[6]+";"+pole[5]+";"+osoba+";"+pole[8]+"\r\n" # wierszwyjscia = tempwierszwyjscia+str(osoba)+"\r\n" # na koncu tworzymy zwykla liste gotowych wierszy wyjscia, bez kolejnosci wierszewyjscia.append(wierszwyjscia) # Mamy juz liste wszystkich wierszy, wiec ja obrobmy, na przyklad posortujmy # wierszewyjscia.sort() # Wynik wypisujemy do pliku wyjscie=open(plik_wyjscia, 'w') for wiersz in wierszewyjscia: wyjscie.write(wiersz) # Podsumowanie print "" print "-----" print "Dokumentow:", dokument print "Wierszy:", licznikwierszy print ""