2017-04-10 3 views
0

J'insère des données dans la table en tant que chargement en bloc, $ handle = fopen ($ _ FICHIERS ['file_clg'] ['tmp_name'], "r");Fichier csv avec délimiteur autre que virgule dans php

 fgetcsv($handle); 

     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 

     $collegename = trim(str_replace(array("’","'"),"'",$data[0])); 

     $description = trim(str_replace(array("’","'"),"'",$data[1])); 

     $sql1 = $db->selectquery("insert into $tbl(name,details)values('" .$collegename."','" .$description."')"); 

     } 

     fclose($handle); 

Seuls deux champs est mentionné ici: morethan 25 colonnes dans mon bulkupload csv

Le problème est que le séparateur csv est la virgule (« »), mais dans le contenu du champ de détails de certains cas comprennent les virgules, comme dans ce cas record pas inséré correctement ..

comment résoudre ce cas ???

et un problème dans la section d'insertion,

Nom Collège Institut de génie & Technologie de Alva (de AIET)

et son enregistrée dans le tableau ci-dessous le format:

Alvas Institut de génie & Technology (AIET)

J'essaie ci-dessous le code:

  $collegename = htmlentities(iconv("cp1252", "utf-8", trim(str_replace(array("’","'"),"'",$data[0]))), ENT_IGNORE, "UTF-8"); 

mais sa ne fonctionne pas, comment puis-je résoudre le problème entre guillemets simples

Et je placé: en-tête ("Content-Type: text/html; charset = ISO-8859-1");

dans la section d'en-tête ..

+0

Pour la première question, vous devrez affecter un séparateur unique à utiliser qui préservera vos valeurs de champ qui contiennent des virgules. Si vous ne pouvez pas faire cet ajustement, vous devrez peut-être travailler une magie de motif regex. Comme pour la deuxième question, utilisez des déclarations préparées. Pouvez-vous fournir quelques lignes d'échantillons afin que nous puissions voir quel type de données est traité? – mickmackusa

+0

comment utiliser un délimiteur unique? Comment puis-je enregistrer des fichiers CSV séparés par des points-virgules? – Renjitha

+0

Si les points-virgules n'existent dans aucune de vos valeurs, ils seront appropriés. Vous pouvez également utiliser des tuyaux '|' ou un autre caractère rarement utilisé. http: // stackoverflow.com/questions/32309554/php-fputcsv-utiliser-semicolon-separator-in-csv Pouvez-vous montrer quelques lignes de données dans votre question? – mickmackusa

Répondre

0

je besoin de voir quelques échantillons à dire quoi que ce soit avec confiance, mais il y a des spécifications sur Échapper des valeurs par des virgules pour préserver la le nombre de valeurs. https://stackoverflow.com/a/769675/2943403

Sinon, vous pouvez créer un nouveau bloc de code fputcsv() qui va générer un point-virgule (ou un autre caractère non conflictuel) fichier csv délimité. Je ne fournit pas l'extrait de code réel pour cela. Il y a de nombreuses ressources disponibles sur le SO, y compris:

Ensuite, votre boucle while pourrait utiliser ; (ou autre) comme séparateur.

Comme pour placer en toute sécurité vos valeurs (qui peut avoir des guillemets simples) dans votre requête, utilisez prepared statements

// I realize your query will be much larger than the sample... 
// declare $collegename and $decription values 
$stmt=$db->prepare("INSERT INTO `$tbl` (`name`,`details`) VALUES (?,?)"); 
$stmt->bind_param("ss", $collegename,$description); 
if($stmt->execute()){ 
    echo "success"; 
}else{ 
    echo "Error: ",$db->error; 
}