2013-02-28 7 views
4

J'exporte des données dans un fichier CSV en utilisant fputcsv. J'ai des chaînes qui sont en cours d'écriture, mais j'ai besoin que les données soient placées entre guillemets.Ajouter au devis CSV Export

foreach ($orderDetails['lines'] as $line) { 
    fputcsv($orderImportCsv, $line); 
} 

Cela crée les éléments suivants lors de l'ouverture dans un éditeur (sublime)

L, M3344, 100

L, M3356,, 50

Je dois avoir chacun de ces champs enveloppés dans des guillemets doubles.

J'ai donc essayé:

foreach ($lines as &$line) { 
    foreach ($line as &$column) { 
     $column = '"' . $column . '"'; 
    } 
} 

Donc, essentiellement, cela devrait passer par chacun des champs de lignes et l'envelopper dans « ». Cependant, après l'exécution que je reçois la sortie suivante:

"" "L" "", "" "M3344" "", "" "" "" "" "100" ""

"" "l" "", "" "M3356" "", "" "" "" "" "50" ""

Il est en train de mettre 2 ensembles de guillemets doubles autour de la variable!

Y a-t-il une meilleure façon de procéder?

MISE À JOUR

Je sais que fputcsv a deux paramètres facultatifs. Délimiteur et enceinte. Cependant je crois que l'enceinte par défaut à "" mais seulement quand la chaîne est divisée en mots séparés.

Répondre

3

Puisque vous insérez le boîtier vous-même, vous devez demander à PHP de n'en utiliser aucun. Il ne semble pas être un moyen documenté pour le faire, mais en utilisant un espace semble fonctionner:

<?php 
foreach($orderDetails['lines'] as $line){ 
    foreach ($line as &$column) { 
     $column = '"' . $column . '"'; 
    } 
    unset($column); 

    fputcsv($orderImportCsv, $line, ',', ' '); 
} 

Ou vous pouvez simplement éviter fputcsv() et tout composer vous-même.

+0

Bien qu'un travail autour de ce qui semble faire le travail. merci – iamjonesy

+0

Cette solution de contournement fait certainement l'affaire, cependant, il est ennuyeux que fputcsv() ajoute des espaces supplémentaires autour de tout quand "" est utilisé comme paramètre $ enclosure, mais n'autorise pas une chaîne vide comme l'enceinte $ elle-même. – hberg

1

Si vous devez avoir des citations sur chaque champ, alors fputcsv ne sera pas assez bon, j'ai peur. Vous ne pouvez pas forcer les guillemets en les ajoutant aux valeurs avant de faire fputcsv ne fonctionnera pas car PHP voit ces guillemets dans les champs qui ont besoin d'espace ou de virgule.

comme faisant partie des valeurs du champ, et doivent donc être échappés (en ajoutant d'autres citations). Pour forcer des citations dans tous les champs, vous devez générer l'enregistrement CSV manuellement. Quelque chose comme ça devrait faire l'affaire:

$quoteCSV = function($field) { 
    return '"'.$field.'"'; 
} 

foreach ($lines as $line) { 
    fputs($file, implode(',',array_walk($field, $quoteCSV))); 
} 

Remarques: 1. Ce code nécessite PHP 5.3 ou supérieur, en raison de l'utilisation de la fonction lambda. 2. Je n'ai pas essayé de gérer les champs qui contiennent effectivement des guillemets, car vous n'avez pas spécifié comment ils devraient être échappés.Le code ci-dessus va produire un fichier CSV cassé si l'une des données contient des guillemets. Je vous laisse le soin de régler cela au besoin.

Espérons que ça aide.

Je dirais, cependant, que l'exigence d'ajouter des citations à chaque champ est assez inhabituelle; Bien qu'il soit reconnu comme un fichier CSV, la plupart des programmes qui génèrent du CSV feront ce que PHP fait, et n'ajouteront que des citations si nécessaire. Et pratiquement tous les programmes que j'ai rencontrés pour lire des fichiers CSV sont parfaitement satisfaits de cet arrangement. Il pourrait être utile de vérifier pourquoi cette exigence existe - cela ressemble à un problème avec le logiciel à l'autre extrémité plutôt que tout ce que vous devriez faire de votre côté.

+0

Belle solution utilisant la fonction lambda bien qu'il y ait une légère erreur ... array_walk retourne un booléen donc implode va lancer une erreur. utilisez array_walk sur la ligne $ (pas $ field) avant d'appeler implode. En outre, la fonction lambda devrait transmettre le champ $ par référence, ce qui devrait être le champ & $. Avec ces changements, tout fonctionne très bien! – frijj2k

-1

Ceci est tout à fait normal, si vous créez un fichier CSV avec Excel et encadrez une cellule avec double quota, puis, il a ajouté d'autres dans le fichier source, par exemple:

Voici comment CSV apparaît dans Microsoft Office Excel 2007:

" 
"" 
""" 
"""" 
""""" 

code source:

"""", 
"""""", 
"""""""", 
"""""""""", 
"""""""""""", 

Alors tout se passe bien, comme vous pouvez le voir le premier exemple dans le documentation:

<?php 

$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'), 
    array('123', '456', '789'), 
    array('"aaa"', '"bbb"') 
); 

$fp = fopen('file.csv', 'w'); 

foreach ($list as $fields) { 
    fputcsv($fp, $fields); 
} 

fclose($fp); 
?> 

L'exemple ci-dessus écrivez ce qui suit à file.csv:

aaa,bbb,ccc,dddd 
123,456,789 
"""aaa""","""bbb"""