8791 sujets

Développement web côté serveur, CMS

Bonjour à tous, après un parse d'un fichier CSV où je récupère des valeurs, je suis confronté à un problème de taille.

En effet, lorsque je veux insérer la valeur 0.004569 par exemple et bien dans ma BDD la valeur insérée est 0.000000, de même la valeur 8.23569 ==> 8.000000

J'ai l'impression d'avoir tout essayé, déclarer mon attribut en float(20,6), en double(20,6) et même en decimal(20.6) mais rien y fait, je suis désespéré.

Si vous avez une idée pour résoudre ce souci, je vous en saurais fort gré.
Modifié par lorenzo_one (03 Aug 2011 - 16:30)
Bon ba au cas où ça servirait à une autre personne, je viens de trouver une solution subsidiaire en remplaçant le type de mes val en VARCHAR ainsi, je récupère bien les chiffres après la virgules.

Cdt
Bonjour à toutes et à tous,

peux-tu nous communiquer un peu plus d'information ?

Par exemple le descriptif sql de ta base de données. Ou encore le code PHP lorsque tu essayes de mettre à jour cette base de données !

Je te rappelles qu'un nombre décimal s'écrit sous différents formats selon l'usage que l'on fait :

1) les types numériques à précisions exactes.
--> DECIMAL
--> NUMERIC

On écrit DECIMAL(10 , 2) pour 10 chiffres au total dont 2 en partie décimale.
Le séparateur est la virgule et non le point comme tu l'as écrit ci-dessus.

2) les types numériques à précisions approchées.
--> float : simple précision.
--> double : double précision.

Merci et à bientôt.
@+
Modifié par Artemus24 (02 Aug 2011 - 20:00)
Bonjour Artemus24 voici le code PHP qui me permet de remplir ma table:


$fichier = fopen("fichier.csv", "r");
			
if ($fichier!== FALSE) {
	while (($data = fgetcsv($fichier, 1000, ";")) !== FALSE) {
		$data = fgetcsv($fichier, 1000, ";");

		// On crée la requete pour inserer les données
 	        $query="INSERT INTO consommation    (type_conso,date_conso,val_conso)"; 

	        $query.= " VALUES ('$data[0]', '$data[1]', '$data[2]')"
		or die('Impossible d\'exécuter la requête :' . mysql_error());
					
                $result = mysql_query($query);	
					
	}
				
	fclose($fichier);
}
else echo "Impossible d'ouvrir le fichier csv";


