Bonjour à tous,

Je souhaiterai avoir de l'aide sur la fonction fputcsv.
Celle-ci à plusieurs paramêtre, elle a un de ses paramêtres qui permet de définir un caractère d'encadrement.
Mon problème c'est que je souhaiterais ne pas avoir de caractère d'encadrement.

Voici mon code :

$today = date("mdy");
$csv = $today.'_email.csv';
$delimiter = chr(9);

if (file_exists("/email_csv/".$csv)) {
   $file = fopen("/email_csv/".$csv, "a");
   $file->setCsvControl($delimiter);
   fputcsv($file, $val, $delimiter);
}else {
   $file = fopen("/email_csv/".$csv, "a");
   fputcsv($file, $tete, $delimiter);
   fputcsv($file, $val, $delimiter);
}

fclose($file);

}

Merci d'avance pour votre aide.

10 réponses


Office
Auteur
Réponse acceptée

Voici la réponse pour ceux qui aurait le même problème.

$today = date("mdy");
$csv = $today.'_email.csv';
$delimiter = "\t";
$enclosure = "*";

if (file_exists("/email_csv/".$csv)) {
   $file = fopen("/email_csv/".$csv, "a");
   fputcsv($file, $val, $delimiter, $enclosure);
}else {
   $file = fopen("/email_csv/".$csv, "a");
   fputcsv($file, $tete, $delimiter, $enclosure);
   fputcsv($file, $val, $delimiter, $enclosure);
}

fclose($file);

}
$lecsv = "/email_csv/".$csv;

//Remplacement des '*' en ''
$replace = str_replace("*", "", file_get_contents($lecsv) );
file_put_contents($lecsv, $replace);

Bonjour,
Je ne suis pas familié avec la fonction mais je ne vois pas ou est le problème. Dans l'exemple de la documentation il n'y a pas d'encadrement:

// ...
fputcsv($fp, $fields);
// ...

J'en conclu donc qu'il doit être facultatif, par contre ton path vers le fichier n'es pas bon, ce devrait plutôt etre quelquechose du genre:

$path = "C:\\wamp\\www\\path\\to\\project\\email_csv\\".$csv;
// en plus l'utilisation d'une variable evitera de te repeter !! 

voila je n'ai pas tester le code donc j'attends ton retour la dessus ^^.

Bon courage
Cordialement

Office
Auteur

Merci pour ta réponse.
Pour la path il n'y a pas de problème, j'ai juste coupé le lien pour l'exemple ;)

Si je fais cela :

$today = date("mdy");
$csv = $today.'_email.csv';

if (file_exists("/email_csv/".$csv)) {
    $file = fopen("/email_csv/".$csv, "a");
    fputcsv($file, $val); 
}else {
    $file = fopen("/email_csv/".$csv, "a");
    fputcsv($file, $tete);
    fputcsv($file, $val);
}
fclose($file);

}

Il met par défaut le délimiteur en virgule (,) et l'encadrement en (").

Donc j'en déduit que si on ne les définis pas, ils se metent par défaut. Sauf que je ne peux pas mettre du vide (espace) en encadrement, ni un caractère de type chr(0) car cela produit une erreur.

Il doit bien y avoir un moyen de définir l'encadrement à NULL ou rien.

Hum dans ce cas la pourquoi ne pas faire un tableau a un seul élément?
du genre

fputcsv($file, [implode("",$val)]) 
Office
Auteur

Je viens de tester et cela ne marche pas. L'encadrement se fait toujours et sur toute la chaine.

Bonjour,

L'encadrement par défaut est " donc il vous faut le définir à null.
En reprenant le 1er code :

fputcsv($file, $tete, $delimiter, ""); // Enclosure vide
Office
Auteur

Enclosure à vide ne marche pas.

fputcsv($file, $tete, $delimiter, ""); // Ne marche pas
fputcsv($file, $tete, $delimiter, chr(0)); // Ne marche pas

Pas compris l'histoire de l'étoile !!!
l'encadrement par défaut c'est le guillemet, ça veut dire que s'il trouve un delimiter (une virgule par défaut) dans la valeur, il encadre la valeur par des guillemets, mais s'il n'en trouve pas , il n'encadre pas.
Ton delimiter c'est la tabulation, donc tu dois avoir des tabulations dans tes valeurs, non ?

Office
Auteur

C'est l'encapsuleur que je veux supprimer. Par défaut l'encapsuleur est une double quote. Une fois mon CSV généré, je l'ouvre et je cherche toutes les étoiles que je remplace par un vide.

Le fonctionnement est celui-ci : Si l'encapsuleur trouve un suite de caractère comportant un espace il ajoute par défaut la double quote.

Ex:
Col1 "Col 2" Col3 "Col 4" "Col 5"
Un "un deux" Trois "trois quatre" "quatre cinq"

En effet, je n'avais pas pensé à l'espace.
dans la doc php.net il y a une réécriture de la fonction (8em message)
on comprend mieux les caractères qui provoquent l'encadrement.
mais personellement, je ne vois pas pourquoi l'espace doit être encadré ?
Dans les autres langages, on a au moins l'option d'encadrer ou pas (MySQL, Excel, Access..)