J'essaie de convertir une gamme de produits en un fichier CSV, mais cela ne semble pas aller comme prévu. Le fichier CSV est une longue ligne, voici mon code:
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;
}
De plus, l'en-tête ne force pas un téléchargement. J'ai copié et collé la sortie et enregistré au format .csv
ÉDITER
PROBLÈME RÉSOLU:
Si quelqu'un d'autre cherchait la même chose, a trouvé une meilleure façon de le faire:
$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");
Réponses:
Au lieu d'écrire des valeurs, envisagez d'utiliser
fputcsv()
.Cela peut résoudre votre problème immédiatement.
la source
Il s'agit d'une solution simple qui exporte un tableau vers une chaîne csv:
la source
Essayez d'utiliser;
Pour terminer chaque nouvelle ligne dans votre sortie CSV.
Je suppose que le texte délimite, mais ne passe pas à la ligne suivante?
C'est une constante PHP. Il déterminera la bonne fin de ligne dont vous avez besoin.
Windows, par exemple, utilise "\ r \ n". Je me suis cassé la tête avec celui-là quand ma sortie ne passait pas à une nouvelle ligne.
comment écrire une nouvelle ligne unifiée en PHP?
la source
Je sais que c'est vieux, j'ai eu un cas où j'avais besoin que la clé de tableau soit également incluse dans le CSV, alors j'ai mis à jour le script de Jesse Q pour le faire. J'ai utilisé une chaîne comme sortie, car implode ne peut pas ajouter de nouvelle ligne (la nouvelle ligne est quelque chose que j'ai ajouté et devrait vraiment être là).
Veuillez noter que cela ne fonctionne qu'avec des tableaux à valeur unique
(key, value)
. mais pourrait facilement être mis à jour pour gérer plusieurs dimensions(key, array())
.la source
Dans mon cas, mon tableau était multidimensionnel, potentiellement avec des tableaux comme valeurs. J'ai donc créé cette fonction récursive pour démonter complètement le tableau:
Étant donné que les différents niveaux de mon tableau ne se prêtaient pas bien au format CSV plat, j'ai créé une colonne vide avec la clé du sous-tableau pour servir d '"intro" descriptive au niveau de données suivant. Exemple de sortie:
Vous pourriez facilement supprimer cette colonne "intro" (descriptive), mais dans mon cas, j'avais des en-têtes de colonne répétitifs, c'est-à-dire inbound_leads, dans chaque sous-tableau, ce qui m'a donné une pause / titre précédant la section suivante. Retirer:
après is_array () pour compacter davantage le code et supprimer la colonne supplémentaire.
Puisque je voulais à la fois une ligne de titre et une ligne de données, je passe deux variables dans la fonction et à la fin de l'appel à la fonction, termine les deux avec PHP_EOL:
Oui, je sais que je laisse une virgule supplémentaire, mais par souci de brièveté, je ne l'ai pas traité ici.
la source
Les tableaux de données sont convertis au format csv 'text / csv' par la fonction php intégrée fputcsv prend soin des virgules, des guillemets et etc.
Regardez
https://coderwall.com/p/zvzwwa/array-to-comma-separated -string-in-php
http://www.php.net/manual/en/function.fputcsv.php
la source
Cela a fonctionné pour moi.
la source