|
|
|
|
Bonjour,
J'ai un probleme avec l'importation de données d'un fichier Excel CSV dans une base MySQL...
Je lis un fichier au format CSV du type "champs1;champs2;champs3\n".
Je trouve quelque fois des champs du genre : "champs1 ;champs2 ;champs3 \n"...
Je voudrais virer tous les espaces en trop à la fin de mes champs.
Voici mon code :
foreach($lignes as $ligne)
{
$values = explode(";",$ligne);
$statement = "INSERT INTO ma_table(mes_champs) VALUES(";
foreach($values as $value)
{
$value=str_replace(' ','',$value);
$value=str_replace(' ','',$value);
$value=str_replace(' ','',$value);
$value=addslashes($value);
$value = trim($value);
$statement .= "TRIM('$value'),";
}
$statement = substr($statement,0,strlen($statement)-1);
$statement.= ");";
mysql_query($statement) or die('<br>Erreur base de donnée !<br>'.$statement.'<br>'.mysql_error());
echo $statement . "<br>";
}
Bonjour
|
Merci pour ta réponse.
$value=str_replace(' ','',$value);
$value=addslashes($value);
$statement .= "'$value',";
Constatation : il ne supprime pas les espaces !! Il sont tous là dans ma base !! Je me demande donc s'il ne faut travailler sur le $values plutot que $value. Et ainsi faire le trim sur $values[x] ? Soit je ne comprend pas bien soit il y a un truc que je ne vois pas !! Si quelqu'un voit ou est le problème !? |
Le fichier CSV ce n'est pas moi qui le génère Je m'en doute bien... ça ne change rien au fait qu'il y a des fonctions adaptées au traitement des fichiers CSV, qui t'éviteraient de passer par excel comme intermédiaire. Ton fichier de départ est bien en CSV ? De plus, en CSV, tu as tout à fait le droit d'avoir un ; dans un champ, ça marche très bien alors qu'en utilisant explode tu interdis cette possiblilité.
|
En fait pour expliquer clairement la situation, j'ai plusieurs sources de données que je reçois. Ces sources sont au format Excel XLS. Il y a donc plusieurs source données qui viennent de différents organismes mais qui contiennent en gros les mêmes données (du genre nom prénom adresse... et d'autres qui sont la ou pas).
Du genre SELECT #champs# FROM table_tampon INNER JOIN table_reference ON (table_tampon.NOM = table_reference.NOM AND table_tampon.PRENOM = table_reference.PRENOM AND table_tampon.DATENAISSANCE = table_reference.DATENAISSANCE Voila pour la description. Je me suis donc penché sur le fichier CSV que je reçoit (je l'est ouvert avec un éditeur de texte afin de voir les ";") et j'ai remarquer que la plupart des lignes étaient formée de la façon suivante "chmps1;champs2...\n" SAUF quelques unes ou on peut trouver un ou plusieurs espaces entre la fin du champs et le ";" . J'ai donc utiliser TRIM pour virer les espaces en trop. Mais lorsque j'ai refais des tests j'ai vu qu'il y avait encore des personnes qui s'ajoute en trop (en quelque sorte des doublons) dans la bas de référence. J'ai donc affiché ma variable $valeur (celle dont on parle au dessus) en prennant soit de la souligner... Pour voir si le trait va plus loin que le text. Je me suis apperçu que certaine $valeur sont comme ça : nom Je suis aussi allé voir dans phpMyAdmin, et je peux voir que en effet il y a des espaces à la fin des mêmes NOMS que j'avais repéré avec ma méthode de soulignage... Et aussi que ces même noms sont en "doublons" puisqu'ils ont été rentrés au préalable avec un autre fichier CSV, mais sans les espace.
Donc pour résumer mes tests, je rentre un fichier CSV dont je suis sur que mes routine marches. J'ai dont une base de référence avec 5000 entrées. Je rentre un deuxieme fichier CSV (celui sur lequel je travail) il me trouve 100 nouvelle personnes. OK. Si je rerentre ce même fichier, il me trouve 50 personnes en plus. Et si je le rererentre, il me retrouve ces même 50 personnes.... Voila j'espère que je suis clair... Et désolé pour les longueurs... Si tu as une idée je suis preneur, car je débute, et je commence un peu à galèrer là... Et sinon quelque chose qui n'a rien a voir : si tu as des infos sur les fonction CSV qui permettraient de ne pas passer par excel pour vider les ";" en trop je suis preneur ! Merci d'avance ! |
PS : J'ai essayer ça :
foreach($values as $value)
{
echo "La valeur qui va être analysée est : " . $value . ".<br>";
$derCarac = substr($value, -1);
echo "Le dernier caratere de la valeur est : " . $derCarac . ".<br>";
if(substr($value, -1) == " ")
{
echo "Le dernier caractere est bien un espace. <br>";
$value = substr($chaine,0,strlen($chaine)-1);
$value=mysql_real_escape_string($value);
$value = trim($value);
echo "Voici la nouvelle valeur : <u>" . $value . "</u><br><br>";
$statement .= "TRIM('$value'),";
}
else
{
echo "Le dernier caractere n'est pas un espace.<br>";
$value=mysql_real_escape_string($value);
$value = trim($value);
echo "Voici la valeur finale : <u>" . $value . "</u><br><br>";
$statement .= "TRIM('$value'),";
}
}
Pour les ligne du CSV qui posent problème il m'affiche "Le dernier caractère de la valeur est : .". J'en déduit que le dernier caractère n'est pas un espace. Ou en tous cas pas un " ". |
Pas facile de te suivre ...
|
Pour les fichiers CSV, en fait c'est un peu moi qui les gères ! Comme je l'est dis, je reçois un fichier au format XLS et je le transforme en CSV....
ID DES PARENTS;NOM;PRENOM;DATE DE NAISSANCE\n 56;mamie;papy;01/02/1980\n 120;tata ;tonton;08/10/1958\n 79;mémé;pépé ;06/07/1985\n 2- je rentre le fichier CSV qui "passe" dans le code suivant : include '../bdd/bdd.php';
$file = "/tmp/child_file.csv";
$content = file_get_contents($file,'r');
$lignes = split("\n", $content);
$handle = fopen($file, "r");
while (($data = fgetcsv($handle, 0, ";")) !== FALSE)
{
$last_line++;
}
unset($lignes[0]);
unset($lignes[$last_line]);
foreach($lignes as $ligne)
{
$values = explode(";",$ligne);
$statement = "INSERT INTO tabletampon (#CHAMPS#) VALUES(";
foreach($values as $value)
{
$value=mysql_real_escape_string($value);
$value = trim($value);
$statement .= "TRIM('$value'),";
}
$statement = substr($statement,0,strlen($statement)-1);
$statement.= ");";
mysql_query($statement) or die('<br>Erreur base de donnée !<br>'.$statement.'<br>'.mysql_error());
}
fclose($handle);
A ce moment là, le fichier est extrait dans une base tampon. 3- Il y a alors une fonction qui passe sur la base tampon pour récupérer les gens qui ne sont pas dans la base de référence afin de les ajouter : $statementsOne = "SELECT #CHAMPS# FROM tabletampon WHERE (
tabletampon.NOM NOT IN (SELECT nom FROM table_ref)
AND
tabletampon.PRENOM NOT IN (SELECT prenom FROM table_ref)
AND
tabletampon.DATENAISSANCE NOT IN (SELECT date_anniv) FROM table_ref)
);";
$requOne = mysql_query($statementOne) or die(mysql_error());
$date = date("d/m/Y");
while($data = mysql_fetch_array($requAdHorusOne))
{
$statemenTwo = "INSERT INTO table_ref (#CHAMPS#)
VALUES (
(SELECT ID FROM tableRefParent WHERE nom = '" . $data[NOM] . "' AND prenom = '" . $data[PRENOM] . "' AND date_naissance = '" . $data[DATENAISSANCE] . "'),
'" . addslashes(trim($data[NOM])) . "',
'" . addslashes(trim($data[PRENOM])) . "',
'" . addslashes(trim($data[DATENAISSANCE])) . "',
'" . $date . "');";
mysql_query($statementAdHorusTwo) or die('mysql_error());
}
Et suite à cette fonction il y en a une autre qui suit pour comparer tous les champs de la table tampon à ceux de la table de référence pour relever ou sont les différences et les noter dans une autre table....Bref tu as là ce qu'il se passe en gros lorsque je rentre un fichier, et se qui peut faire qu'il y est certains champs qui est des espaces... Et donc je pense que le probleme vient du premier script PHP. C'est à dire celui qui rentre le fichier CSV dans la base Tampon. Et lorsque je rentre un nouveau fichier Exel, je vide la base tampon avant de la reremplir. Les différences, je les vois donc dans la base de référence. Si je rentre 2 fois le même fichier, il y a plus de monde que dans mon fichier et des "doublons" (qui n'en sont pas des vrais) dans la base de référence... Voila |
Ton début me semble un peu bizarre (je suis gentil). Tu lis le fichier 2 fois : une fois comme un simple fichier texte, c'est à dire mal puisqu'il s'agit de CSV, et une seconde fois comme du CSV. Mais de cette seconde lecture, tu ne retiens que le nombre de lignes, qui n'est d'ailleurs pas forcément compatible avec celui de la première lecture...
include '../bdd/bdd.php';
$file = "/tmp/child_file.csv";
$handle = fopen($file, "r");
while (($data = fgetcsv($handle, 0, ";")) !== FALSE)
{
$statement = "INSERT INTO tabletampon (#CHAMPS#) VALUES(";
foreach($data as $value)
{
$value = trim($value);
$value=mysql_real_escape_string($value); // l'ordre trim / mysql... est plus logique comme ça
$statement .= "'$value',";
}
$statement = substr($statement,0,strlen($statement)-1);
$statement.= ");";
mysql_query($statement) or die('<br>Erreur base de donnée !<br>'.$statement.'<br>'.mysql_error());
}
fclose($handle);
Peux-tu préciser si c'est dans la tabletampon que tu vois tes caractères en trop ? Peux-tu vérifier si le caractère en trop est un espace ou une tabulation ? |
Méfie toi de ce que tu vois avec Open Office.org quand tu ouvres un fichier texte. OOo est un traitement de texte, il fait ce qu'il peut avec les caractères qui ne lui plaisent pas et il peut les modifier sans te prévenir...
|
Comment faire alors ?
if(substr($value, -8) == "�" || substr($value, -8) == "ᅠ" || substr($value, -1) == " ")
{
echo "Le dernier caractere est bien bizarre. <br>";
$value = substr($chaine,0,strlen($chaine)-1);
$value = trim($value);
$value=mysql_real_escape_string($value);
echo "Voici la nouvelle valeur : <u>" . $value . "</u><br><br>";
$statement .= "'$value',";
}
Sans succès... Il y a toujours cet "espace" en fin de champs. Je suis à la recherche de fonction php permettant de "lisser" ma chaîne de caractère mais je ne trouve pas... Je ne te cache pas que ça commence à devenir un peu lourdingue tout ça ! |
Pourquoi ce test substr($value, -8) == "�" ? Ces 8 caractères sont parfaitement lisibles, et, s'ils étaient présents dans ton texte initial, tu les aurais vus.
|