Leer un archivo de texto y guardar la información en una base de datos mysql con php

Hola a todos, en esta ocasión publicare un código para leer el contenido de un archivo txt  y guardar su información en una base de datos mysql con PHP.

ARCHIVO DE TEXTO

En el archivo de texto los valores se encuentran separados por un tabulador y tienen la siguiente estructura: clave, descripcion, precio

A001	ADAPTADOR DE AUDIO USB	120.00
A002	ADAPTADOR DE RED INALAMBRICO   149.00
A003	MONITOR LED LG 18.5"	1699.00

CODIGO PHP

Lo primero que vamos a hacer es establecer la conexión con la base de datos para guardar la información en la tabla productos


$conexion = new mysqli("localhost", "usuario", "password", "basedatos", "3306");

Ahora si vamos con el código que lee el archivo, para esto utilizamos la función  file, que se encarga de mandar la informacion del archivo a un arreglo .


$lineas = file('articulos.txt');

Luego iniciamos un ciclo para leer todas las lineas que contenga el archivo, aquí vamos a almacenar el contenido de cada linea en una arreglo llamado datos lo hacemos con la función explode que buscara cada tabulador. Con la función trim eliminamos los espacios en blanco que hayan quedado al principio y final de cada dato. Posterior mente creamos la consulta y la ejecutamos.


foreach ($lineas as $linea_num => $linea)
{
	$datos = explode("\t",$linea);

	$clave = trim($datos[0]);
	$producto = trim($datos[1]);
	$precio = trim($datos[2]);

    $consulta = "INSERT INTO tblproducto(clave,producto,precio) VALUES('$clave','$producto',$precio)";
	$conexion->query($consulta);
}

Aquí les dejo el código completo para descarga: Leerarchivosphp
Espero que les sirva.

