[Perl ou PHP] Besoin d'un exemple tout bête

fifto Messages postés 54 Statut Membre -  
 nath -
Bonjour,

J'aimerais un renseignement s'il vous plait:

Il faut que j'ecrive un petit script (ou programme) sous unix et je
n'ai encore jamais fait ca..

ce que j'ai a faire, c'est ca: creer un graphique de type XY (abcisse-ordonnee) a partir de donnees d'un fichier texte et afficher ce graphique dans netscape (netscape navigator version 4.78).
Et tout ca dans une procedure automatique.

On m'a dit que les languages php et perl étaient adaptés à mon cas. Dans ce cas, quel est la plus facile: php ou perl ?

Mais concretement, quand je suis sous unix, qu'est ce que je dois faire pour lancer un programme (perl ou php) ? Je l'écris dans un fichier texte ou un fichier executable ? Quelle extension je dois donner à ce fichier dans ce cas? Et comment je l'execute ? Vous auriez pas un exemple tout con, genre juste l'affichage d'un message ou la somme 2+2=4 pour que je puisse voir comment procéder pour executer un tel programme ?


PS: voici un exemple de fichier texte dans lequel sont contenues mes donnees:

POINT ID. TYPE T1 T2 T3 R1 R2 R3
1 G 1.599571E+01 1.185148E-02 -3.111541E+00 1.784951E-06 5.286219E-02 -3.340712E-06
2 G 2.303846E+00 1.238950E-02 -1.913684E+00 1.784951E-06 5.286219E-02 -3.340712E-06
1000 G 1.009300E-03 -1.461770E-03 -8.895236E-02 -1.380486E-02 1.121588E-03 0.0
1001 G 6.655139E-04 -1.269913E-03 -1.202470E-02 -8.149052E-03 1.912397E-03 0.0
1002 G 2.128328E-04 -4.430452E-04 2.143617E-02 9.356764E-04 -1.131274E-03 0.0
1003 G 1.528846E-04 -3.164306E-04 1.279018E-02 1.256070E-03 -7.879398E-04 0.0
1004 G 4.770843E-04 -1.147985E-03 2.830649E-02 -3.521185E-03 -6.181516E-04 0.0
1005 G 2.695279E-04 -3.397622E-04 -1.185465E-02 -1.379297E-04 -1.666789E-03 0.0
1006 G 5.318802E-03 -1.288805E-02 1.703259E-01 3.963486E-02 2.937418E-02 0.0
1007 G 3.142439E-03 -5.341556E-03 5.803642E-02 1.815232E-02 1.094855E-02 0.0
1008 G 1.822350E-04 3.866597E-04 1.790608E-02 -1.606418E-03 -7.047455E-04 0.0


Et donc, par exemple, j'aimerai faire le graphique suivant contenant 3 points:
les points 1002, 1005 et 1006
leur abcisses respectives se trouvent dans la colonne T1, leurs ordonnees dans la colonne T3.
Et afficher ce graphique (avec legende, titre etc...) dans netscape..

merci.
Miguel
A voir également:

45 réponses

lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Salut,

plutôt que prevu (la preuve que même si j'ai crée le script pour un morceau de fichier, en fait je n'ai fait que 2 modification - un fait un ajout et une modification par rapport au script précendent - à voir en gras).

J'ai testé avec des valeurs diveses pour les SUBCASE.
En revanche j'ai remarqué que dans le fichier .bdf le valeur de X sont toujours positives, donc je n'ai pas traité le cas de X negatif.

En plus la condition avec 8 caractères ça ne marche pas. En fait le script fonctionne mais j'ai du poser des conditions ( dans le script tu verras que je teste pour - et + mais seulement pour Y). S'il faut modifier et si tu n'arrives pas il faut le dire.

Je te mets le script pour pouvoir le tester demain. Je t'affichrai aussi le résultat de quelques valeurs.

En gras je met les modifications par rapport au script précedent.

Enjoy your self!
#! /usr/bin/perl

use warnings;
use strict;

open TTXT, "Touareg2_complet.txt"
					or die "E/S : $!\n";
open BULK, "Touareg_bulk_complet.bdf"
					or die "E/S : $!\n"; 
open WRES, ">tuareg_resultat"
					or die "E/S : $!\n";

my (@tr_val,@t,@subcase);
my (%h,%g);
my @grid;
my %bulk;
my %coord;
my $xyz_val;
my $tr = 'o';

