Aller au contenu

Ce tchat, hébergé sur une plateforme indépendante d'Infoclimat, est géré et modéré par une équipe autonome, sans lien avec l'Association.
Un compte séparé du site et du forum d'Infoclimat est nécessaire pour s'y connecter.

Wgrib2, changer la structure des fichiers textes.


ZHB
 Partager

Messages recommandés

Bonjour,

J'ai extrait des données à l'aide de wgrib2 dans un fichier .txt. En admetant extraire 2 données différentes, le format de sortie est le suivant :

lon,lat,ACPCP surface d=2011082318 9-10 hour acc fcst5.921000,45.791000,05.938780,45.791204,0...lon,lat,CDCON entire atmosphere (considered as a single layer) d=2011082318 10 hour fcst5.921000,45.791000,05.938780,45.791204,0...

Chaque paramètre avec les valeurs étant l'un en-dessous de l'autre.

Voulant insérer ces données dans une base SQL avec "LOAD DATA INFILE" il faudrait que le fichier de sortie corresponde à cette structure

lon,lat,ACPCP surface d=2011082318 9-10 hour acc fcst,CDCON entire atmosphere (considered as a single layer) d=2011082318 10 hour fcst5.921000,45.791000,0,05.938780,45.791204,0,0...

Les différents paramètres étant les uns à côté des autres.

Savez-vous s'il est possible de modifier le format de sortie des fichiers wgrib2 ? j'arrête pas de chercher mais je ne vois pas comment faire.

Merci, bonne journée

Vince

Lien à poster
Partager sur d’autres sites

J'ai pas mon script sous la main mais la technique est la suivante :

-faire x fichier avec chacun une donnée

-fusionner la dernière ligne de chaque fichier sur le fichier précédant

On obtient ainsi ce que tu veux.

Si tu veux ce soir je te dirai exactement comment j'ai fait.

EDIT : Etant une bille en sql default_tongue.png/emoticons/tongue@2x.png 2x" width="20" height="20"> , j'aimerai bien savoir comment tu fais après. Je me sert que de fichiers textes mais j’aimerai bien me servir de sql

Lien à poster
Partager sur d’autres sites

Salut,

Merci pour ta réponse. Alors il n'y a à ta connaissance pas de moyens de générer un format de fichier directement avec wgrib2 ?

Je pensais également fusionner le fichier sur le fichier précédent avec PHP, mais j'ai peur que ce soit trop lent. Toutefois je veux bien que tu me dises ta méthode pour y arriver.

Si non pour l'insertion en BDD je pensais simplement faire qqch comme ceci :

try {        $db = new PDO('mysql:host='.$host.';dbname='.$database, $user, $pass);	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);}catch (PDOException $e) {	echo $e->getCode();	echo $e->getMessage();}$db->exec("LOAD DATA INFILE 'chemin_vers_fichier_texte.txt' INTO TABLE t_fcst FIELDS TERMINATED BY ',' ENCLOSED BY '' LINES STARTING BY '' TERMINATED BY '\n' IGNORE 1 LINES (fcst_latitude, fcst_longitude, fcst_TMP500, fcst_RH500, fcst_TMP700, etc...)");

Le fichier contenant les données doit avoir le format dont j'ai parlé dans mon premier message.

Lien à poster
Partager sur d’autres sites

Pour l'instant je suis plus sur mon modèle WRF que sur l'amélioration de mon site (pas trop le temps de faire les deux en même temps).

Cependant PDO n'est pas utilisable sur le serveur free...

J'essayerai de mieux analyser ton code à l'occasion. Merci default_flowers.gif

A plus tard.

Lien à poster
Partager sur d’autres sites

Pour l'instant je suis plus sur mon modèle WRF que sur l'amélioration de mon site (pas trop le temps de faire les deux en même temps).

Cependant PDO n'est pas utilisable sur le serveur free...

J'essayerai de mieux analyser ton code à l'occasion. Merci default_flowers.gif

A plus tard.

Bon, PDO c'est juste pour acceder à la BDD donc un mysql_exec à la place et c'est bon.

Par contre comme tu es chez free apparemment la configuration du serveur ne permet pas d'utiliser "LOAD DATA INFILE". Il semblerait que chez OVH ça fonctionne mais c'est à vérifier.

Lien à poster
Partager sur d’autres sites

Bonsoir, comme prévu voici l'explication de mon script sh.

1) Récupération des données voulues avec wgrib2, création d'un fichier par donnée (temp.txt, pluie.txt, pression.txt...)

2) Copier un premier fichier texte avec le nom du fichier final voulu.

cp APCP.txt  GFS${time}.txt

3)Couper la derniere colonne de chaque fichier texte en créant des sous-fichiers pour chaque donnée

cut -d " " -f3 ACPCP.txt > 1.txtcut -d " " -f3 Cape.txt > 2.txtcut -d " " -f3 Cloudhig.txt > 3.txt

et ainsi de suite3)Fusionner les sous-fichiers ligne par ligne avec en premier le fichier final voulu (pour intégrer les coordonnées géographiques)

paste -d " " GFS${time}.txt  1.txt > T1.txtpaste -d " " T1.txt  2.txt > T2.txtpaste -d " " T2.txt  3.txt > T3.txtpaste -d " " T3.txt  4.txt > T4.txt...paste -d " " T20.txt  21.txt > gfs${time}.txt

