Imploro un poco sapiencia miscelánica

Veamos, tengo un fichero de texto plano, donde aparecen un listado de ficheros y a su lado su MD5
Con el siguiente formato

flores.jpg=91AAB1BFEFE5B931C4ABCFDB9AFE2B77
zapato.jpg=6D6EF569FFA5F3FA8F6F296EB3758EE0
casa.jpg=91AAB1BFEFE5B931C4ABCFDB9AFE2B77
pendiente.jpg=11576DC099E8EA89419B3D9E1B1081F9
hebilla.jpg=9F89E750C3F96EEA4BFB4267E98876C1
contador.jpg=937DA743480A2111EF3CC8C6D9B248A8

El separador de nombrefichero y MD5 es el signo "=" Lo que quiero es que me resalte, como he escenificado, las entradas con el mismo MD5, se llame o no se llamen igual, para eliminar duplicados e incluso triplicados.
Por supuesto no son cuatro entradas hay lo por menos 500
@hal9000 excel?.

No se si el buscador del word de office te permite identificar patrones, todos a la vez, pero al menos uno a uno seguro, y si te los deja marcados bastaría con hagas click tu mismo al botón de negrita, color, tamaño, o lo que quieras.

La otra opción es currarte una macro en excel, cosa de la que no tengo ni idea, pero intuyo que debería poderse hacer ahí lo que necesitas.
Tratalo como si fuera un archivo cvs. Abrelo con Calc de LibreOffice (o similar) indicándole que el separador es "=". Luego ordenas las columnas según la segunda columna y ya lo tienes. Puedes resaltarlo usando alguna función que compare una celda con la siguiente y de un valor u otro a una tercera columna.

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

bool isDuplicate(const string& element, const vector<string>& elements) {
    string elementKey = element.substr(element.find("=") + 1, 32);
    for (const string& prevElement : elements) {
        string prevElementKey = prevElement.substr(prevElement.find("=") + 1, 32);
        if (elementKey == prevElementKey) {
            return true;
        }
    }
    return false;
}

int main() {
    string inputFileName = "input.txt";
    string outputFileName = "output.txt";

    ifstream inputFile(inputFileName);
    if (!inputFile.is_open()) {
        cout << "No se pudo abrir el archivo de entrada: " << inputFileName << endl;
        return 1;
    }

    ofstream outputFile(outputFileName);
    if (!outputFile.is_open()) {
        cout << "No se pudo abrir el archivo de salida: " << outputFileName << endl;
        return 1;
    }

    vector<string> elements;

    string line;
    while (getline(inputFile, line)) {
        string elementKey = line.substr(line.find("=") + 1, 32);
        if (isDuplicate(line, elements)) {
            outputFile << line << " repetido" << endl;
        } else {
            outputFile << line << endl;
            elements.push_back(line);
        }
    }

    inputFile.close();
    outputFile.close();

    cout << "Proceso completado. El resultado se ha guardado en: " << outputFileName << endl;

    return 0;
}



Ahora, el programa buscará el signo igual ("=") en cada línea para encontrar la parte relevante del elemento. Luego, se comparará solo esa parte (los 32 caracteres) con los elementos anteriores. Si se encuentra una coincidencia, se agregará la palabra "repetido" al final de la línea en el archivo de salida.

Espero que esta versión corregida sea lo que buscas. Si tienes alguna otra pregunta, ¡no dudes en preguntar!


De nada. Literalmente, lo ha hecho Chatgpt.
Creo que en Excel con la opción texto en columnas puedes aislar los md5 y luego con una simple tabla dinámica encuentras fácil los duplicados.

Otra opción es una función "si" combinada con formato condicional.
Muchas gracias a todos, como último recurso tengo a mi mujer que de Excel y Word lo tiene por la mano.
Con excel es muy sencillo:

Como te han dicho importas el csv con separador por columnas el =

