[RESUELTO] Importación de datos

Discute sobre la aplicación de hojas de cálculo
Responder
Avatar de Usuario
gamusinox
Mensajes: 39
Registrado: Jue Feb 23, 2017 12:37 pm
Ubicación: Coirós - Galicia - Spain

[RESUELTO] Importación de datos

Mensaje por gamusinox »

Hola,
Tengo una hoja de cálculo con los campos ID,APELLIDOS,NOMBRE e IMPORTE en las columnas A,B,C y D

Para completar dicha hoja necesito importar los datos de un fichero de texto plano.

El archivo no es un csv o txt común sino que presenta la siguiente estructura:

02xxxxxxxxy (donde 02 representa el número de línea y xxxxxxxx los ocho caracteres del ID)
03xxxxxxxxyyyyyyyyyyyzzzzzzzzzzz (donde 03 representa el número de línea y donde los valores x,y, z representan los campos primer apellido, segundo apellido y nombre respectivamente. Se trata de longitudes fijas de 25 caracteres cada uno de ellos, si no necesitan los 25 caracteres se rellenan con espacios en blanco).
1300000000000xxxyyyyyy
1300000000000xxxyyyyyy
1300000000000xxxyyyyyy ( 13 es el número de línea que como se observa puede repetirse varias veces, yyyyyy es el importe y xxx es un valor numérico que indica cual de las líneas 13 es la que contiene el importe que necesito concretamente en mi caso sería el valor 760 )
30 (este valor indica el fin del registro y nuevamente la siguiente línea del fichero comenzaría en 02)

Estructura de ejemplo:
0212345678B
03DOE DEO JUAN
1300000000000701100050
1300000000000721123466
1300000000000760125075
30
0287654321C
03EDO ODE ANA
1300000000000701112450
1300000000000721177469
1300000000000760133355
30

Como indicaba anteriormente de las líneas numeradas como 13 necesitaría extraer de la que contiene el valor 760 los 6 últimos dígitos que representan la cantidad (4 dígitos representan la parte entera y los últimos la parte decimal).
Agradecido por la ayuda que puedan prestarme.
Un saludo
Última edición por gamusinox el Jue Mar 02, 2017 5:00 pm, editado 1 vez en total.
LO 5.4.4 - Win 7/10 | LO 5.4.4 - Debian 8 - Gnome

#ElPerroIdeal #OCanIdeal
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Importación de datos

Mensaje por mauricio »

Hola...

Si anexas un archivo de ejemplo de tu archivo fuente y del resultado, ayudaras a quien quiera ayudarte.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
gamusinox
Mensajes: 39
Registrado: Jue Feb 23, 2017 12:37 pm
Ubicación: Coirós - Galicia - Spain

Re: Importación de datos

Mensaje por gamusinox »

Hola Mauricio, lo primero indicar que estoy utilizando la versión 4.2 de LibreOffice

Te envío un modelo del archivo .txt y una hoja de cálculo de como me interesaría que se mostrasen los datos tras la importación.

Los datos en el archivo .txt ocupan posiciones fijas.
Los dos primeros dígitos de cada fila representan el número de línea.
En la línea 02 se muestra el valor correspodiente al campo ID que quiero importar a la hoja de cálculo

Si editas el fichero .txt con Notepad++ verás que el APELLIDO2 (línea 03) comienza en la misma columna (28) en todos los casos y tiene un ancho fijo de 25 caracteres (de no necesitarse todos los caracteres del campo se rellenan con espacios en blanco hasta ocupar las 25 posiciones). Lo mismo ocurre con el resto de campos (apellido1, nombre....).

La línea 13 aparece repetida varias veces para cada persona. De estas líneas solo me interesan solo las que tienen el código 7960 (columnas 15 a 19), por ejemplo, para la primera persona del fichero .txt la línea 13 de la que quiero extraer la información sería la "13NAC 201701 7960000100034".
Finalmente de esta línea 13 me interesa extraer desde la posición 22 hasta la 28, es decir, "100034". En esta cadena "100034" los cuatro primeros dígitos representan la parte entera del número y los dos últimos la parte decimal.

La línea 30 indica que finalizan los datos de una persona y que comienzan los datos de la siguiente.

Espero que se entienda la explicación.

Mi idea sería que pulsando un botón de formulario se abre el cuadro de diálogo para cargar el archivo .txt y que automáticamente vuelque los contenidos de las líneas 02, 03 y 13 en la hoja de cálculo.
Si fuesen pocos datos podría apañármelas con funciones lógicas, de búsqueda y texto pero el problema es que cada archivo de .txt puede contener unas 300.000 líneas (como es obvio las he omitido en el ejemplo ya que también existen las líneas 04, 05.....hasta la 30)

Entiendo que la forma correcta sería hacerlo con un código que recorra todo el fichero y un CASE que vaya comprobando el número de línea y en función de ello extraer los datos necesarios y pegarlos en la celda de la hoja de cálculo correspondiente....y aquí es donde surge mi problema ya que no domino el código basic de libreoffice para hacer todo esto.

Un saludo y gracias por tu interés.
Adjuntos
archivos.zip
(9.46 KiB) Descargado 367 veces
LO 5.4.4 - Win 7/10 | LO 5.4.4 - Debian 8 - Gnome

