Pregunta

Estoy tratando de leer datos del archivo a.csv para mostrarlos en una página web como texto.

Es la primera vez que hago esto y me encuentro con un pequeño problema desagradable.

Mi archivo .csv (que se abre de forma predeterminada por Excel), tiene varias filas y lo leo todo como una cadena larga.

así:

$contents = file_get_contents("files/data.csv");

En este archivo de ejemplo que hice, hay 2 líneas.

  

Paul Blueberryroad   85 us Flashlight, Bag 20 de noviembre,   2008, 4:39 pm

     

Hellen Blueberryroad   Lente 85 us 13mm, linterna, bolsa, baterías extra Noviembre   20, 2008, 16:41:32

Pero la cadena leída por PHP es esta:

Paul; Blueberryroad 85; nosotros; linterna, bolsa; 20 de noviembre de 2008, 4:39 pmHellen; Blueberryroad 85; nosotros; lente de 13 mm, linterna, bolsa, baterías adicionales; 20 de noviembre de 2008, 16:41:32

Estoy dividiendo esto con:

list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);

Lo que quiero es que $ name [] contenga " Paul " y "Hellen" como su contenido Y los otros arreglos para recibir los valores de sus respectivas columnas.

En cambio, solo obtengo a Paul y el contenido de $ orderdate [] es

  

20 de noviembre de 2008, 4:39 pmHellen

Entonces todas las filas están concatenadas. ¿Alguien puede mostrarme cómo puedo lograr lo que necesito?

EDITAR: solución encontrada, solo queda una cosa extraña:

Lo he resuelto ahora usando este código:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

Por alguna razón, aunque mi archivo CSV solo tiene 2 filas, devuelve 2 matrices y 1 booleano. Los primeros 2 son mis matrices de datos y el booleano es 0.

¿Fue útil?

Solución

Es mejor usar fgetcsv () que conoce la estructura de archivos CSV y tiene opciones designadas para manejar archivos CSV. Alternativamente, puede usar str_getcsv () en el contenido de el archivo en su lugar.

Otros consejos

La función file () lee un archivo en una matriz, cada línea es una entrada de la matriz.

Para que pueda hacer algo como:

$rows = array();
$name = array();
$street = array();
$country = array();

$rows = file("file.csv");
foreach($rows as $r) {
    $data = explode(";", $r);
    $name[] = $data[0];
    $street[] = $data[1];
    $country[] = $data[2];
}

Lo he resuelto ahora usando este código:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

Por alguna razón, aunque mi archivo CSV solo tiene 2 filas, devuelve 2 matrices y 1 booleano. Los primeros 2 son mis matrices de datos y el booleano es 0.

El comentario sobre fgetcsv es correcto.

Todavía responderé a su pregunta, con fines educativos. En primer lugar, no entiendo la diferencia entre sus datos (con comas) y la cadena "leída por PHP". (¿sustituye algunos espacios con punto y coma, pero no todos?). PD: Miré el código fuente de su mensaje, parece una extraña combinación de TSV (pestañas) y CSV (coma).

Además, si quieres seguir este camino, primero debes dividir el archivo en líneas, luego las líneas en los campos.

La mejor manera es, por supuesto, fgetcsv () como se señaló.

$f = fopen ('test.csv', 'r');
while (false !== $data = fgetcsv($f, 0, ';'))
    $arr[] = $data;
fclose($f);

Pero si tiene el contenido en una variable y desea dividirlo, y str_getcsv no está disponible, puede usar esto:

function str_split_csv($text, $seperator = ';') {
    $regex = '#' . preg_quote($seperator) . '|\v#';
    preg_match('|^.*$|m', $text, $firstline);
    $chunks = substr_count($firstline[0], $seperator) + 1;
    $split = array_chunk(preg_split($regex, $text), $chunks);
    $c = count($split) - 1;
    if (isset($split[$c]) && ((count($split[$c]) < $chunks) || (($chunks == 1) && ($split[$c][0] == ''))))
        unset($split[$c]);
    return $split;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top