Estoy tratando de convertir una variedad de productos en un archivo CSV, pero no parece que vaya a planear. El archivo CSV es una línea larga, aquí está mi código:
for($i=0;$i<count($prods);$i++) {
$sql = "SELECT * FROM products WHERE id = '".$prods[$i]."'";
$result = $mysqli->query($sql);
$info = $result->fetch_array();
}
$header = '';
for($i=0;$i<count($info);$i++)
{
$row = $info[$i];
$line = '';
for($b=0;$b<count($row);$b++)
{
$value = $row[$b];
if ( ( !isset( $value ) ) || ( $value == "" ) )
{
$value = "\t";
}
else
{
$value = str_replace( '"' , '""' , $value );
$value = '"' . $value . '"' . "\t";
}
$line .= $value;
}
$data .= trim( $line ) . "\n";
}
$data = str_replace( "\r" , "" , $data );
if ( $data == "" )
{
$data = "\n(0) Records Found!\n";
}
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=your_desired_name.xls");
header("Pragma: no-cache");
header("Expires: 0");
array_to_CSV($data);
function array_to_CSV($data)
{
$outstream = fopen("php://output", 'r+');
fputcsv($outstream, $data, ',', '"');
rewind($outstream);
$csv = fgets($outstream);
fclose($outstream);
return $csv;
}
Además, el encabezado no fuerza la descarga. He estado copiando y pegando la salida y guardando como .csv
EDITAR
PROBLEMA RESUELTO:
Si alguien más estaba buscando lo mismo, encontró una mejor manera de hacerlo:
$num = 0;
$sql = "SELECT id, name, description FROM products";
if($result = $mysqli->query($sql)) {
while($p = $result->fetch_array()) {
$prod[$num]['id'] = $p['id'];
$prod[$num]['name'] = $p['name'];
$prod[$num]['description'] = $p['description'];
$num++;
}
}
$output = fopen("php://output",'w') or die("Can't open php://output");
header("Content-Type:application/csv");
header("Content-Disposition:attachment;filename=pressurecsv.csv");
fputcsv($output, array('id','name','description'));
foreach($prod as $product) {
fputcsv($output, $product);
}
fclose($output) or die("Can't close php://output");
Respuestas:
En lugar de escribir valores, considere usar
fputcsv()
.Esto puede resolver su problema de inmediato.
fuente
Esta es una solución simple que exporta una matriz a una cadena csv:
fuente
Intente usar;
Para terminar cada nueva línea en su salida CSV.
Supongo que el texto está delimitando, pero ¿no se mueve a la siguiente fila?
Esa es una constante de PHP. Determinará el final de línea correcto que necesita.
Windows, por ejemplo, usa "\ r \ n". Me destrocé los sesos con eso cuando mi salida no se estaba rompiendo a una nueva línea.
¿Cómo escribir una nueva línea unificada en PHP?
fuente
Sé que esto es antiguo, tuve un caso en el que necesitaba que la clave de matriz se incluyera también en el CSV, así que actualicé el script de Jesse Q para hacer eso. Usé una cadena como salida, ya que la implosión no puede agregar una nueva línea (la nueva línea es algo que agregué y realmente debería estar allí).
Tenga en cuenta que esto solo funciona con matrices de valor único
(key, value)
. pero podría actualizarse fácilmente para manejarlo en múltiples dimensiones(key, array())
.fuente
En mi caso, mi matriz era multidimensional, potencialmente con matrices como valores. Así que creé esta función recursiva para destruir la matriz por completo:
Dado que los diversos niveles de mi matriz no se prestaban bien al formato CSV plano, creé una columna en blanco con la clave de la submatriz para que sirviera como una "introducción" descriptiva al siguiente nivel de datos. Salida de muestra:
Podrías eliminar fácilmente esa columna "intro" (descriptiva), pero en mi caso tenía encabezados de columna repetidos, es decir, inbound_leads, en cada submatriz, por lo que me dio un salto / título antes de la siguiente sección. Eliminar:
después de is_array () para compactar aún más el código y eliminar la columna extra.
Como quería tanto una fila de título como una fila de datos, paso dos variables a la función y al completar la llamada a la función, termino ambas con PHP_EOL:
Sí, sé que dejo una coma adicional, pero en aras de la brevedad, no lo manejé aquí.
fuente
Las matrices de datos se convierten en formato csv 'texto / csv' mediante la función php incorporada fputcsv se encarga de las comas, comillas, etc.
Mire
https://coderwall.com/p/zvzwwa/array-to-comma-separated -string-in-php
http://www.php.net/manual/en/function.fputcsv.php
fuente
Funcionó para mí.
fuente