#######################################
#  TRAITEMENT DU FICHIER TUAREG2.TXT  #
#######################################
#
#enlevement de toutes les lignes inutiles
#on garde seulement les lignes qui contient SUBCASE
#(on met SUBCASE au debut de ligne)
#et le lignes avec les valeurs
#1      G      1.599571E+01   1.185148E-02  -3.111541E+00   1.784951E-06   5.286219E-02  -3.340712E-06
while (<TTXT>) {
 next unless (/page\s*17/i../page\s*33/i); #je lit seulement entre les pag 17 et 33
 next if /^\s*\n$/;
 s/.*(subcase)\s*(\d+).*\n$/;$1$2:/i;
 next if /^(\d|\s+[a-z].*|\s+\()/i;
 s/^\s*//g;
 s/\n$/!/;
 push @t,$_;
} 
############################################
#  TRAITEMENT DU FICHIER Touareg_bulk.bdf  #
############################################
#on traite seulement les lignes qui commence avec GRID
#on supprime GRID et les espaces au début
while (<BULK>){
	next unless /^GRID/;
	s/^GRID\s*//;
	s/\s+$//;
	push @grid,$_;
}

#############################
#    SAISIE DES COLONNES    #
#############################
print "Entrez la colonne [T1,T2,T3,R1,R2,R3] : ";
chomp(my $col = <STDIN>);
(my $col_index = $col) =~ s/^.(.)/$1/;
if ($col =~ /^t/i) {
	$col_index += 1;
}
else {
	$col_index += 4;
}

#####################################################
#  TRAITEMENT DES LIGNES Touareg2.txt SAUVEGARDÉES  #
#####################################################
my $t = join "",@t;
$t =~ s/\s+/|/g;
my @tt = split /;/,$t;

foreach (@tt){
	my ($cle,$val) = split /:/,$_;
	if (defined($val)){
		$val =~ s/\|/ /g;
		my @res_val = split /!/, $val;
		#$h{$cle} = [ @res_val ];
		push @{$h{$cle}},@res_val;
	}
}
#############################
#    SAISIE DES SUBCASES    #
#############################
@subcase = keys %h;
my @aff_case = grep { s/[a-z]*//i } @subcase;
print "Vous avez ", $#subcase+1,
				" subcase (@{ [reverse @aff_case] }). Entrez le subcas : ";
chomp (my $cas = <STDIN>);
$cas = 'SUBCASE'.$cas;

##################################################
#   AFFICHAGE DES POINTS EXISTANTS PAR SUBCASE   #
##################################################
foreach (keys %h){
	foreach my $el( @{$h{$_}} ){
		push @{$g{$_}},[ split /\s/,$el];
	}
}
foreach (sort keys %g) {
	print "-" x 50,"\n$_ : ";
	foreach my $l( @{$g{$_}} ){
			print "$l->[0],";
	}
	print " === FIN CASE ===\n";
}
###########################################
#           SAISIE DES POINTS             #
###########################################
while ($tr ne 'n'){
	print "Entrez une valeur du point [ n ] pour quitter : ";
	chomp($tr = <STDIN>);
	push @tr_val,$tr;
}
###########################################
#     TRAITEMENT DES DONNEES X,Y ET Z     #
###########################################
#à tenir compte qu'il y a des valeurs qui commence avec -
foreach (@grid){
	my ($c,$v) = split /\s+/,$_,2;
  $bulk{$c} = $v;
}
foreach(sort keys %bulk){
	my($i,$j,$k);
	if (substr($bulk{$_},8,1) eq '-' # si -
			or
			substr($bulk{$_},8,1) eq '+'){# ou +
				$i = substr($bulk{$_},0,7);
				$j = substr($bulk{$_},8,9);
				$k = substr($bulk{$_},16);
				push @{$coord{$_}},($i,$j,$k);
	}
	else {
				$i = substr($bulk{$_},0,8);
				$j = substr($bulk{$_},8,8);
				$k = substr($bulk{$_},16);
				push @{$coord{$_}},($i,$j,$k);
	}
}
print "Choissisez X,Y ou Z : ";
chomp (my $abs = <STDIN>);
SWITCH:
	{
		$abs =~ /x/i && do{$xyz_val = 0;last SWITCH};
		$abs =~ /y/i && do{$xyz_val = 1;last SWITCH};
		$abs =~ /z/i && do{$xyz_val = 2;last SWITCH};
	}
##############################################
#  ECRITURE DE RESULTAT DANS LE HANDLE WRES  # 
#          (voir au début du script)         #
##############################################
print WRES "\U$abs $col\n";
foreach my $tel( @{$g{$cas}} ) {
 foreach my $xyz ( keys %coord ) {
	foreach (@tr_val){
		if ($tel->[0] eq $_ and $xyz eq $_){
			print WRES "$coord{$_}[$xyz_val] $tel->[$col_index]\n";
		}
	}
 }
}


Le résultat
[lamitest@localhost my_perl_script]$ perl tuareg_06042006.pl
Entrez la colonne [T1,T2,T3,R1,R2,R3] : t2
Vous avez 2 subcase (1 2). Entrez le subcas : 2
--------------------------------------------------
SUBCASE1 : 1,2,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386, === FIN CASE ===
--------------------------------------------------
SUBCASE2 : 1,2,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386, === FIN CASE ===
Entrez une valeur du point [ n ] pour quitter : 1
Entrez une valeur du point [ n ] pour quitter : 2
Entrez une valeur du point [ n ] pour quitter : 1002
Entrez une valeur du point [ n ] pour quitter : 1132
Entrez une valeur du point [ n ] pour quitter : 1341
Entrez une valeur du point [ n ] pour quitter : 1379
Entrez une valeur du point [ n ] pour quitter : 1386
Entrez une valeur du point [ n ] pour quitter : n
Choissisez X,Y ou Z : x
[lamitest@localhost my_perl_script]$ cat tuareg_resultat
X T2
1736.66 -2.668348E-01
1714.0  -1.761392E-01
1695.704 -1.013814E-05
1666.0  2.322796E-06
1701.95 -1.749105E-01
1684.779 -5.065803E-02
1702.02  -1.712649E-01
[lamitest@localhost my_perl_script]$ 
0
fifto Messages postés 54 Statut Membre
 
Salut Lami,

J'ai un petit problème, je n'arrive pas modifier le code si jamais X et Z sont négatifs...

C'est à ce niveau là que je ne comprend pas trop:

foreach(sort keys %bulk){
my($i,$j,$k);
if (substr($bulk{$_},8,1) eq '-' # si -
or
substr($bulk{$_},8,1) eq '+'){# ou +
$i = substr($bulk{$_},0,7);
$j = substr($bulk{$_},8,9);
$k = substr($bulk{$_},16);
push @{$coord{$_}},($i,$j,$k);
}
else {
$i = substr($bulk{$_},0,8);
$j = substr($bulk{$_},8,8);
$k = substr($bulk{$_},16);
push @{$coord{$_}},($i,$j,$k);
}
}
0
fifto Messages postés 54 Statut Membre
 
c'est bon, j'ai trouvé la solution pour les cas ou X Y et Z peuvent etre négatifs :

il fallait juste supprimer ca dans le code:

if (substr($bulk{$_},8,1) eq '-' # si -
or
substr($bulk{$_},8,1) eq '+'){# ou +
$i = substr($bulk{$_},0,7);
$j = substr($bulk{$_},8,9);
$k = substr($bulk{$_},16);
push @{$coord{$_}},($i,$j,$k);
}
else {
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Re,

Je pense que l'affichage des subcases est necessaire pour savoir ce qu'on doit entrer ainsi que les subcases ( en fait entre paranthèses on a le numéro de la subcase - 1 2 veut dire qu'il faut entrer 1 ou 2; 1 2 100 10048 veut dire qu'il faut entrer 1 ou 2 ou 100 ou 10048).
0
fifto Messages postés 54 Statut Membre
 
Merci Lami ! c'est impeccable comme ca !

Maintenant j'essaie de faire une interface html pour qu'on puisse lancer le script depuis netscape. (avec des champs "selectionner votre fichier .txt, selectionner le fichier .bulk", "choisissez le subcase", "cochez les points choisis", "cochez X Y ou Z" etc..)

Et à la fin de l'execution, une seconde page netscape s'ouvrira avec le graphique que gnuplot a généré (depuis le fichier résultat), un tableau avec le T2 (ou T1 ou T3) maximum des points pour chaque subcase etc...

Donc je commence à étudier le perl/CGI.
Bon week end !
Miguel
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Salut,

Pense à mettre résolu ici https://forums.commentcamarche.net/forum/affich-2180688-perl-regrouper-morceaux-de-texte-similaires

je suppose que tu as eu la réponse. Merci.

Et n'oublie pas de faire un signe si jamais tu n'arrives pas à faire ce que tu veux.

je suppose que tu peut continuer dans ce fil.

a+
lami20j
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fifto Messages postés 54 Statut Membre
 
ok , pas de problème, je met donc la solution à mon problème décrit ici:
https://forums.commentcamarche.net/forum/affich-2180688-perl-regrouper-morceaux-de-texte-similaires

La solution c'est de garder que les regex du style:

/\d+\s+$q$q$q$q$q$q/

sachant que
my $q = qr /.+\d\.\d+/;

et de les imprimer dans le nouveau fichier. voilà !
0