para - plantilla excel contactos gmail
La mejor forma de procesar listas de direcciones de correo electrónico (7)
Tengo 3 archivos de texto (A, B y C), cada uno con cientos de direcciones de correo electrónico. Quiero fusionar la lista A y listar B en un solo archivo, ignorando las diferencias en mayúsculas y minúsculas. Luego quiero eliminar todos los correos electrónicos en la nueva lista que están en la lista C, nuevamente ignorando las diferencias en mayúsculas y minúsculas.
Mi lenguaje de programación de elección es normalmente C ++, pero parece poco adecuado para esta tarea. ¿Existe un lenguaje de scripting que pueda hacer esto (y tareas similares) en relativamente pocas líneas?
¿O hay software ya disponible (gratis o comercial) que me permita hacerlo? ¿Es posible hacerlo en Excel, por ejemplo?
Lamentablemente, esta respuesta probablemente no te ayude, pero si de hecho estuvieras usando Unix (Linux por ejemplo), podrías hacer algo como:
cat filea >> fileb # anexa el archivo a al archivo b
ordenar archivob | uniq> newFile # newFile ahora contiene una fusión de archivo a y archivo b, con direcciones de correo electrónico ordenadas y únicas
Todo lo anterior podría hacerse en una línea de la siguiente manera: cat filea >> fileb | ordenar | uniq> newFile
Ahora te queda simplemente eliminando los correos electrónicos comunes. Alguna variación de "diff" debería ser útil allí tal como quizás: diff newFile fileC> finalFile
diff le dará una lista de las diferencias entre los dos archivos, por lo que la salida en "archivo final" debe ser una lista de correos electrónicos que están en "nuevo archivo" (la fusión de A y B) pero NO están en el archivo C. Las opciones de las diversas herramientas le permiten ignorar el espacio en blanco y el caso. Tendría que jugar con eso un poco para hacerlo exactamente, pero lo de arriba es la idea general.
Solía tener una caja extra que ejecuta Linux con el único propósito de hacer cosas como la anterior, que es una molestia bajo Windoze, pero muy sencilla bajo los sistemas operativos tipo Unix. Cuando mi hardware murió, nunca pude construir otra caja Linux.
Creo que el kit de herramientas de MKS para Windoze probablemente tenga todas las utilidades anteriores.
En Python, algo como esto:
Tenga en cuenta que esto escribirá correos electrónicos en minúsculas en el resultado final. Si eso no está bien, entonces sería necesaria una solución basada en el diccionario.
def read_file(filename):
with file(filename, "r") as f:
while True:
line = f.readline();
if not line:
break;
line = line.rstrip();
if line:
yield line;
def write_file(filename, lines):
with file(filename, "w") as f:
for line in lines:
f.write(line + "/n");
set_a = set((line.lower() for line in read_file("file_a.txt")));
set_b = set((line.lower() for line in read_file("file_b.txt")));
set_c = set((line.lower() for line in read_file("file_c.txt")));
# Calculate (a + b) - c
write_file("result.txt", set_a.union(set_b).difference(set_c));
Excel puede hacerlo, como se indica arriba. El lenguaje de programación más adecuado es Perl.
La forma más rápida de hacer esto probablemente no requeriría necesariamente la codificación. Puede importar los archivos A y B en Excel en una hoja de trabajo, luego (si es necesario) hacer un filtro en esa lista resultante de direcciones para eliminar los duplicados.
El siguiente paso sería importar el archivo C en una segunda hoja de trabajo. En una tercera hoja de trabajo, haría una VLOOKUP para seleccionar todas las direcciones en su primera lista y eliminarlas si están en su "Lista C".
El VLOOKUP se vería así:
= IF (ISNA (VLOOKUP (email_address_cell, Sheet2! Email_duplicates_list , 1, falso), "", (VLOOKUP (email_address_cell, Sheet2! Email_duplicates_list , 1, falso)))
También he incluido un cheque para ver si la fórmula arroja un error de "Valor no disponible", en cuyo caso la celda solo muestra un valor en blanco. A partir de ahí, solo necesita eliminar su espacio en blanco y allí está su lista final.
Ahora que ya dijiste todo eso, aún podrías hacer una macro de VBA para hacer más o menos lo mismo, pero tal vez limpiar las listas un poco, dependiendo de lo que necesites. ¡Espero que ayude!
Para el procesamiento de texto del tipo que describes, ya sea Perl o Python son ideales.
Puede usar matrices asociativas (matrices con un índice de cadena en este caso) para almacenar las direcciones de correo electrónico en una lista.
Utilice la dirección de correo electrónico en minúsculas y sin espacios en blanco como una clave y la dirección de correo electrónico real como valor.
Luego, se trata de leer y almacenar el primer archivo, leer y almacenar el segundo (que sobrescribirá las direcciones de correo electrónico con la misma clave), luego leer en el tercer archivo y eliminar entradas de la lista con esa clave.
Lo que te queda es la lista que deseas (A + B - C).
Pseudo-código aquí:
set list to empty
foreach line in file one:
key = unwhitespace(tolowercase(line))
list{key} = line
foreach line in file two:
key = unwhitespace(tolowercase(line))
list{key} = line
foreach line in file three:
key = unwhitespace(tolowercase(line))
if exists(list{key})
delete list{key}
foreach key in list:
print list{key}
Como se mencionó Excel, también puede hacer este tipo de cosas con Jet y VBScript.
Set cn = CreateObject("ADODB.Connection")
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/Docs/;" _
& "Extended Properties=""text;HDR=No;FMT=Delimited"";"
cn.Open strCon
strSQL = "SELECT F1 Into New.txt From EmailsA.txt " _
& "WHERE UCase(F1) Not IN (SELECT UCase(F1) From EmailsC.txt)"
cn.Execute strSQL
strSQL = "INSERT INTO New.txt ( F1 ) SELECT F1 FROM EmailsB.txt " _
& "WHERE UCase(F1) Not IN (SELECT UCase(F1) From EmailsC.txt)"
cn.Execute strSQL
Creo que las respuestas anteriores, responden la pregunta técnica CÓMO HACER; lo único que debe considerar es cuántas veces tendrá que realizar la tarea. Si se trata de algo único y se siente más cómodo con Excel, comience allí. Si sabe que habrá realizado esta tarea al menos dos veces y tal vez más, entonces la codificación de un script o ejecutable es el camino a seguir.