On obtient ainsi le fichier voulu gfs${time}.txtVoilà, c'est peut-être laborieux mais ça marche, j'y ai mis du temps à tout trouver mais sur le net on trouve toujours ce que l'on veut !

Bon courage default_flowers.gif

Lien à poster
Partager sur d’autres sites

Génial, j'étais justement partis sur une solution avec un "paste -d" suivi de tous les paramètres mais je ne savais pas comment supprimer les coordonnées avant.

J'adopte donc ta solution qui me fais quand même des fichiers bien moins lourds.

Merci beaucoup,

Vince

Lien à poster
Partager sur d’autres sites

  • 2 months later...

Bonjour,

Ayant été confronté à ce même problème, j'ai relevé le défi en PHP. Voici ce que j'ai su obtenir ... Un peu galère et peut-être améliorable mais ça marche. J'ai une vingtaine de fichiers de variables pour une vingtaine d'échéances et mon serveur perso sous intel core i5 met environ 2s pour l'execution.

<?/*fichiers de données d'entrée, sortant de wgrib2 sous ce schéma : longitude,latitude,donnée. fichiers sous ce nom : "nom-variable"."echeance"."extension" (dans mon script par exemple la CAPE à l'échéance +48h avec une extension .gfs : cape.48.gfs)fichier de sortie data.gfs sous ce schéma : echeance|longitude|latitude|variable 1|variable 2|...|variable n| */// Connexion BDD si variables en BDDmysql_connect("***","***","***");mysql_select_db("***");// Initialisation des Arrays vides$variables = array();$compo = array();// Création du array de variable (solution avec une table des variables en MySQL ; sinon un simple array des variables convient).// $variables = array($variable1);$req = mysql_query("SELECT * FROM variables");while($rep = mysql_fetch_array($req))	{	$variables[] = $rep['nom'];	}	// Définition du run de départ, arrivée et le pas (6h à 60h par pas de 3h)$depart = 6;$fin = 60;$pas = 3;// Boucle des échéanceswhile($depart <= $fin)	{		// Boucle des Variables	foreach($variables as $key => $value)		{		// Si échéance < 10, on rajoute un zéro devant		if($depart < 10){$echeance = "0$depart";}		else{$echeance = $depart;}				// Mise en Array du fichier de données		$fichier = file("/var/www/data/gfs/$value.$echeance.gfs");				// Incrémentation du Array $compo à 0		$inc = 0;				// Lecture ligne par ligne du fichier de donnée		foreach($fichier as $row2)			{			// Séparation des données			$file = explode(',',$row2);						// Suppression des espaces			$lon = preg_replace("# #", "", $file[0]);			$lat = preg_replace("# #", "", $file[1]);			$val = preg_replace("# #", "", $file[2]);						// Si nous sommes à la 1ère variable, alors on mets les coordonnées + valeur. Sinon on ajoute la valeur en fin de ligne.			if($key == 0){$compo[$echeance][$inc] = "$lon|$lat|$val|";}			else{$compo[$echeance][$inc] .= "$val|";}						// On incrémente le array $compo			$inc++;			}		}	// Incrémentation de l'échéance	$depart = $depart + $pas;	}	/*Si un print_r($compo); est fait, nous obtenons ce résultat :[06] => Array(					longitude 1|latitude 1|variable 1|variable 2|...|variable n|					longitude 1|latitude 2|variable 1|variable 2|...|variable n|					longitude 1|latitude 3|variable 1|variable 2|...|variable n|					longitude n|latitude n|variable 1|variable 2|...|variable n|					etc ...					);[09] => Array(					longitude 1|latitude 1|variable 1|variable 2|...|variable n|					longitude 1|latitude 2|variable 1|variable 2|...|variable n|					longitude 1|latitude 3|variable 1|variable 2|...|variable n|					longitude n|latitude n|variable 1|variable 2|...|variable n|					etc ...					);[0n] => Array(					longitude 1|latitude 1|variable 1|variable 2|...|variable n|					longitude 1|latitude 2|variable 1|variable 2|...|variable n|					longitude 1|latitude 3|variable 1|variable 2|...|variable n|					longitude n|latitude n|variable 1|variable 2|...|variable n|					etc ...					);etc ... etc ...Maintenant on créé le fichier de données*/// Création du fichier de donnée data.gfs$out = fopen("/var/www/data/gfs/data.gfs", "w");fseek($out, 0);// On introduit le schéma en 1ère ligne pour s'y retrouver (facultatif)fputs($out, "echeance|longitude|latitude|".implode("|", $variables)."|\n");// Boucle de parcours des échéancesforeach($compo as $key2 => $value2)	{	// Boucle d'écriture des données 	foreach($value2 as $key3 => $value3)		{		// Pour ne pas recopier chaque 1ère ligne des fichiers de sortie de wgrib2 (longitude,latitude,valeur ...)		if($key3 != 0)			{			fputs($out, "$key2|$value3\n");			}		}	}// On ferme le fichier et éventuellement la BDD et c'est fini !fclose($out);mysql_close();?>

Si questions n'hésitez pas. Cordialement.

Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
 Partager

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...