bufr.pm:bufrresolve_source

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
bufr.pm:bufrresolve_source [2010-04-05 08:19:37]
pals
bufr.pm:bufrresolve_source [2023-02-05 10:15:44] (current)
pals
Line 1: Line 1:
-<code> +<code perl
-#!/usr/bin/perl -w+#!/usr/bin/perl
  
-# (C) Copyright 2010, met.no+# (C) Copyright 2010-2023 MET Norway
 # #
 # This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
Line 22: Line 22:
  
 use strict; use strict;
 +use warnings;
 use Getopt::Long; use Getopt::Long;
 use Pod::Usage qw(pod2usage); use Pod::Usage qw(pod2usage);
 use Geo::BUFR; use Geo::BUFR;
 +
 +# This is actually default in BUFR.pm, but provided here to make it
 +# easier for users to change to 'ECCODES' if preferred
 +use constant DEFAULT_TABLE_FORMAT => 'BUFRDC';
  
 # Will be used if neither --tablepath nor $ENV{BUFR_TABLES} is set # Will be used if neither --tablepath nor $ENV{BUFR_TABLES} is set
-use constant DEFAULT_TABLE_PATH => '/usr/local/lib/bufrtables';+use constant DEFAULT_TABLE_PATH_BUFRDC => '/usr/local/lib/bufrtables'; 
 +use constant DEFAULT_TABLE_PATH_ECCODES => '/usr/local/share/eccodes/definitions/bufr/tables';
 # Ought to be your most up-to-date B table # Ought to be your most up-to-date B table
-use constant DEFAULT_TABLE => 'B0000000000098013001';+use constant DEFAULT_TABLE_BUFRDC => 'B0000000000000037000'; 
 +use constant DEFAULT_TABLE_ECCODES => '0/wmo/37';
  
 # Parse command line options # Parse command line options
Line 36: Line 43:
 GetOptions( GetOptions(
            \%option,            \%option,
-           'tablepath=s',# Set BUFR table path +           'bufrtable=s',# Set BUFR tables 
-           'code=s',     # Print the content of code table+           'code=s',     # Print the contents of code table
            'flag=i',     # Resolve the flag value given            'flag=i',     # Resolve the flag value given
            'help',       # Print help information and exit            'help',       # Print help information and exit
Line 45: Line 52:
            'simple',     # Like 'partial', but displaying the resulting            'simple',     # Like 'partial', but displaying the resulting
                          # descriptors on one line                          # descriptors on one line
-           'bufrtable=s',# Set BUFR tables +           'tableformat=s',  # Set BUFR table format 
-           'verbose',    # Display path and tables used+           'tablepath=s',# Set BUFR table path 
 +           'verbose=i',  # Display path and tables used
        ) or pod2usage(-verbose => 0);        ) or pod2usage(-verbose => 0);
  
Line 66: Line 74:
 foreach (@ARGV) { foreach (@ARGV) {
     pod2usage("All arguments must be integers!") unless /^\d+$/;     pod2usage("All arguments must be integers!") unless /^\d+$/;
 +}
 +if (defined $option{code} && $option{code} !~ /^\d+$/) {
 +    pod2usage("Code table is not a (positive) integer!");
 +}
 +if (defined $option{flag} && $option{flag} !~ /^\d+$/) {
 +    pod2usage("Flag value is not a (positive) integer!");
 } }
 +
  
 # Set verbosity level for the BUFR module # Set verbosity level for the BUFR module
 my $verbose = $option{verbose} ? 1 : 0; my $verbose = $option{verbose} ? 1 : 0;
 Geo::BUFR->set_verbose($verbose); Geo::BUFR->set_verbose($verbose);
 +
 +# From version 1.32 a descriptor sequence ending in e.g. 106000 031001
 +# will be allowed unless strict checking is set, and we really want
 +# bufrresolve.pl to complain in this case
 +Geo::BUFR->set_strict_checking(2);
 +
 +# Set BUFR table format
 +my $tableformat = (defined $option{tableformat}) ? uc $option{tableformat} : DEFAULT_TABLE_FORMAT;
 +Geo::BUFR->set_tableformat($tableformat);
  
 # Set BUFR table path # Set BUFR table path
