#tutoriales: https://realpython.com #type devuelve el tipo #int transforma en entero si puede # [] me toma parte de línea a:b desde a hasta b import re with open ('../../Dropbox/LATEX/RCostas-references.20210410.bib','r') as file: #with open ('../../Dropbox/LATEX/RCostas-references.20200830.bib','r') as file: with open ('../../Dropbox/LATEX/20210410.bib', 'w') as writer: #with open ('../../Dropbox/LATEX/20200830.bib', 'w') as writer: entities = 0 # global elements lincom = 0 # commented lines fiam = 0 # ammount of fields in the current item startentitie = False # controla si una entidad ha comenzado for line in file: line=line.strip() # elimia el espacio innecesario line=line.replace(' = ','=') if re.search('^[\%]{1,}$',line)!=None: # lineas que son comentarios lincom +=1 if re.search('^\@[ a-zA-Z]{1,}\{[ a-zA-Z]{1,}[0-9]{0,}\,$',line)!=None: # lineas que son cabeceras typeent = line.upper()[1:int(line.find("{"))].replace(' ','') #tipo de entidad nameent = line.upper()[int(line.find("{"))+1:-1].replace(' ','') #nombre de entidad entities +=1 fiam = 0 # reseteamos cantidad de campo de item startentitie=True #se comienza la entidad stri = '@' + typeent + '{'+nameent + ',' if re.search('[ a-zA-Z]{1,}\=[ a-zA-Z0-9]{1,},$',line)!=None: # lineas con informacion sin llaves datatoinsert = line[:-1] dataname = datatoinsert.upper()[:int(datatoinsert.find("="))] datastr = datatoinsert[int(datatoinsert.find("=")):] datatoinsert = dataname + datastr + ',' stri=stri + datatoinsert fiam +=1 # añadimos un campo del item if re.search('[ a-zA-Z]{1,}\=\{[ .,@\a-zA-Z0-9]{1,}\},$',line)!=None: datatoinsert = line dataname = datatoinsert.upper()[:int(datatoinsert.find("="))+1] datastr = datatoinsert[int(datatoinsert.find("="))+2:-2] datatoinsert = dataname + datastr + ',' stri = stri + datatoinsert fiam +=1 # añadimos un campo del item if re.search('\}$',line)!=None and startentitie: stri=stri + '}' + '%'+ str(entities) + '---' + str(fiam) + '-\n' writer.write(stri) ## escribo el resultado en fichero startentitie = False print(f'entradas: {entities} y lineas en blanco: {lincom}')