#!/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 zmiennychimport os, sys, string, relicznikwierszy=dokument=0wierszewyjscia=[] # Lista wierszy do sortowania i dowolnej obrobki przed wypluciemzakres="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 Sprzedazyslownik={} # 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 opcjatry: 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 plikuwyjscie=open(plik_wyjscia, 'w')for wiersz in wierszewyjscia: wyjscie.write(wiersz)# Podsumowanieprint ""print "-----"print "Dokumentow:", dokumentprint "Wierszy:", licznikwierszyprint ""