Receita: csv2ldif
Ao mudar meu cliente de e-mail de Outlook Express para Thunderbird, encontrei uma dificuldade para passar meu address book de um para outro. O Thunderbird estava lendo o arquivo CSV (exportado do OE) e as informações ficavam todas bagunçadas. A solução que encontrei foi fazer um pequeno script que faz a conversão do formato CSV para LDIF, que pelo que vi, é o padrão do Thunderbird.
O que o script faz é simplesmente ler linha por linha o arquivo CSV e guardar estas informações em um arquivo LDIF.
O script usa Tkinter (não seria necessário, mas fiz apenas para deixar uma interface gráfica com o usuário. Note que no formato CSV deve ser seguida determinada ordem, ou então será necessário mexer no script. Outro item importante é cuidar para que nos campos de endereço, por exemplo, não tenha <ENTER> pressionado, separando uma linha e outra (endereço e cidade ou bairro, por exemplo), pois isso pode "quebrar" uma linha no arquivo e certamente ocorrerá um erro no tratamento...
Quem quiser melhorar, pode postar novos códigos ou alterações abaixo, certamente serão bem-vindos!
Código
1 #!/usr/bin/env python
2
3 #-----------------------------------------------------------------------------
4 # Name: csv2ldif.py
5 # Purpose: gerar um arquivo com formato LDIF (address book do Thunderbird) a partir de um arquivo CSV (formato alternativo de exportação do Outlook Express)
6 #
7 # Author: Fabiano Charlier Ahlert
8 #
9 # Created: 2006/06/12
10 # RCS-ID: $Id: module1.py $
11 # Copyright: (c) 2006
12 # Licence: GPL
13 # New field: Ver observações abaixo
14 #-----------------------------------------------------------------------------
15 # Desenvolvido por Fabiano Charlier Ahlert
16 # Instruções
17 # Copie este arquivo para a mesma pasta do arquivo CSV a ser convertido
18 # e execute-o
19 # Este programa realiza a conversão de arquivos CSV (gerados pelo Outlook
20 # a partir do bloco de endereços) para arquiso LDIF (arquivo para importação
21 # para o bloco de endereços do Mozilla
22 # as colunas do arquivo CSV devem estar na seguinte ordem:
23 # Nome;Sobrenome;Segundo nome;Nome;End. de email;Telefone residencial;Fax residencial;Telefone celular;Rua do endereço comercial;Cidade do endereço comercial;CEP do endereço comercial;Estado do endereço comercial;País/região do endereço comercial;Telefone comercial;Fax comercial;Empresa
24 # se o seu arquivo tiver uma estrutura diferente, faça as devidas alterações.... ;-)
25
26 from Tkinter import *
27
28 def converte(self):
29 Label(frame1, text="Lendo a linha de número:").grid(row=2, column=1, columnspan=3, sticky=W)
30 a_csv=arq_csv.get()+".csv"
31 a_ldif=arq_ldif.get()+".ldif"
32 arquivo1=open(a_csv, 'r')
33 a=arquivo1.readline()
34 a=arquivo1.readline()
35 arquivo2=open(a_ldif, 'a')
36 n=1
37 while a != "":
38 cont=Label(frame1, text=n, anchor=W)
39 cont.grid(row=2, column=6)
40 b=a.split(';')
41 try:
42 primeiro_nome=b[0]
43 segundo_nome=(b[2]+" "+b[1]).rstrip()
44 segundo_nome=""
45 nome_completo=b[3]
46 email=b[4]
47 fone_res=b[5]
48 fax_res=b[6]
49 fone_cel=b[7]
50 end=b[8]
51 cid=b[9]
52 cep=b[10]
53 est=b[11]
54 pais=b[12]
55 fone_com=b[13]
56 fax_com=b[14]
57 empresa=b[15]
58 except:
59 print "Linha: "+`n`
60 print a
61 print b
62 print "O numero de parametros deve ser 16. O numero de parametros encontrados foi:"
63 print len(b)
64 arquivo1.close()
65 arquivo2.close()
66 janela.destroy()
67 arquivo2.write('dn: cn='+nome_completo+',mail='+email+'\n')
68 arquivo2.write('objectclass: top\n')
69 arquivo2.write('objectclass: person\n')
70 arquivo2.write('objectclass: organizationalPerson\n')
71 arquivo2.write('objectclass: inetOrgPerson\n')
72 arquivo2.write('objectclass: mozillaAbPersonAlpha\n')
73 arquivo2.write('givenName: '+primeiro_nome+'\n')
74 arquivo2.write('sn: '+segundo_nome+'\n')
75 arquivo2.write('mail: '+email+'\n')
76 arquivo2.write('modifytimestamp: 0Z\n')
77 arquivo2.write('telephoneNumber: '+fone_com+'\n')
78 arquivo2.write('homePhone: '+fone_res+'\n')
79 arquivo2.write('fax: '+fax_com+'\n')
80 arquivo2.write('mobile: '+fone_cel+'\n')
81 arquivo2.write('street: '+end+'\n')
82 arquivo2.write('l: '+cid+'\n')
83 arquivo2.write('st: '+est+'\n')
84 arquivo2.write('postalCode: '+cep+'\n')
85 arquivo2.write('company: '+empresa+'\n')
86 a=arquivo1.readline()
87 n=n+1
88 arquivo1.close()
89 arquivo2.close()
90
91 janela=Tk()
92 janela.title(" Conversão de arquivo")
93 frame1=Frame(janela)
94 frame1.grid(columnspan=9)
95 Label(frame1, text="").grid(row=0, column=0)
96 Label(frame1, text="").grid(row=1, column=0)
97 Label(frame1, text="").grid(row=0, column=9)
98 Label(frame1, text="").grid(row=1, column=9)
99 Label(frame1, text="").grid(row=2, column=0)
100 Label(frame1, text="Nome do arquivo CSV a ser convertido (sem extensão):").grid(row=0, column=1, columnspan=3, sticky=W)
101 Label(frame1, text="Nome do arquivo LDIF a ser gravado (sem extensão):").grid(row=1, column=1, columnspan=3, sticky=W)
102 arq_csv=Entry(frame1, width=15, takefocus="")
103 arq_ldif=Entry(frame1, width=15, takefocus="")
104 arq_csv.grid(row=0, column=4, columnspan=3, sticky=W)
105 arq_ldif.grid(row=1, column=4, columnspan=3)
106
107
108 inicia=Button(janela, text="INICIAR\nCONVERSÃO", fg="blue")
109 inicia.bind("<Button-1>", converte)
110 inicia.bind("<space>", converte)
111 inicia.grid(row=3, columnspan=9)
112
113 janela.mainloop()
Volta para CookBook.