Line 80: Line 104:
     Geo::BUFR->set_tablepath($ENV{BUFR_TABLES});     Geo::BUFR->set_tablepath($ENV{BUFR_TABLES});
 } else { } else {
-    # If all else fails, use the libemos bufrtables +    # If all else fails, use the default tablepath in BUFRDC/ECCODES 
-    Geo::BUFR->set_tablepath(DEFAULT_TABLE_PATH);+    if ($tableformat eq 'BUFRDC') { 
 +        Geo::BUFR->set_tablepath(DEFAULT_TABLE_PATH_BUFRDC); 
 +    } elsif ($tableformat eq 'ECCODES'
 +        Geo::BUFR->set_tablepath(DEFAULT_TABLE_PATH_ECCODES); 
 +    }
 } }
  
 # BUFR table file to use # BUFR table file to use
-my $table = $option{bufrtable} || DEFAULT_TABLE;+my $table = $option{bufrtable} || 
 +    ($tableformat eq 'BUFRDC' ? DEFAULT_TABLE_BUFRDC : DEFAULT_TABLE_ECCODES);
  
 my $bufr = Geo::BUFR->new(); my $bufr = Geo::BUFR->new();
Line 93: Line 122:
     my $code_table = $option{code};     my $code_table = $option{code};
     if (defined $option{flag}) {     if (defined $option{flag}) {
-        print $bufr->resolve_flagvalue($option{flag}, $code_table, $table);+        if ($option{flag} == 0) { 
 +            print "No bits are set\n"; 
 +        } else { 
 +            print $bufr->resolve_flagvalue($option{flag}, $code_table, $table); 
 +        }
     } else {     } else {
         print $bufr->dump_codetable($code_table, $table);         print $bufr->dump_codetable($code_table, $table);
Line 112: Line 145:
  
 =pod =pod
 +
 +=encoding utf8
  
 =head1 SYNOPSIS =head1 SYNOPSIS
Line 119: Line 154:
      [--simple]      [--simple]
      [--noexpand]      [--noexpand]
-     [--bufrtable <name of BUFR B or D table]+     [--bufrtable <name of BUFR table
 +     [--tableformat <BUFRDC|ECCODES>]
      [--tablepath <path to BUFR tables>]      [--tablepath <path to BUFR tables>]
-     [--verbose]+     [--verbose n]
      [--help]      [--help]
  
-  2) bufrresolve.pl --code <code_table+  2) bufrresolve.pl --code <code or flag table
-     [--bufrtable <name of BUFR B or D table>]+     [--bufrtable <name of BUFR table>] 
 +     [--tableformat <BUFRDC|ECCODES>]
      [--tablepath <path to BUFR tables>]      [--tablepath <path to BUFR tables>]
-     [--verbose]+     [--verbose n]
  
-  3) bufrresolve.pl --flag <value> --code <flag_table+  3) bufrresolve.pl --flag <value> --code <flag table
-     [--bufrtable <name of BUFR B or D table]+     [--bufrtable <name of BUFR table
 +     [--tableformat <BUFRDC|ECCODES>]
      [--tablepath <path to BUFR tables>]      [--tablepath <path to BUFR tables>]
-     [--verbose]+     [--verbose n]
  
 =head1 DESCRIPTION =head1 DESCRIPTION
Line 139: Line 177:
  
 Execute without arguments for Usage, with option C<--help> for some Execute without arguments for Usage, with option C<--help> for some
-additional info. See also L</https://wiki.met.no/bufr.pm/start> for+additional info. See also L<https://wiki.met.no/bufr.pm/start> for
 examples of use. examples of use.
  
-It is supposed that the code and flag tables are contained in a file +The tables used can be selected by the user with options 
-with same name as corresponding B and D tables except for having +C<--bufrtable>C<--tablepath> and C<--tableformat>. Default 
-prefix C instead of B or D. The tables used can be chosen by the user +tableformat in Geo::BUFR is BUFRDCwhile default tablepath in 
-with options C<--bufrtable> and C<--tablepath>. Default is the hard +bufrresolve.pl will be overridden if the environment variable 
-coded DEFAULT_TABLE in directory DEFAULT_TABLE_PATHbut this last one +BUFR_TABLES is set. You should consider edit the source code of 
-will be overriden if the environment variable BUFR_TABLES is set. You +bufrresolve.pl if you are not satisfied with the defaults chosen for 
-should consider edit the source code if you are not satisfied with the +tablepath and bufrtable (search for 'DEFAULT'). 
-defaults chosen.+ 
 +For tableformat ECCODES, see 
 +L<http://search.cpan.org/dist/Geo-BUFR/lib/Geo/BUFR.pm#BUFR-TABLE-FILES> 
 +for more info on how to set C<--tablepath>
 + 
 +For the table name in C<--bufrtable> in BUFRDC, use basename of B 
 +table, e.g.  B0000000000098013001.TXT. Replacing B with D or C, or 
 +omitting this prefix altogether, or even omitting the trailing '.TXT' 
 +(i.e. 0000000000098013001) will also work. 
 + 
 +For the table name in C<--bufrtable> in ECCODES, use last significant part 
 +of table location, e.g. '0/wmo/29' for WMO master tables or 
 +'0/local/8/78/236' for local tables on Unix-like systems. For looking 
 +up local sequence descriptors, you might need to provide both a master 
 +and the local table to get the full expansion, e.g. 
 +'0/wmo/29,0/local/8/78/236'
 + 
 +See also L</"CAVEAT"> below for more about the C<--bufrtable> option.
  
 =head1 OPTIONS =head1 OPTIONS
Line 157: Line 212:
                 descriptors on one line                 descriptors on one line
    --noexpand   Don't expand D descriptors at all    --noexpand   Don't expand D descriptors at all
- 
    --bufrtable <name of BUFR B or D table>  Set BUFR tables    --bufrtable <name of BUFR B or D table>  Set BUFR tables
 +   --tableformat Currently supported are BUFRDC and ECCODES (default is BUFRDC)
    --tablepath <path to BUFR tables>  Set BUFR table path    --tablepath <path to BUFR tables>  Set BUFR table path
-   --verbose    Display path and tables used +   --verbose n  Display path and tables used if n > 0
    --help       Display Usage and explain the options used. Almost    --help       Display Usage and explain the options used. Almost
                 the same as consulting perldoc bufrresolve.pl                 the same as consulting perldoc bufrresolve.pl
Line 170: Line 224:
 and --noexpand are mutually exclusive (full expansion is default). and --noexpand are mutually exclusive (full expansion is default).
  
-Usage 2): Prints the content of code or flag table <code_table>.+Usage 2): Prints the contents of the requested code or flag table 
 +(named by the table B descriptor).
  
