Parsear TXT con php

  • Autor Autor elmascato
  • Fecha de inicio Fecha de inicio
elmascato

elmascato

Gamma
Verificación en dos pasos activada
Hola Compañeros,

Estoy en un proyecto donde se me requiere parsear unos docx, doc, odt, etc de tests de exámenes para guardarlos en una base de datos y poder publicar las preguntas en tests interactivos.

Después de buscar la mejor manera de hacerlo, decidí por la conversión en bloque de estos archivos a formato txt ya que, para parsear, me parece mejor que intentarlo hacer con los otros formatos.

El formato es el siguiente:

1 Esta es una pregunta del test
a. Esta es la primera respuesta
b. Esta es la segunda respuesta
c. Esta es la tercera respuesta

Creo el array de preguntas de la siguiente manera:

if((!preg_match('/^[a-z][a-z_\-0-9]*/i', $result)&&(preg_replace('/\s+/', '', $result)))){
if(preg_match("/^[1-9]|[1-9][0-9\s]|/",$result))
{
$i++;
$new_str = preg_replace('/^\d+\s+/', '', $result);
$docCollect[$i] = (
[
'pregunta' => strip_tags($new_str)
]
);
}
}


El problema es el siguiente:

Las preguntas y sus diferentes respuestas vienen todas juntas, gracias a las expresiones regulares, más o menos lo tengo controlado, pero la lista de respuesta viene abajo de todo en el texto de esta forma:

RESPUESTAS

1A
2B
3C

En otros archivos incluso:

RESPUESTAS

1A 4A
2B 5C
3C 6B

Lo primero, sería dejar de parsear al llegar a la línea RESPUESTAS, ya que, con la expresión regular actual, al empezar por número, las respuestas me las guarda como preguntas.

Lo segundo, ya que estáis 🤣 🤣 sería una buena expresión regular para añadir las respuestas a b c en el array de preguntas.

Muchas gracias por su atención y un cordial saludo compañeros!
 
Hola Compañeros,

Estoy en un proyecto donde se me requiere parsear unos docx, doc, odt, etc de tests de exámenes para guardarlos en una base de datos y poder publicar las preguntas en tests interactivos.

Después de buscar la mejor manera de hacerlo, decidí por la conversión en bloque de estos archivos a formato txt ya que, para parsear, me parece mejor que intentarlo hacer con los otros formatos.

El formato es el siguiente:

1 Esta es una pregunta del test
a. Esta es la primera respuesta
b. Esta es la segunda respuesta
c. Esta es la tercera respuesta

Creo el array de preguntas de la siguiente manera:

if((!preg_match('/^[a-z][a-z_\-0-9]*/i', $result)&&(preg_replace('/\s+/', '', $result)))){
if(preg_match("/^[1-9]|[1-9][0-9\s]|/",$result))
{
$i++;
$new_str = preg_replace('/^\d+\s+/', '', $result);
$docCollect[$i] = (
[
'pregunta' => strip_tags($new_str)
]
);
}
}


El problema es el siguiente:

Las preguntas y sus diferentes respuestas vienen todas juntas, gracias a las expresiones regulares, más o menos lo tengo controlado, pero la lista de respuesta viene abajo de todo en el texto de esta forma:

RESPUESTAS

1A
2B
3C

En otros archivos incluso:

RESPUESTAS

1A 4A
2B 5C
3C 6B

Lo primero, sería dejar de parsear al llegar a la línea RESPUESTAS, ya que, con la expresión regular actual, al empezar por número, las respuestas me las guarda como preguntas.

Lo segundo, ya que estáis 🤣 🤣 sería una buena expresión regular para añadir las respuestas a b c en el array de preguntas.

Muchas gracias por su atención y un cordial saludo compañeros!

Hola, estimado que divide las preguntas de respuestas ? Estaria bueno ver un formato real para ayudarlo. En el caso que se encuentren divididos por títulos, como "Respuestas", podría utilizar un explode, tomando el Array 0 como preguntas y el 1 como respuestas para tratarlos de forma separada
 
Depende muchísimo del formato exacto, pero podrías hacer un explode "RESPUESTAS" para dividir ambas secciones, posteriormente dividir las preguntas separandolas por salto de linea o el divisor que uses y finalmente parsear con una expresión regular o bien más sencilla o simplemente con más explodes de PHP_EOL (saltos de línea), pero repito, depende muchisimo del formato exacto
 
Bueno, gracias a todos por vuestra ayuda.

Al final lo que hice es ir poco a poco, como las hormiguitas haciendo diferentes Pregs para poder detectar cualquier tipo de variable o error en la maquetación de los tests.

Me salió un controller muuuuuuuyyyyyyy largo, pero tengo cubiertas la mayor parte de las preguntas y sus respuestas. El otro día ya hice una prueba de parseo en masa, con unos 120 documentos y todo ok. Espero que no hayan más variables más adelante, pero ya cubrí muchas posibles.

Un saludo!!!
 
Atrás
Arriba