#ElPerroIdeal #OCanIdeal
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Importación de datos

Mensaje por mauricio »

Hola...

Por favor, no dirijas las preguntas a nadie en especial, pues cualquier te puede responder.

Siento no usar Basic, pero es un lenguaje feo y lento, prefiero el muy "guapo" Python, mira que sencillo, casi se explica solito el código:

Código: Seleccionar todo

#!/usr/bin/env python
import uno


CTX = uno.getComponentContext()
SM = CTX.getServiceManager()


def _create_instance(name, with_context=False):
    if with_context:
        instance = SM.createInstanceWithContext(name, CTX)
    else:
        instance = SM.createInstance(name)
    return instance


def get_file():
    dlg_file = _create_instance('com.sun.star.ui.dialogs.FilePicker')
    dlg_file.setTitle('Selecciona el archivo a importar')
    if dlg_file.execute():
        return uno.fileUrlToSystemPath(dlg_file.getFiles()[0])
    else:
        return ''


def import_txt(event=None):
    txt = get_file()
    if not txt:
        return

    rows = []
    with open(txt) as fh:
        row = []
        for line in fh.readlines():
            if line.startswith('02'):
                row.append(line.strip()[2:-1])
            elif line.startswith('03'):
                row.append(line[2:27].strip())
                row.append(line[27:52].strip())
                row.append(line[52:].strip())
            elif line.startswith('13') and line[14:18] == '7960':
                value = '{}.{}'.format(line[21:25], line[25:27])
                row.append(float(value))
            elif line.startswith('30'):
                rows.append(tuple(row))
                row = []

    sheet = XSCRIPTCONTEXT.getDocument().getCurrentController().getActiveSheet()
    cursor = sheet.createCursorByRange(sheet.getCellRangeByName('A1'))
    cursor.gotoEnd()
    row = cursor.getRangeAddress().EndRow
    cell_range = sheet.getCellRangeByPosition(0, row + 1, 4, len(rows) + row)
    cell_range.setDataArray(tuple(rows))
    return

Cualquier ligero cambio en la estructura del archivo origen, causará que algo falle, nada que no se pueda ajustar.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Importación de datos

Mensaje por mauricio »

Para saber como usar esta macro en Windows, miren por aquí: https://vimeo.com/205502874
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
gamusinox
Mensajes: 39
Registrado: Jue Feb 23, 2017 12:37 pm
Ubicación: Coirós - Galicia - Spain

Re: Importación de datos

Mensaje por gamusinox »

Hola,
Madre mía!!, no se que decir, perfecto.
En entos momentos no puedo probar el código pero he visto el vídeo por encima y creo que esta bastante claro.
Menudo trabajo que te has dado y el que me has ahorrado.....muchísimas gracias.

No se nada de Python, pero creo que la mayoría del código lo entiendo, buscaré algún manual e incluso intentaré adaptar tu código para incluir datos de alguna línea más.

En cuanto lo pruebe te comento mi experiencia y si todo esta ok doy el tema por cerrado.

Un saludo
Luis
LO 5.4.4 - Win 7/10 | LO 5.4.4 - Debian 8 - Gnome

#ElPerroIdeal #OCanIdeal
Avatar de Usuario
gamusinox
Mensajes: 39
Registrado: Jue Feb 23, 2017 12:37 pm
Ubicación: Coirós - Galicia - Spain

Re: Importación de datos

Mensaje por gamusinox »

Hola de nuevo,

Acabo de probar la macro. Con el facilitado funciona perfectamente.
Inicialmente cree la carpeta "scripts" en lugar de "Scripts" y como bien indicas en el vídeo simplemente por este pequeño detalle no conseguía cargar la macro.
He probado con uno de los ficheros que tengo y me ha importado la totalidad del fichero (>33000 filas) pero al finalizar la macro muestra el mensaje que adjunto en la imagen, aunque insisto los datos los importa correctamente.

No se si es debido a que la estructura del fichero original es más compleja que la del ejemplo o si se trata de algún otro tipo de error.
Me ha gustado como extrae Python la información de una cadena de texto :super:

Saludos y gracias
Adjuntos
error_importacion.zip
(24 KiB) Descargado 300 veces
LO 5.4.4 - Win 7/10 | LO 5.4.4 - Debian 8 - Gnome

#ElPerroIdeal #OCanIdeal
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Importación de datos

Mensaje por mauricio »

Hola...

El error que muestras lo hace al volcar los datos en la hoja de calculo, pero como dices que si los muestra, es exraño pero capturable, mandame por privado el archivo que estas usando para hacer una prueba.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Importación de datos

Mensaje por fornelasa »

En las pruebas que he realizado funciona perfectamente, no marca error de ningun tipo.
LibreOffice 5.2.5 y Win 7
Saludos.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
EMILIOGAR
Mensajes: 1
Registrado: Vie Mar 22, 2019 12:40 pm

Re: [RESUELTO] Importación de datos

Mensaje por EMILIOGAR »

Buenos días, es posible esta macro ejecularla en libreoffice - entorno linux
saludos
libreboffice 6.2 - linux mint 18.3
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: [RESUELTO] Importación de datos

Mensaje por mauricio »

Sin problemas... debería funcionar, yo todo lo desarrollo en Linux, pero, si tienes problemas, es mejor abras un nuevo hilo.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Responder