Ayuda con aplicación a realizar...

Hola,

Os pido una ayuda sobre esto que quiero realizar:

Que tengo???

1. Tengo un archivo Excel con 2 columnas (Albaranes - Lugar)
2. Los "Albaranes" estan alojados en una carpeta todos juntos (hay unos 200.000), en formato PDF.

Que quiero hacer???

Tengo que hacer una pequeña aplicación que, mirando la columna Albaranes, coja el archivo correspondiente de la carpeta donde estan todos los albaranes y mueva el archivo a la carpeta que yo quiera o bien que ya esté predefinida.

Se entiende????

Evidentemente todo esto para ahorrarme el palo de hacerlo a mano, que cuando digo que hay 200.000 es solo una parte...hay muchísimos más.

Alguien me puede hechar una mano???
Por curiosidad, ¿qué diferencia hay entre eso que quieres y abrir dos ventanas del explorador en mosaico vertical en tu escritorio e ir arrastrando de una a otra los archivos que quieras organizar?

De hecho, si son varias las ubicaciones, creas dentro de una carpeta accesos directos a todas las ubicaciones que necesites y arrastras sobre esos accesos directos, que viene a ser lo mismo.

Y a malas usas un gestor de ficheros medio decente.
El problema es que hablamos de un Excel de 200.000 filas aprox. (eso como poco)...

Nop, no irian carpetas y dentro muchas subcarpetas...sería algo así:

Carpeta Raiz: C --> Clientes --> Carpeta 1 (y aqui dentro los ficheros que sean)
----------------------------------------> Carpeta 2 (y aqui otros tantos ficheros (según el Excel)...

Lo que quiero es automatizarlo...
Mmm.... ¿En excel se puede exportar una columna como texto?

¿Y donde quieres mover los albaranes? Eso no me ha quedado claro.
Sip en Excel se puede exportar una columna a texto...de hecho ya lo tengo...tan sencillo como copiar y pegar...

El fichero final me ha quedado asi...

Fichero1.pdf
Fichero2.pdf
Fichero3.pdf así hasta un monton...

Lo que quiero es mover esos ficheros a unas carpetas en concreto...según un criterio que marcaria...
Si me aclaras "ese criterio" puede hacerte un mini programita en 5 minutos.
A ver si me explico bien...

Tengo un archivo excel con 2 columnas...

Columna 1 - Columna 2
Lista de Hospitales Albaran (con numero) del hospital en cuestion

La idea es:

Según la columna 1, crear la carpeta del hospital y luego copiar todos los albaranes (son archivos en PDF y el nombre del archivo aparece en la columna 2) que pertenezcan a ese hospital (columna 2) dentro de la carpeta según la columna 1...

Por ejem.

Columna 1 - Columna 2

Hospital San Marcos Albaran1242334.pdf
Hospital San Marcos Albaran1266634.pdf
Hospital San Marcos Albaran1242434.pdf
Hospital San Marcos Albaran1242334.pdf
Hospital San Marcos Albaran1242234.pdf
Hospital San Marcos Albaran1242134.pdf
Hospital La Pau Albaran99.pdf
Hospital La Pau Albaran98.pdf
Hospital La Pau Albaran97.pdf
Hospital La Pau Albaran96.pdf
Hospital La Pau Albaran95.pdf
Hospital La Pau Albaran94.pdf

Seria así:

Crear carpeta "Hospital San Marcos" y copiar todos los PDF que aparezcan en la columna 2 y sean de ese hospital, dentro de la carpeta "Hospital San Marcos"..., pulsando un bóton...o lo que sea, pero el tema de escoger los archivos lo haría el programita este...

Ahora se entiende?
¿Son todos del mismo palo que en el ejemplo? ¿Los nombres de los albaranes pueden tener algún espacio?

Si los albaranes no tienen espacios me facilitaría la vida :)
Tranquilo los albaranes no tienen espacio...sino ya me encargaria yo que los quitaran...

jejejejejjee...
Ya tengo el programa:
https://dl.dropboxusercontent.com/u/695 ... aranes.exe

El fichero debe llamarse "input.txt". Tiene que tener exactamente el mismo formato que me has puesto (sin lo de columna 1 y columna 2). Pon una linea en blanco al final por si las moscas.

El código es el siguiente por si lo quieres compilar tú mismo:
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;

int ObtenerNombreAlbaran(string &e,string &devolver)
{
    for (int i = e.size()-1;i > -1;i--)
    {
        if (e[i] == ' ')
        {
            devolver = string(devolver.rbegin(),devolver.rend() );
            return i;
        }
        else devolver += e[i];
    }

    //throw "Excepcion, nombre de hospital no encontrado";
    return -1;
}