-Usage 3): Displays the bits set for flag value <value> in flag table +Usage 3): Displays the bits set when the data value for the requested 
-<flag_table>.+flag table is <value>.
  
 Options may be abbreviated, e.g. C<--h> or C<-h> for C<--help> Options may be abbreviated, e.g. C<--h> or C<-h> for C<--help>
 +
 +=head1 CAVEAT
 +
 +The C<--bufrtable> option could be considered mandatory, since there
 +is no guarantee that the same BUFR descriptor resolves the same way
 +for different BUFR tables. However, as soon as a new BUFR descriptor
 +is introduced in a BUFR table, it is extremely rare that the
 +descriptor is redefined in later versions. So for convenience,
 +bufrresolve.pl uses a default table (adding option C<--verbose 1> will
 +show you the tables used). If this is the wrong table for your purpose
 +(most common case will be if the descriptor was added in a higher
 +version than that of the default table), you should definitely use
 +C<--bufrtable> with the appropriate table.
  
 =head1 AUTHOR =head1 AUTHOR
Line 183: Line 251:
 =head1 COPYRIGHT =head1 COPYRIGHT
  
-Copyright (C) 2010 met.no+Copyright (C) 2010-2023 MET Norway
  
 =cut =cut
 </code> </code>
  • bufr.pm/bufrresolve_source.1270455577.txt.gz
  • Last modified: 2022-05-31 09:23:11
  • (external edit)