Leer e imprimir csv con phph

  • Autor Autor roberts
  • Fecha de inicio Fecha de inicio
R

roberts

Préstamo
Gamma
Programador
Hola Betas! Necesito algo de ayuda con esto, tengo esto:


PHP:
$tabla = mysql_query("SELECT * FROM test"); // selecciono todos los registros de la tabla usuarios, ordenado por nombre

$cantidad = mysql_num_rows($tabla);

while ($registro = mysql_fetch_array($tabla)) { // comienza un bucle que leera todos los registros y ejecutara las ordenes que siguen

	
										  									  
echo "
<tr>
<td>". $registro["Bib"] ."</td>
<td>". $registro["Overall_Place"] ."</td>
<td>". $registro["First_Name"] ."</td>
<td>". $registro["Last_Name"] ."</td>
<td>". $registro["Event"] ."</td>
";

}
?>			
						                </tr>
						               
						              </tbody>
						            </table>
									
									<?php
									  if($cantidad == 0) { 

echo "<center><div class='alert alert-danger alert-dismissable'>
<button class='close' data-dismiss='alert'>&times;</button>
<strong>Opss!</strong> No se encontraron registros
</div></center>";

}

?>


Basicamente selecciona esas tablas y las imprime, quisiera hacer lo mismo pero no desde una base de datos si con un un archivo CSV

Espero que me puedan ayudar
 
Si mal no recuerdo, los archivos CSV son los que los campos van separados por algún carácter/cadena, no? En ese caso puedes ir leyendo linea por linea y hacerle un explode para sacar cada valor.

Por ejemplo, si tienes algo como:
Insertar CODE, HTML o PHP:
5||juan||32
6||mario||15

Con algo como:
PHP:
$user = explode($linea, '||');
echo 'ID: ' . $user[0] . '<br>';
echo 'Nombre: ' . $user[1] . '<br>';
echo 'Edad: ' . $user[2] . '<br>';
 
Última edición:
Si mal no recuerdo, los archivos CSV son los que los campos van separados por algún carácter/cadena, no? En ese caso puedes ir leyendo linea por linea y hacerle un explode para sacar cada valor.

Por ejemplo, si tienes algo como:
Insertar CODE, HTML o PHP:
5||juan||32
6||mario||15

Con algo como:
PHP:
$user = explode($linea, '||');
echo 'ID: ' . $user[0] . '<br>';
echo 'Nombre: ' . $user[1] . '<br>';
echo 'Edad: ' . $user[2] . '<br>';

Gracias man, probando!
 
si creo que es asi como te dice el amigo de arriba.
 
Como podira buscar un texto en espesifico dentro del archivo CSV???? [MENTION=8317]lombervid[/MENTION]
 
Como podira buscar un texto en espesifico dentro del archivo CSV???? [MENTION=8317]lombervid[/MENTION]

Podrías usar un file_get_contents para sacar el contenido y ya sobre ese usar un strpos o algo similar.
 
Creo que esto podría valerte. Lo he hecho así al vuelo, quizá haya alguna errata, aunque espero que no 🙂.

PHP:
<?php
  // Busqueda de CSV para Forobeta :)

  // Configuración
  define('SEPARATE_CHAR', ';'); // Para división de campo con ';' puede ser '||' o cualquier otro...
  define('BUFFER_SIZE', 4096); // Tamaño del buffer

  // Obtener un registro
  function csvGetRecord($line) {
    return(explode($line, SEPARATE_CHAR));
  }

  // Buscar registros donde coincide la búsqueda
  // No distingue entre mayúsculas y minúsculas
  function csvSearch($search, $file) {
    $result = array();
    // Se emplea fopen para no colapsar la memoria si el fichero es muy largo como file_get_contents...
    // ...o mejor usar file() que lee por lineas y va a un array y es más cómodo.
    $f = fopen($file, 'r') or exit('Fichero no encontrado');
    while(!feof($f)) {
      $line = fgets($f, BUFFER_SIZE);
      if(stripos($line, $search) !== FALSE) {
        $result[] = csvGetRecord($line);
      }
    }
    fclose($f);
    return($result);
  }

  // Ejemplo
  $registros = csvSearch('Carlos', 'fichero.csv');

  print_r($registros);
 
Última edición:
Creo que esto podría valerte. Lo he hecho así al vuelo, quizá haya alguna errata, aunque espero que no 🙂.

PHP:
<?php
  // Busqueda de CSV para Forobeta :)

  // Configuración
  define('SEPARATE_CHAR', ';'); // Para división de campo con ';' puede ser '||' o cualquier otro...
  define('BUFFER_SIZE', 4096); // Tamaño del buffer

  // Obtener un registro
  function csvGetRecord($line) {
    return(explode($line, SEPARATE_CHAR));
  }

  // Buscar registros donde coincide la búsqueda
  // No distingue entre mayúsculas y minúsculas
  function csvSearch($search, $file) {
    var $result = array();
    // Se emplea fopen para no colapsar la memoria si el fichero es muy largo como file_get_contents...
    // ...o mejor usar file() que lee por lineas y va a un array y es más cómodo.
    $f = fopen($file, 'r') or exit('Fichero no encontrado');
    while(!feof($f)) {
      $line = fgets($f, BUFFER_SIZE);
      if(stripos($line, $search) !== FALSE) {
        $result[] = csvGetRecord($line);
      }
    }
    $fclose($f);
    return($result);
  }

  // Ejemplo
  $registros = csvSearch('Carlos', 'fichero.csv');

  print_r($registros);