int main()
{
    ifstream Datos("input.txt");
    string linea;
    string albaran;
    string hospital;
    int indice = 0;

    if (!Datos)
    {
        cout<<"Error, fichero txt no encontrado";
        cin.get();
        return 1;
    }

    int numero = 0;

    while (Datos.good())
    {
        getline(Datos,linea);
        indice = ObtenerNombreAlbaran(linea,albaran);

        if (indice == -1)
        {
            cout<<"--->Error, nombre de hospital no encontrado para el albaran: "<<linea<<endl;
            linea.clear();
            albaran.clear();
            hospital.clear();
            continue;
        }

        hospital = linea.substr(0,indice);

        if (CreateDirectory(hospital.c_str(),NULL) == 0)
        {
            if (GetLastError() != ERROR_ALREADY_EXISTS)
            {
                cout<<"--->Error inesperado al crear la carpeta: "<<hospital<<"  Permisos insuficientes?"<<endl;
                linea.clear();
                albaran.clear();
                hospital.clear();
                continue;
            }
        }

        if (MoveFile(albaran.c_str(),string(hospital+"\\"+albaran).c_str()) == 0)
        {
            cout<<"--->Error al mover el albaran: "<<albaran<<". Puede que el albaran no exista?"<<endl;
            linea.clear();
            albaran.clear();
            hospital.clear();
            continue;
        }

        numero++;

        cout<<numero<<" albaranes movidos"<<endl;

        linea.clear();
        albaran.clear();
        hospital.clear();
    }

    cout<<endl<<endl<<"TERMINADO"<<endl;
    cin.get();
    return 0;
}


Recomiendo hacer un backup de los albaranes por si acaso, aunque no debería pasar nada ya que no borro en ningún momento.
En que lenguaje lo has hecho...en VBasic?

Muchisimas gracias por tu currillo tio...

Con esto ya podría empezar alguna cosilla pq estaba perdido...jajajajajajajaja...a ver si lo puedo complicar un poco más...

Te debo un cafe si eres de Barcelona tio!!
C++, de hecho no tiene ni interfaz. Es una aplicación en consola.

NeO2K1 escribió:Muchisimas gracias por tu currillo tio...

De nada. Estoy entrenando para un campeonato de programación, asi que estas cosas me vienen muy bien ^^

NeO2K1 escribió:Te debo un cafe si eres de Barcelona tio!!

Enviamelo por correo a Valencia [beer]

ACTUALIZO:

Versión 1.1 con algunas correciones:

- Los errores no daban tiempo a verlos. Asi que ahora se escribirán en un archivo llamado "Errores.txt".
- Las salidas de pantalla retrasan mucho la ejecución (tarda incluso más que en mover un fichero), asi que ahora no se escribirá cuantos archivos se movieron hasta que se termine.

https://dl.dropboxusercontent.com/u/695 ... %201.1.exe

#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;

int ObtenerNombreAlbaran(string &e,string &devolver)
{
    for (int i = e.size()-1;i > -1;i--)
    {
        if (e[i] == ' ')
        {
            devolver = string(devolver.rbegin(),devolver.rend() );
            return i;
        }
        else devolver += e[i];
    }
    return -1;
}

int main()
{

    ifstream Datos("input.txt");
    ofstream Error("Errores.txt");
    string linea;
    string albaran;
    string hospital;
    int indice = 0;

    if (!Datos)
    {
        cout<<"Error, fichero txt no encontrado";
        cin.get();
        return 1;
    }

    int numero = 0;

    //Sleep(1000);
    while (Datos.good())
    {
        getline(Datos,linea);
        indice = ObtenerNombreAlbaran(linea,albaran);

        if (indice == -1)
        {
            Error<<"--->Error, nombre de hospital no encontrado para el albaran: "<<linea<<endl;
            linea.clear();
            albaran.clear();
            hospital.clear();
            continue;
        }

        hospital = linea.substr(0,indice);

        if (CreateDirectory(hospital.c_str(),NULL) == 0)
        {
            if (GetLastError() != ERROR_ALREADY_EXISTS)
            {
                Error<<"--->Error inesperado al crear la carpeta: "<<hospital<<"  Permisos insuficientes?"<<endl;
                linea.clear();
                albaran.clear();
                hospital.clear();
                continue;
            }
        }

        if (MoveFile(albaran.c_str(),string(hospital+"\\"+albaran).c_str()) == 0)
        {
            Error<<"--->Error al mover el albaran: "<<albaran<<". Puede que el albaran no exista?"<<endl;
            linea.clear();
            albaran.clear();
            hospital.clear();
            continue;
        }
        numero++;
        linea.clear();
        albaran.clear();
        hospital.clear();
    }

    cout<<"TERMINADO, "<<numero<<" archivos movidos"<<endl;
    cin.get();
    return 0;
}
Un apunte...se podría hacer que se crearan las carpetas de la columna1??? Las de los hospitales...
NeO2K1 escribió:Un apunte...se podría hacer que se crearan las carpetas de la columna1??? Las de los hospitales...

¿? Eso ya lo hace...
Pues no me las crea tio...

Como tendria que quedar el archivo txt???

Ya que lo hago como me dices, pero me dan error todos los ficheros...
NeO2K1 escribió:Pues no me las crea tio...

Como tendria que quedar el archivo txt???

Ya que lo hago como me dices, pero me dan error todos los ficheros...

Oo

Te paso mis ficheros de pruebas:
https://dl.dropboxusercontent.com/u/695 ... aranes.zip

Descomprimelo entero, ejecuta el programa tal cual. Comprueba que crea las carpetas y mueve los PDF. Si lo hace esque tu problema era el input.txt, tiene que quedar:
nombre_hospital nombre_albaran
nombre_hospital nombre_albaran


Deja una línea vacía al final por si acaso (sin espacios).

Si no pudistes crear las carpetas en el ejemplo anterior, debes tener algún problema de permisos. Quizás estes en una carpeta restringida (como archivos de programa) o bien el antivirus esté bloqueando el programa.
15 respuestas