Forum Programmation.perl mettre les données d'un fichier dans un tableau

Posté par  (site web personnel) .
Étiquettes : aucune
0
21
fév.
2005
Bonjour les mongueurs ;)

Hypothèses de départ :
  • je ne sais pas du tout programmer en Perl (et très peu en autre chose),
  • Je me soigne
  • Je fais de l'astro avec des fichiers de données MON-STRU-EUX


  • Objectifs : Retirer les données du fichier et les avoir sous forme de tableau (ou autre possibilité plus pratique auquel je ne pense pas)

    Format du fichier : (attention long)

    Enter starting date of tabulation
    Calendar date: Year (1986) ? Month (1-12) (1) ? Day.fraction (1.000000) ? Time: Hours (0) ? Minutes (0) ? Seconds (0.000000) ? 1986 January 1 Wednesday 16h 46m 05.129s UT
    1986 January 1 Wednesday 16h 47m 00.000s TDT
    Julian day 2446432.1993056
    Enter interval between tabulations in days (1.000000) ? Number of tabulations to display (1) ? Planet number 0-9 or 88 to read star, 99 to read orbit (0) ?
    The Sun

    JD 2446432.20, 1986 January 1 Wednesday 16h 46m 05.129s UT
    1986 January 1 Wednesday 16h 47m 00.000s TDT
    ecliptic long 280d 59' 11.39" lat 0d 00' 00.45" rad 9.832795E-01
    light time 8.1777m, aberration dRA 1.503s dDec 1.74"
    nutation dRA -0.629s dDec -7.61"
    Apparent: R.A. 18h 47m 45.266s Dec. - 22d 59' 20.49"
    Apparent longitude 280.978 deg
    Local apparent sidereal time 18h 45m 43.315s
    diurnal aberration dRA 0.017s dDec 0.00"
    diurnal parallax dRA 0.004s dDec -8.10"
    atmospheric refraction 0.035 deg dRA -0.065s dDec 125.16"
    Topocentric: Altitude 24.772 deg, Azimuth 179.485 deg
    Topocentric: R.A. 18h 47m 45.222s Dec. - 22d 57' 23.43"
    local meridian transit 1986 January 1 Wednesday 16h 48m 07.137s UT
    rises 1986 January 1 Wednesday 12h 13m 33.241s UT
    sets 1986 January 1 Wednesday 21h 22m 49.755s UT
    Visible hours 9.1546

    Explications : En gras est ce qui m'intéresse.

    Comment je fais pour extraire cela ?
    • # pattern dans le texte d'abord

      Posté par  . Évalué à 1.

      1: as-tu un extrait brut (ie non formaté par linuxfr). les retours chariots aide a se reperer

      2: est ce que c'est garantie que la sequence commence par JD nombres+

      3: 1986 January 1 Wednesday 16h 47m 00.000s TDT : est ce sur une ligne?, c'est toujours aprés la ligne JD..., ca finit toujours par TDT<retour chariot>?

      4:Topocentric: R.A. ... : ca commence toujours par Topocentric: R.A., ou il y a qqch d'autre.

      5: faire des regexps a partir de ca, et pour le tableau: faire un csv avec champ séparé par des ; ou autre..

      6: pensez a awk,... et tous autre language de processing de texte, les perf peuvent etre meilleurs.
      • [^] # Re: pattern dans le texte d'abord

        Posté par  (site web personnel) . Évalué à 1.

        moi aussi je penses a sed et awk ... un truc bateau pour illustrer:

        a b c d e f
        aaaaaaaa bbb cc dddddddd e fffffff

        tu appliques la regle:
        cat file1 | sed 's/ /\t/' > file2

        et tu obtiens:

        a        b      c      d        e     f
        aaaaaaaa bbb    cc     dddddddd e     fffffff

        c est simple, ca ne modifies en rien le contenu, mais visuellement, ca as pal mal d effet.

        ( puree ... ca m as pris 3 ans pour ce rendu stupide dans cette page web)

        Avec des regles plus elaborees, tu peut vraiment faire des choses interessantes.
    • # Ça devrait ressembler à ça

      Posté par  . Évalué à 1.

      En supposant que chaque ligne que tu as décrit est bien une ligne, et qu'elles sont toujours dans le même ordre, ton code devrait ressembler à quelquechose comme ça:



      my @tableau = ();
      open my $fh, "< mon_fichier" or die $@;

      my $jdate;
      my $cdate;
      my $topocentric;

      while <$fh>
      {
           if(/^(JD[^,]*),/)
           { jdate = $1; }
           elsif(/^(.*) TDT$/)
           { cdate = $1; }
           elsif(/^Topocentric: (R\.A\..*)$/)
           {
               topocentric = $1;
               unshift @tableau, ([$jdate, $cdate, $topocentric]);
           }
      }

      close $fh;


      au final, @tableau est un tableau de triplets [jdate, cdate, topocentric].

      En espérant que ça t'aide.

    Suivre le flux des commentaires

    Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.