Importación de CSV a través de PHP

Estoy importando un .CSV a una aplicación con lo siguiente:

if (($handle = fopen($file, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}

Funciona, pero está lejos de ser perfecto. Primero quería sacar los encabezados de las filas y colocarlos en una matriz y luego recorrer cada fila para obtener los conjuntos de datos.

Parece tener problemas de delimitación ya que la primera fila (cabezas) también incluye algunas partes de la segunda fila.

Exporté el archivo .csv directamente desde Excel. Me pregunto si hay trucos de codificación, etc., que podría estar perdiendo.

preguntado el 12 de junio de 12 a las 16:06

4 Respuestas

Suena como tu 1000 el límite no es lo suficientemente largo; debe configurarlo en un valor lo suficientemente alto para ese archivo ... o configurarlo en 0 para ilimitado (no recomendado, porque tiende a ser más lento).

Configurarlo para 4096 or 8192 primero y ver cómo va.

// use 8kB buffer for reading comma delimited line
while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {

Noticias

Bien, pensándolo bien, tal vez deberías inspeccionar el archivo y confirmar algunas cosas:

  1. ¿Los delimitadores son realmente una coma? (Supongo que ya has establecido esto)
  2. ¿Los recintos de cadenas son siempre comillas dobles?
  3. ¿Las cadenas se escapan con una barra invertida (predeterminado) u otra comilla doble?

Respondido el 12 de junio de 12 a las 16:06

Lo complicado que tengo es que quiero leer en la primera línea como encabezados y luego adjuntar la información a cada encabezado para obtener más líneas. Pero la lectura de las líneas parece incorrecta en comparación con cómo se muestra en Excel. Creo que el problema podría tener que ver con el formato en el que se está guardando. - David

fgetcsv no siempre detecta correctamente los finales de línea.

Intente usar antes de la llamada fgetcsv:

ini_set('auto_detect_line_endings', true);

Respondido el 13 de junio de 12 a las 12:06

Cambié a 8192 y obtuve los mismos resultados.

while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
...
}

y luego hice este y obtuve los mismos resultados

$handle = fopen($_FILES['filename']['tmp_name'], "r");
ini_set('auto_detect_line_endings', true);
    while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
         $data = array_map('mysql_real_escape_string', $data);

respondido 07 mar '16, 17:03

¿Por qué no estás usando file ()?

     $trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

Respondido el 12 de junio de 12 a las 16:06

Los valores en CSV pueden contener saltos de línea, por lo que este enfoque no funcionará de manera confiable. - Jack

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.