Comma-separated values

For de mon travail à PriceMinister, j’ai la chance de manipuler des pelles entières de fichiers dits csv. Ces fichiers sont directement édités de logiciels tiers qui proposent de faire des exportations dans ce format, et pourtant il ne savent pas le faire correctement. J’ai donc écrit un petit script qui rectifie une bouillie en un fichier propret.

Qu’est ce qu’un csv

C’est un fichier texte qui représente des données tabulaires. Chaque ligne représente un enregistrement. Chaque enregistrement est composé de champs délimité par un même caractère que l’on nomme le séparateur. Ce champ peut-être entouré de guillemets. Ainsi, si nous trouvons le séparateur entre ces guillemets, il sera interprété comme étant un caractère typographique. Enfin, les guillemets typographiques doivent à leur tour être doublés.

Le script

Excel, HomeBase, FileMaker… ne savent pas faire ce type de csv standard. C’est pourquoi j’ai écrit cette petite moulinette qui corrige le fichier source.

function csv_ise($string, $sep = ",") {
	for($cleanex = '', $tok = strtok($string, $sep); $tok !== false; $tok = strtok($sep) ) {
		if( $tok{0} == '"' ) {
			$tok = ($tok{strlen($tok)-1}=='"') ? substr($tok, 1, -1) : substr($tok, 1) .','.strtok('"'.$sep);
			$tok = preg_replace('`n`', '<br>', $tok);
		} 
		elseif( substr_count( $tok, '"') === 1 ) {
			$tok = $tok .','.strtok($sep);
		}
		$tok = preg_replace('`([^"]|^)("|\")([^"]|$)`', '$1""$3', $tok);
		$tok = '"'.$tok.'"';
		$tok = preg_replace('`(([nr])+)`', '"$2"', $tok);
		$cleanex .= $tok . $sep;
	}
	unset($string, $sep, $tok);
	return $cleanex;
}

Bon transfert de données !