Gracias man! Pero en esta linea me da un error de syntaxis: var $result = array();
 
Elimina "var"

Ya no va esto en el php más nuevo.

Dejando la linea como
PHP:
$result = array();

PD: Deformación profesional de otros lenguajes 😉
 
Elimina "var"

Ya no va esto en el php más nuevo.

Dejando la linea como
PHP:
$result = array();

PD: Deformación profesional de otros lenguajes 😉

Ya lo habia hecho jejeje igual me da los siguientes errores:

Notice: Undefined variable: fclose in C:\wamp\www\new\var.php on line 26

Fatal error: Function name must be a string in C:\wamp\www\new\var.php on line 26

Saludos!
 
Había una errata en la linea 26, sobraba el primer $. Ya cambiado 🙂

PHP:
    fclose($f);
 
Había una errata en la linea 26, sobraba el primer $. Ya cambiado 🙂

PHP:
    fclose($f);

Hola man lo he probado, pero solo me devuelve nombre de Array, ej:

Array ( [0] => Array ( [0] => ; ) [1] => Array ( [0] => ; ) [2] => Array ( [0] => ; ) [3] => Array ( [0] => ; ) [4] => Array ( [0] => ; ) )

Y cuando coloco esto para que me muestre el valor de la fila encontrada:
PHP:
$registros[1]
imprime esto: Array


Tengo esta otra funcion que lee el fichero he imprime lo que hay en cada linea;


PHP:
if (($gestor = fopen("resultadosoveral-gru.csv", "r")) !== FALSE) {
    while (($datos = fgetcsv($gestor, 1000, ",")) !== FALSE) {
        $numero = count($datos);


echo "
<tr>
<td>". $datos[0] ."</td>
<td>". $datos[1] ."</td>
<td>". $datos[2] ."</td>
<td>". $datos[3] ."</td>
 
Última edición:
$registro[1] te da un array porque es un array.

Cada $registro es un array con los campos dentro. Para ver un campo tiene que ser $registro[1][1] que es el registro 1 (empiezan por 0) y el campo 1 (empieza por 0).


Sobre el ; no se si habrás cambiar el caracter de define('SEPARATE_CHAR', ';'); para elegir qué caracter los separa. Hay que poner el que sea, si es coma o punto y coma o el que sea.

Pega aqui el fichero para ver qué lee.

- - - Actualizado - - -

Recuerda que te lee todos los registros que aparece lo que buscar, no solo un registro, asi que queda algo como

$registros = array(
0 = array( // registro 0
0 = valor, // campo 0
1 = valor // campo 1
),
1 = array( registro 1
0 = valor, // campo 0
1 = valor, // campo 1
2 = valor // campo 2
)
)
 
$registro[1] te da un array porque es un array.

Cada $registro es un array con los campos dentro. Para ver un campo tiene que ser $registro[1][1] que es el registro 1 (empiezan por 0) y el campo 1 (empieza por 0).


Sobre el ; no se si habrás cambiar el caracter de define('SEPARATE_CHAR', ';'); para elegir qué caracter los separa. Hay que poner el que sea, si es coma o punto y coma o el que sea.

Pega aqui el fichero para ver qué lee.

El fichero básicamente tiene unos 30 campo pero de ellos solo me interesan 17, nombre, apellido, edad y unos tantos. No puedo pegarlo por que es muy amplio, igual utilizando $registro[1][1] no imprime nada. La funcion que creaste trabaja por que te dice la cantidad de campos encontrados que coinsiden, sin embargo no muestra la informacion que hay en ellos, pienso que con eso terminaria con esto.

Basicamente lo quiero para hacer una busqueda desde un formulario. Utilizaria GET para captar el parametro y tu funcion para imprimir los resultados.
 
He revisado todo y lo que pasaba es que la función estaba al revés:

PHP:
 // Obtener un registro
  function csvGetRecord($line) {
    return(explode(SEPARATE_CHAR, $line));
  }

Así es correcta man 😉

Probado en mi computadora
 
Última edición:
He revisado todo y lo que pasaba es que la función estaba al revés:

PHP:
 // Obtener un registro
  function csvGetRecord($line) {
    return(explode(SEPARATE_CHAR, $line));
  }

Así es correcta man 😉

Probado en mi computadora

Eres un crack amigo!!!! :welcoming:

Solo algo mas, como puedo separar esos arrays para estructurarlos, quiero mostrar los resultados en una tabla mas organizada. Gracias por tu ayuda man! Fue de muchisima utilidad 😛7:

Enviame un MP me gustaria agradecerte :greedy_dollars:
 
Para ponerlo en una tabla (varios registros).

PHP:
echo('<table>');
// Aqui se puede hacer echo de cabeceras o nombres de los campos
foreach($registros as $registro) {
  echo('<tr>');
  foreach($registro as $campo) {
    echo('<td>'.$campo.'</td>');
  }
  echo('</tr>');
}
echo('</table>');
 
Atrás
Arriba