Una vez tengas los nombres en una columna y el sha1 en otra creas una tabla y ordenas por ese sha1 la tabla

Ahora tienes una tabla con dos columnas nombre (A) y sha1 (B), añades una tercera columna a la tabla que llamaras repetido y ahí pones la fórmula =b(fila_sha)=b(fila_sha+1) que te devuelve verdadero si está repetida y falso si es distinto donde fila_sha sería la fila donde se inserta la fórmula: Ejemplo =B3=B4 para la fila 3. Simplemente arrastra la fórmula hasta el final de la tabla de manera que siempre quede =b(fila_sha)=b(fila_sha+1),

Con eso te dará todos los repetidos como VERDADERO y los no repetidos como FALSO.

Un saludo.
Abres el archivo en excel/libreoffice calc/google sheets
Seleccionas la columna inicial dónde está todo
Pestaña/Menú Datos -> Texto en columnas (excel y calc, en google ni idea de como lo pone)
Datos delimitados/separados
Delimitador -> otro (y escribes el '=' en el cuadro)
Finalizar

Con esto tienes 2 columnas, una con los nombres de archivo, otra con los md5
Seleccionas ambas columnas (haciendo ctrl+click en las letras de las cabeceras)

Pestaña/Menú Datos -> Filtro (verás que en la primera casilla de cada columna aparecerá un botón para un desplegable)
Haces click en el botón de la columna de los md5 y ordenas de mayor a menor
te pones en la segunda casilla de la tercera columna (vacía) y escribres "=si(B2=B1;"REPE";B2)"
Arrastras esta formula hasta el final y te pondrá el MD5 de todos los archivos excepto los repetidos, que escribirá "REPE".
Muchas gracias!!!!!!!!!!!!!!! pero ya lo tengo resuelto.

Imagen
LLioncurt escribió:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

bool isDuplicate(const string& element, const vector<string>& elements) {
    string elementKey = element.substr(element.find("=") + 1, 32);
    for (const string& prevElement : elements) {
        string prevElementKey = prevElement.substr(prevElement.find("=") + 1, 32);
        if (elementKey == prevElementKey) {
            return true;
        }
    }
    return false;
}

int main() {
    string inputFileName = "input.txt";
    string outputFileName = "output.txt";

    ifstream inputFile(inputFileName);
    if (!inputFile.is_open()) {
        cout << "No se pudo abrir el archivo de entrada: " << inputFileName << endl;
        return 1;
    }

    ofstream outputFile(outputFileName);
    if (!outputFile.is_open()) {
        cout << "No se pudo abrir el archivo de salida: " << outputFileName << endl;
        return 1;
    }

    vector<string> elements;

    string line;
    while (getline(inputFile, line)) {
        string elementKey = line.substr(line.find("=") + 1, 32);
        if (isDuplicate(line, elements)) {
            outputFile << line << " repetido" << endl;
        } else {
            outputFile << line << endl;
            elements.push_back(line);
        }
    }

    inputFile.close();
    outputFile.close();

    cout << "Proceso completado. El resultado se ha guardado en: " << outputFileName << endl;

    return 0;
}



Ahora, el programa buscará el signo igual ("=") en cada línea para encontrar la parte relevante del elemento. Luego, se comparará solo esa parte (los 32 caracteres) con los elementos anteriores. Si se encuentra una coincidencia, se agregará la palabra "repetido" al final de la línea en el archivo de salida.

Espero que esta versión corregida sea lo que buscas. Si tienes alguna otra pregunta, ¡no dudes en preguntar!


De nada. Literalmente, lo ha hecho Chatgpt.


Anda que chatgpt se ha ido a un lenguaje sencillo tambien, y mas para manejar ficheros ajajajja. Ya te podria haber dado el script en python.
yo me he pensado un par de veces indicar que se puede hacer en cualquier shell de linux con un script de un par de comandos, pero me parece mas probable tener a mano excel u otro similar para conseguir el mismo resultado.
10 respuestas