Subir a BD MySQL archivo de TXT con un formato

Les vengo a pedir ayuda ya que conozco poco de php, solo cosas básicas. Me han pedido que suba a una bd mysql una serie de datos contenidos en un .txt el hecho es que el mismo contiene un establecido formato del cual debo sepáralos y subirlos a la bd. El otro problema es el que el archivo va a ser subido al mismo directorio donde se encontrara la pag web y que el .txt tienen diferentes nombres y no ninguno especifico por lo cual es necesario abrir el .txt sin saber su nombre ya que cada ves que se quiera actualizar los datos de la bd se sube el nuevo .txt ; ademas que quiero también que a partir del nombre de archivo de dicho .txt obtener una data ya que dichos nombres también son guardados con un formato. Entonces que es lo que es necesario: como leer el .txt sin saber nombre del archivo, ademas leer del nombre del archivo el formato que contiene fecha y que archivo esta contenido. Por ejemplo: AExyyzzl.txt : donde AE es un prefijo ocurrente en todos los archivos .txt ; donde x: 1 o 2 si 1 = cobros o 2= pagos ; donde yy es el codigo del local especifico ejemplo 12 = texas o 10 = florida ; y donde zz es el año de la data que el archivo a generado ejemplo 09 para 2009 ; donde l es el 1 = primer semeestre del año o 2 = segundo semestre del año.
Ok ahora necesito agarrar estos datos del nombre para almacenarlos también en la bd para luego en la página node se muestre la data contenida en dicho texto muestre El código del local, la fecha, semestre y si es cobros o pagos. ¿Cómo hago esto?
Y la otra es como leer el contenido de dicho .txt y subirlo a la bd de inmediato. El formato del contenido es el siguiente: columna 1-8 numero de cliente, columna 9-10 código del local especifico, columna 11-12 código de tipo de cliente y de 13-50 se coloca 0 o 1 si se hace pedidos de los diferentes productos, ejemplo la columna 13 es clavos, 14 tornillos, 15 martillos, etc hasta llegar a la 50, entonces si piden tornillos aparece 1 en la columna 14 y así como ejemplo: ¿031918871800000000000000000000000000000000000000
entonces como puedo hacer?

1 respuesta