Avec dans ma table :
type_conso : VARCHAR (30)
val_conso : VARCHAR (30) (car je n'obtenais pas de résultats avec un DECIMAL ou autre)
date_conso : DATETIME


Par contre maintenant je suis confronté à un autre problème.
Mon fichier CSV contient plus de 50000 Lignes et lors de l'insertion, seulement 26000 sont stockées. Y a t-il une limite à ne pas dépasser et est-ce que les tables sont limitées en taille? (Car les 26000 lignes prennent environ 2Mo ds la BDD et je crois avoir lu quelque part que chaque table était limitée à 4Go)
En relisant mon propre post, je me suis aperçu de ma bétise. En fait dans ce script, je réalise deux fois la lecture d'une ligne => C'est pour cela que mon nombre de lignes totales est divisé par 2 dans ma BDD.
Bonsoir à toutes et à tous,

je ne comprends pas ton problème de décimal. Voici un test que j'ai fait en MySql et qui fonctionne très bien. Je te communique le descriptif de la table ainsi que le INSERT qui a servi à introduire un nombre décimal dans la table. Un nombre décimal s'écrit avec un point et non avec une virgule. Donc dans le fichier en entrée assure toi que c'est bien le cas.
-- phpMyAdmin SQL Dump
-- version 3.3.9
--  http://www.phpmyadmin.net
 
--
-- Serveur: localhost
-- Généré le : Mer 03 Août 2011 à 16:28
-- Version du serveur: 5.5.8
-- Version de PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `my_bdd`
--

-- --------------------------------------------------------

--
-- Structure de la table `tab_calcul`
--

DROP TABLE IF EXISTS `tab_calcul`;

CREATE TABLE IF NOT EXISTS `tab_calcul` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `CALCUL` decimal(20,6) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

--
-- Contenu de la table `tab_calcul`
--

INSERT INTO `tab_calcul` (`ID`, `CALCUL`) VALUES
(1, '12.345678');


J'ai fait un vidage de la table et voici le résultat :

SELECT *
FROM `tab_calcul`
LIMIT 0 , 30


ID CALCUL
1 12.345678

@+
Modifié par Artemus24 (03 Aug 2011 - 18:45)
Bonsoir à toutes et à tous,

je n'aime pas trop ta façon d'écrire les accès au fichier. Voici un lien qui explique cela :

http://www.commentcamarche.net/contents/php/phpfich.php3

J'ai repris ton exemple et voici le code HTML contenant le code php. Remarque : FP veut dire "F"ile "P"ointer.
<!doctype html>
<html>
<head>
<title>Nombre d&eacute;cimaux</title>
</head>

<body>

<? p h p
/*-----------------------------------------------------*/
/* Informations pour la connexion à la base de données */
/*-----------------------------------------------------*/

$nom_du_serveur ="localhost";
$nom_de_la_base ="My_BDD";
$nom_utilisateur ="root";
$passe ="";
 
/*----------------------*/
/* Connexion au Serveur */
/*----------------------*/

$link = mysql_connect("$nom_du_serveur","$nom_utilisateur","$passe") or die('Connexion au serveur impossible : ' . mysql_error());

/*--------------------------------*/
/* Connexion à la base de données */
/*--------------------------------*/

$db = mysql_select_db("$nom_de_la_base") or die("Connexion à la base de données impossible : " . mysql_error());

/*-----------------------*/
/* Traitement du fichier */
/*-----------------------*/

$fp = fopen("fichier.csv", 'r');

if (!$fp)
{
	echo "Impossible d'ouvrir le fichier 'fichier.csv'.";
	exit(-1);
}
else
{
	$nbre = 0;

	while (!feof($fp))
	{
		$data = fgetcsv($fp, 1000, ";");

		if ($data[0] != "")
		{
			echo $data[0] . " --- " . $data[1] . " --- " . $data[2] . "<br />";
		
			$query = "INSERT INTO consommation (type_conso, date_conso, val_conso) VALUES ('$data[0]','$data[1]','$data[2]')"; 

			$result = mysql_query($query) or die("Problème requête 1 :" . mysql_error());

			$nbre++;

			if ($nbre > 1000)
			{
				$nbre   = 0;
				$query  = "COMMIT";
				$result = mysql_query($query) or die("Problème requête 2 :" . mysql_error());
			}
		}
	}

	$query  = "COMMIT";
	$result = mysql_query($query) or die('Problème requête 3 :' . mysql_error());              

	if (!fclose($fp))
	{
		echo "Impossible de fermer le fichier \"fichier.csv\".";
		exit(-2);
	}
}

/*-------------*/
/* Déconnexion */
/*-------------*/

mysql_close($link);
?>

</body>
</html>


Et voici le fichier "fichier.csv" que j'ai créé spécialement avec EXCEL. Tu ne le vois pas mais il y a quatre lignes. La quatrième est sans informations.

Article 1;2007/07/31 12:00:00;1.123456
Article 2;2008/11/25 15:31:00;255.120000
Article 3;2009/03/15 09:22:00;121.541000


J'ai fait le test et tout fonctionne correctement.

Et voici le vidage de la table "consommation" après le test.

-- phpMyAdmin SQL Dump
-- version 3.3.9
--  http://www.phpmyadmin.net
 
--
-- Serveur: localhost
-- Généré le : Mer 03 Août 2011 à 18:01
-- Version du serveur: 5.5.8
-- Version de PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données: `my_bdd`
--

-- --------------------------------------------------------

--
-- Structure de la table `consommation`
--
-- Création: Mer 03 Août 2011 à 19:21
-- Dernière modification: Mer 03 Août 2011 à 20:01
--

DROP TABLE IF EXISTS `consommation`;
CREATE TABLE IF NOT EXISTS `consommation` (
  `type_conso` varchar(30) NOT NULL,
  `date_conso` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `val_conso` decimal(20,6) NOT NULL,
  PRIMARY KEY (`type_conso`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Contenu de la table `consommation`
--

INSERT INTO `consommation` (`type_conso`, `date_conso`, `val_conso`) VALUES
('Article 3', '2009-03-15 09:22:00', '121.541000'),
('Article 2', '2008-11-25 15:31:00', '255.120000'),
('Article 1', '2007-07-31 12:00:00', '1.123456');


@+
Modifié par Artemus24 (03 Aug 2011 - 20:15)
Merci Artemus24, je tacherai de changer mon script!
Par contre, ma table est en innoDB et de mémoire, elle est déclarée en autocommit de base, donc à mon avis, tes COMMIT ne sont pas utiles dans mon cas.

Par contre j'avoue que mon accès au fichier laisse à désirer et je vais le modifier dès maintenant.

Encore Merci!!!