26 comentarios en “Leer un archivo de texto y guardar la información en una base de datos mysql con php”

  1. Edner dice:

    HOLA AMIGO ESTA INTERESANTE TU CODIGO PERO CUAL ES LA CONTRASEÑA PARA DESCOMPRIMIRLO

    1. denker dice:

      Hola amigo, la contraseña es “www.codedrinks.com”

  2. denker dice:

    sin el “http://” solo “www.codedrinks.com”

  3. Carlos Paz dice:

    Excelente, gracias por compartir.

  4. roberto dice:

    una pregunta
    en que direccion, carpeta debe de estar el excel que quiero leer?

    1. denker dice:

      Hola, el archivo tendria que estar en la misma carpeta que el script de php o puedes indicar la ruta dentro de la funcion file
      $lineas = file('ruta/articulos.txt');

  5. Stalin dice:

    Amigo, necesito un codigo en php en el cual me permita sacar los datos de una base y guardarlas en un archivo txt,
    Gracias por su atencion

  6. victor dice:

    Amigo, buen aporte, pero tengo archivos de 8 10 y 25 mil registros, pero solamente sube un promedio de 1500. Me puedes ayudar con eso?–

    Gracias.

    1. denker dice:

      Puede ser que este alcanzando el limite de tiempo de la ejecucion del script, prueba con esta linea al principio de tu codigo

      ini_set('max_execution_time', 300); // 300 Indica el limite de tiempo durante el cual se ejecutará el script

  7. Salva dice:

    Hola Denker!

    Tu aportación me ha valido de mucho pero tengo algunos problemillas… Te explico un poco por encima y me dices si puedes.

    Es una tienda online y lo estoy utilizando para importar pedidos desde otra tienda online. El archivo es txt delimitado por tabulaciones, contiene unas 20 columnas y ya me inserta cada columna en la bd y me crea el pedido perfectamente, hasta aquí perfecto. El problema es que solo me está leyendo la primera línea y solo me crea un pedido, el segundo problema es que el archivo txt trae encabezados y necesitaría empezar a leer desde la segunda línea.

    Muchas gracias de antemano!

  8. pipe dice:

    hola estoy intentando importar un txt desde una carpeta compartida pero me arroja los siguientes errores:
    Warning: file(\******\*****\****\PuertosDslam.txt): failed to open stream: No such file or directory in C:\xampp\htdocs\proyecto\importacion.php on line 3

    Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\proyecto\importacion.php on line 4

    Como puedo solucionarlo gracias

  9. Sabrina dice:

    Mil gracias es de mucha ayuda esta informacion, es valiosa. Mi proyecto funciona excelente gracias a esto 🙂

  10. katikaen4 dice:

    Hola! Muchas gracias por compartir la información, me sirvió de mucho. Una consulta: cómo hago para cargar un archivo desde cualquier parte del directorio? No logro hacerlo con la instrucción que diste, pues soy muy nueva en este lenguaje. Por otra parte me gustaría saber qué diferencia habría en caso de cargar archivos xls?
    Gracias de antemano por tu ayuda

  11. Angel dice:

    Buen día, es excelente tu artículo, me ha servido mucho. Tengo solo una pregunta… ¿Cómo puedo hacer para que solo me inserte las filas que no estén aun en la bd? La ide es que el archivo de texto debe de actualizar la base de datos pero solo de los nuevos registros…

    Es pero puedas darme alguna pista y yo la desarrollo. Saludos!

  12. Raúl Alberto dice:

    Necesitó leer 488000 registros de un txt, pero me carga a lo sumó 1800, que puedo hacer que me recomiendan, quedó atento gracias

    1. sun2012 dice:

      hola, como sabras el servidor apache executa una petición por un determinado tiempo por lo general son 30 segundos, tienes dos opciones: 1 aumentar el tiempo de ejecución del servidor max_execution_time y la segunda hacer un escript que vaya leyendo de 1500 en 1500 por ejemplo, que ejecute la inserción por bloques, ya que no puedes calcular el tiempo de ejecucíon de la carga de tus 488000 registros.

  13. Hola, gracias por el tuto, amigo por favor ayudame, tengo un archivo .dat del cual tengo que extraer campos y guardarlos a una bd, el problema es que este archivo no tiene ningún tipo de separador, en el manual solo dice el formato(19)po ejemplo sería el tamaño del campo si no completa el tamaño total lo completa con espacios en blanco en caso de ser numérico completa con ceros, he tratado de extraer cada campo por sus posiciones de inicio y fin pero no creo que sea lo mas optimo ya que por cada campo tendría que ver donde acaba el campo anterior y extraer desde donde empieza el otro campo,
    asi es como se ve: una linea cada campo esta junto

    10/11/2015 09:41:0410/11/2015US84265V1052SCCO 0CMSOUTHERN COPPER CORPORATION Equity RV3 REGULAR RV3_USD_VL_PBY Equity 0000000000500001 0111110000100000000100000000000000000000000001289000000000008845960860000000008845960860000000000000000000000 000000004000000000000005/11/201524/11/20150000000000000000000000 Y0000011320 (*) USD10/11/2015001

  14. juan dice:

    Muy bueno garacias

  15. Carlos dice:

    Buen día,

    Es posible cambiar la ruta del archivo , lo que deseo es cargarla desde “mis documentos” y enviarla directo al servidor por decirlo así y no guardarla en la carpeta del servidor , esto se puede ?

    Gracias

  16. Pablo Dante dice:

    Hola buen día.
    Una pregunta nada más.
    En el caso que por ejemplo en el índice 1 del arreglo el valor que ingrese sea “vacío” o “nulo”.
    Cómo puedo excluir o en su defecto reemplazar ese valor por un comentario por defecto?
    Muy buen post.
    Un saludo cordial.

  17. camilo dice:

    buenas amigo porfa ayudame,hace dias estoy lidiando con un caso parecido pero la cuestion es que el texto que quiero desarmar esta compuesto por muchos delimitadores y no encuentro la funcion que me permita dividir los datos de cada linea… intente con explode pero me di cuenta de que solo toma un solo parametro como delimitador… Gracias

  18. Marín dice:

    Buenas noches tengo un problema con la lectura de un archivo txt y pasar los datos a una BD mysql, el problema radica en que en un archivo txt tengo unos recibos de nómina pero no encuentro la forma de depositar esa información en la base de datos. Aquí el archivo.
    CARROS USADOS
    CANCELACION A: 01-EMPLEADOS
    2SDA QCNA DE ENERO 2007
    Nomina Nro: 02 Periodo: Desde 16-01-2007 Hasta 31-01-2007
    RECIBO NUMERO : 2442

    BANFOANDES CTA:020000001232 FECHA DE EMISION : 31/01/07
    CARGO TRABAJADOR CEDULA APELLIDOS Y NOMBRES Nro.Pago
    1 1 5,658,744 CARLOS SANCHEZ 1
    CARGO: PRESIDENTE
    A S I G N A C I O N E S D E D U C C I O N E S
    COD DESCRIPCION CT CUOTA SALDO TRA DESCRIPC. CT CUOTA SALDO
    000SUELDO 15.00 2277000.00
    001 S.S.O 01 29557.20 503056.56
    002 P/FORZOSO 01 7389.30 125764.25
    003 P/HABITAC. 01 22770.00 441540.00
    004 F/DE JUB. 01 68310.00 1324620.00

    TOTAL ASIGNACION 2,277,000.00 TOTAL DEDUCCION 128,026.50 NETO 2148,973.50

    CARROS USADOS
    CANCELACION A: 01-EMPLEADOS
    2SDA QCNA DE ENERO 2007
    Nomina Nro: 02 Periodo: Desde 16-01-2007 Hasta 31-01-2007
    RECIBO NUMERO : 2445

    BANFOANDES CTA:020000001232 FECHA DE EMISION : 31/01/07
    CARGO TRABAJADOR CEDULA APELLIDOS Y NOMBRES Nro.Pago
    5 32 4,451,387 TORREALBA, DONATO 1
    CARGO: CHOFER
    A S I G N A C I O N E S D E D U C C I O N E S
    COD DESCRIPCION CT CUOTA SALDO TRA DESCRIPC. CT CUOTA SALDO
    000SUELDO 15.00 400056.25
    001 S.S.O 01 9232.08 157127.62
    002 P/FORZOSO 01 2308.03 39282.07
    003 P/HABITAC. 01 4000.56 77576.12
    004 F/DE JUB. 01 12001.69 232728.38

    TOTAL ASIGNACION 400,056.25 TOTAL DEDUCCION 27,542.36 NETO 372,513.89

    CARROS USADOS
    CANCELACION A: 01-EMPLEADOS
    2SDA QCNA DE ENERO 2007
    Nomina Nro: 02 Periodo: Desde 16-01-2007 Hasta 31-01-2007
    RECIBO NUMERO : 2443

    BANFOANDES CTA:020000001232 FECHA DE EMISION : 31/01/07
    CARGO TRABAJADOR CEDULA APELLIDOS Y NOMBRES Nro.Pago
    2 2 8,779,514 GONZALEZ GAMEZ, ANA A. 1
    CARGO: ASISTENTE DEL ALCALDE
    A S I G N A C I O N E S D E D U C C I O N E S
    COD DESCRIPCION CT CUOTA SALDO TRA DESCRIPC. CT CUOTA SALDO
    000SUELDO 15.00 480067.50

    TOTAL ASIGNACION 480,067.50 TOTAL DEDUCCION 0.00 NETO 480,067.50

    CARROS USADOS
    CANCELACION A: 01-EMPLEADOS
    2SDA QCNA DE ENERO 2007
    Nomina Nro: 02 Periodo: Desde 16-01-2007 Hasta 31-01-2007
    RECIBO NUMERO : 2446

    BANFOANDES CTA:020000001232 FECHA DE EMISION : 31/01/07
    CARGO TRABAJADOR CEDULA APELLIDOS Y NOMBRES Nro.Pago
    6 86 9,885,454 HERRERA, JOSE 1
    CARGO: CHOFER
    A S I G N A C I O N E S D E D U C C I O N E S
    COD DESCRIPCION CT CUOTA SALDO TRA DESCRIPC. CT CUOTA SALDO
    000SUELDO 15.00 312043.88
    012 SABADOS 1.00 20802.93 20802.93 001 S.S.O 01 7201.03 129390.56
    060 H/EXTRA 16.00 54087.68 54087.68 002 P/FORZOSO 01 1800.25 32347.66
    003 P/HABITAC. 01 3120.44 64291.73
    004 F/DE JUB. 01 9361.32 192875.19

    TOTAL ASIGNACION 386,934.49 TOTAL DEDUCCION 21,483.04 NETO 365,451.45

    CARROS USADOS
    CANCELACION A: 01-EMPLEADOS
    2SDA QCNA DE ENERO 2007
    Nomina Nro: 02 Periodo: Desde 16-01-2007 Hasta 31-01-2007
    RECIBO NUMERO : 2522

    BANFOANDES CTA:020000001232 FECHA DE EMISION : 31/01/07
    CARGO TRABAJADOR CEDULA APELLIDOS Y NOMBRES Nro.Pago
    128 90 10,674,504 PADRON LIMA, ANGELA MERCEDES 1
    CARGO: SECRETARIA II
    A S I G N A C I O N E S D E D U C C I O N E S
    COD DESCRIPCION CT CUOTA SALDO TRA DESCRIPC. CT CUOTA SALDO
    000SUELDO 15.00 278439.15
    001 S.S.O 01 6425.53 12851.06
    002 P/FORZOSO 01 1606.38 3212.76
    003 P/HABITAC. 01 2784.39 5568.78
    004 F/DE JUB. 01 8353.17 16706.34

    TOTAL ASIGNACION 278,439.15 TOTAL DEDUCCION 19,169.47 NETO 259,269.68

    CARROS USADOS
    CANCELACION A: 01-EMPLEADOS
    2SDA QCNA DE ENERO 2007
    Nomina Nro: 02 Periodo: Desde 16-01-2007 Hasta 31-01-2007
    RECIBO NUMERO : 2473

    BANFOANDES CTA:020000001232 FECHA DE EMISION : 31/01/07
    CARGO TRABAJADOR CEDULA APELLIDOS Y NOMBRES Nro.Pago
    47 90 14,146,570 PAGUA GONZALEZ, MIRIVEL LISAIZ 1
    CARGO: SECRETARIA I
    A S I G N A C I O N E S D E D U C C I O N E S
    COD DESCRIPCION CT CUOTA SALDO TRA DESCRIPC. CT CUOTA SALDO
    000SUELDO 15.00 370003.65
    060 H/EXTRA 16.00 64133.92 64133.92 001 S.S.O 01 8538.55 56136.23
    002 P/FORZOSO 01 2134.63 14033.97
    003 P/HABITAC. 01 3700.04 27094.61
    004 F/DE JUB. 01 11100.11 81283.81

    TOTAL ASIGNACION 434,137.57 TOTAL DEDUCCION 25,473.33 NETO 408,664.24

    CARROS USADOS
    CANCELACION A: 01-EMPLEADOS
    2SDA QCNA DE ENERO 2007
    Nomina Nro: 02 Periodo: Desde 16-01-2007 Hasta 31-01-2007
    RECIBO NUMERO : 2464

    BANFOANDES CTA:020000001232 FECHA DE EMISION : 31/01/07
    CARGO TRABAJADOR CEDULA APELLIDOS Y NOMBRES Nro.Pago
    34 74 17,352,762 TORREALBA C, DERSON LUIS 1
    CARGO: MENSAJERO I
    A S I G N A C I O N E S D E D U C C I O N E S
    COD DESCRIPCION CT CUOTA SALDO TRA DESCRIPC. CT CUOTA SALDO
    000SUELDO 15.00 278439.15
    060 H/EXTRA 7.00 21115.01 21115.01 001 S.S.O 01 6425.53 112895.54
    002 P/FORZOSO 01 1606.38 28224.14
    003 P/HABITAC. 01 2784.39 55524.78
    004 F/DE JUB. 01 8353.17 166574.34

    TOTAL ASIGNACION 299,554.16 TOTAL DEDUCCION 19,169.47 NETO 280,384.69

    CARROS USADOS
    CANCELACION A: 01-EMPLEADOS
    2SDA QCNA DE ENERO 2007
    Nomina Nro: 02 Periodo: Desde 16-01-2007 Hasta 31-01-2007
    RECIBO NUMERO : 2466

    BANFOANDES CTA:020000001232 FECHA DE EMISION : 31/01/07
    CARGO TRABAJADOR CEDULA APELLIDOS Y NOMBRES Nro.Pago
    36 87 9,857,993 RODRIGUEZ D,.DIOGENES A. 1
    CARGO: COORDINADOR
    A S I G N A C I O N E S D E D U C C I O N E S
    COD DESCRIPCION CT CUOTA SALDO TRA DESCRIPC. CT CUOTA SALDO
    000SUELDO 13.00 381386.95
    001 S.S.O 01 8801.24 8801.24
    002 P/FORZOSO 01 2200.32 2200.32
    003 P/HABITAC. 01 3813.87 3813.87
    004 F/DE JUB. 01 11441.61 11441.61

    TOTAL ASIGNACION 381,386.95 TOTAL DEDUCCION 26,257.04 NETO 355,129.91

    CARROS USADOS
    CANCELACION A: 01-EMPLEADOS
    2SDA QCNA DE ENERO 2007
    Nomina Nro: 02 Periodo: Desde 16-01-2007 Hasta 31-01-2007
    RECIBO NUMERO : 2448

    BANFOANDES CTA:020000001232 FECHA DE EMISION : 31/01/07
    CARGO TRABAJADOR CEDULA APELLIDOS Y NOMBRES Nro.Pago
    11 80 2,511,302 VARGAS RODRIGUEZ, TEODOMIRO E. 1
    CARGO: DIRECTOR EJECUTIVO
    A S I G N A C I O N E S D E D U C C I O N E S
    COD DESCRIPCION CT CUOTA SALDO TRA DESCRIPC. CT CUOTA SALDO
    000SUELDO 15.00 600632.07

    TOTAL ASIGNACION 600,632.07 TOTAL DEDUCCION 0.00 NETO 600,632.07

    1. sun2012 dice:

      Pues busca una forma logica de leer los archivos en este caso por lineas si cada txt es diferente.

      1. Marín dice:

        Si yo aplique $archivo=(‘texto.txt’) y con el PHP:

        foreach ( $archiv as $clave=>$value)
        {
        echo $clave;
        echo $value;
        }
        pero me trae toda la información y requiero introducir estas lineas en un promedio de 33 lineas por fila al mysql para luego generar unos array de cada linea y después obtener datos como cédula nombre y sueldo.

        1. sun2012 dice:

          Pues obvio que va alistar todo, para ello debes codicionar la lectura por ejemplo si el primer renglon es la cedula pues sacas ese renglo y lo almacenas en una variable y si esta cedula: micedula pues debes eliminar de la variable la leyenda cedula: y dejar micedula o cuando lea ese renglon que solo asigne el valor despues de los dos puntos, asi tienes que ingeniarte como leer eso, si revisas el post hay un signo que va separando pero como es ya un archivo preparado pues no hay problema, pero en tu caso debes checar todos los posibles casos que te vayas encontrando. Por eso debes sacar los varoles limpios en un listado de tu archivo y ya que veas que estan bien apruebas la insercion, pero pues como te digo vas a tener que validar muchas cosas.

  19. alguien probó este codigo? funciona?

Deja un comentario