Respuesta
1
Pues alégrate porque todo esto que tienes que hacer se puede lograr con PHP sin demasiada complicación.
Primero necesitas hacer un formulario con un campo input de tipo file. Eso permitirá que el usuario suba un fichero con cualquier nombre.
PHP te notificará el nombre original del fichero, con lo cual ya tienes resuelta esa parte.
Puedes ver ejemplos de ello en el manual:
http://es.php.net/manual/es/features.file-upload.post-method.php
Una vez tengas el fichero en el servidor, lo puedes abrir con fopen y leer por líneas con fgets. Tienes ejemplos en el manual:
http://es.php.net/manual/es/function.fgets.php
Una vez tengas la línea en una variable, sólo tienes que subdividirla en las porciones definidas usando la función substr
Muchas gracias por la respuesta rápida, me gusta mucho la solución de un input para subir el texto, pero el que me ha pedido este modulo para leer los .txt dice que se subirán al servidor por ellos y que debería haber por ejemplo, en la página para actualizar la bd con este .txt debería aparecer una lista de los .txt en el directorio local donde están todos los archivos de la pag web, ¿y de allí poder seleccionarse es posible esto? Por ejemplo entrar en la pag de actualización de bd y cuando entro se muestran 2 archivos .txt (solo se mostrarían los .txt)como ejemplo AExyy091.txt y AExyy082.txt y con un checkbox puedo seleccionar solo uno de ellos y de allí actualizar. ¿Cómo puedo hacer esto y como hacer que lea de dicho nombre del .txt como había dicho anteriormente?
Muchas gracias nuevamente.
En ese caso, puedes usar readdir para averiguar los ficheros que hay en ese directorio determinado. Tienes un ejemplo en el manual:
http://es.php.net/manual/es/function.readdir.php
Muchas gracias amigo, me sirvió mucho y de hecho use un ejemplo del manual, ya tengo un código que me muestra solo los txt en el directorio, lo formatee para que me lo muestre en una tablita y asu lado un botón de tipo opción a cada uno, y en un formulario para enviar a la bd y actualizar con su botón. ¿Ahora amigo ya teniendo esto que comandos o funciones para la parte de leer el nombre del archivo y separar cada dato del nombre como te dije más arriba?, a partir de obtener el nombre al dar entonces enviar me envíe los datos de adentro a la tabla de la bd correspondiente, por ejemplo si era del local 18 o 20 son 2 tablas separadas. ¿Cómo hago esta parte? ¿Luego si usuaria el fopen y fget cierto?
Muchas gracias nuevamente
Si ya muestras la lista de los ficheros, quiere decir que ya sabes el nombre.
Entonces, en efecto y como ya te había comentado, debes abrir el fichero con fopen y leerlo con fgets que te devolverá una línea del fichero cada vez. Tienes ejemplos en el manual:
http://es.php.net/manual/es/function.fgets.php
Puesto que cada línea tiene un formato definido, una vez tengas la línea, sólo debes descomponerla en sus partes, cogiendo cada trozo de cadena según tu formato, usando la función substr. Tienes ejemplos de su uso en el manual:
http://es.php.net/manual/es/function.substr.php
Cuando tengas los datos, sólo tienes que introducirlos en las tablas apropiadas, según la estructura que tengas y la base de datos que uses. Si usas MySQL, deberás usar las instrucciones para este tipo de base de datos, como mysql_connect y mysql_query. Tienes ejemplos de su funcionamiento en el manual:
http://es.php.net/manual/es/function.mysql-query.php
Hola amigo disculpa de nuevo la molestia pero no he podido seguir, me quedo sin idea de que hacer en el siguiente caso: como ya te había dicho hice que me mostrara los txt en la carpeta y les agregue el botón radio para seleccionar, ahora te muestro el código:
Inicio del codigo ------->
<form id="form1" name="form1" method="post" action="">
<div align="center">
<table border="1">
<tr>
<td width="20"> </td>
<td >Nombre del Archivo</td>
<td >Ultima Fecha de Modificación</td>
</tr>
<?php
$dir = opendir (".");
while (false !== ($file = readdir($dir))) {
if (strpos($file, '.txt',1)||strpos($file, '.TXT',1) ) {
$linea=sscanf($file,"%2s%1d%2d%2s%1d%4s",$ini,$tipo,$cl,$year,$lapso,$fin);
echo "
<tr>
";
echo '
<td><input name="selec" type="radio" value="'.$tipo,$cl,$year,$lapso.'"/></td>
';
echo "
<td>".$file."</td>
";
echo "
<td>".date("d F Y", filemtime($file))."</td>
";
echo "
</tr>
";
}
}
closedir($dir);
?>
</table>
<p>
<label>
<input type="submit" name="actbd" id="actbd" value="Enviar" />
</label>
</p>
</div>
</form>
<?php if (isset($_POST['actbd'])) {
$selected_radio = $_POST['selec'];
if ($selected_radio ) {
/*aqui es donde quiero decir que si el texto seleccionado tiene nombre que si es $tipo=1 y si es $cl=18 o 17 o 16, entonces alli es donde abro el txt y lo envio a una bd ejemplo la 1-18, 1-16 o 1-17 segun sea el caso; */
}
if ($selected_radio ) {
/* aqui igual que el anterior pero con $tipo=2 con $cl=18 , 17 o 16 segun sea el caso y lo abro y guado a la bd;
}
}
?>
Fin del codigo --------------->
Entonces como veras en el radio le doy ala propiedad de value que lleve las variables que necesito que es la identificación del nombrre del archivo que selecciono. entonces quiero si lo ves arriba que si en el nombre del texto esta identificado con $tipo=1 y con los $cl=17, 18 o 19 lo agregen a una bd diferente y si en el caso de ser de $tipo=2 agrege en otra.
Yo entiendo como subir ya y abrir los txt y luego subirlos pero no tengo idea de como hacer lo mencionado arriba. Espero haber podido ser entendido.
Muchas gracias nuevamente
El primer problema es que los parámetros de sscanf han de ser facilitados con referencia. Por tanto, la línea:
$linea=sscanf($file,"%2s%1d%2d%2s%1d%4s",$ini,$tipo,$cl,$year,$lapso,$fin);
debería ser:
$linea=sscanf($file,"%2s%1d%2d%2s%1d%4s",&$ini,&$tipo,&$cl,&$year,&$lapso,&$fin);
Una vez tengas los datos correctos, como ya te dije anteriormente, debes abrir el fichero con fopen y leer cada línea con fgets, extraer los datos y guardarlos en las tablas correspondientes.
Vuélvete a leer mis respuestas anteriores donde te facilito enlaces con ejemplos de todas estas operaciones.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas