github.com/jjjabc/fitsio@v0.0.0-20161215022839-d1807e9e818e/cmd/go-fitsio-tablist/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"os"
     7  	"reflect"
     8  	"strings"
     9  
    10  	fits "github.com/astrogo/fitsio"
    11  )
    12  
    13  func main() {
    14  	rc := run()
    15  	os.Exit(rc)
    16  }
    17  
    18  func run() int {
    19  
    20  	flag.Usage = func() {
    21  		const msg = `Usage: go-fitsio-tablist filename[ext][col filter][row filter]
    22  
    23  List the contents of a FITS table
    24  
    25  Examples:
    26    tablist tab.fits[GTI]           - list the GTI extension
    27    tablist tab.fits[1][#row < 101] - list first 100 rows
    28    tablist tab.fits[1][col X;Y]    - list X and Y cols only
    29    tablist tab.fits[1][col -PI]    - list all but the PI col
    30    tablist tab.fits[1][col -PI][#row < 101]  - combined case
    31  
    32  Display formats can be modified with the TDISPn keywords.
    33  `
    34  		fmt.Fprintf(os.Stderr, "%v\n", msg)
    35  		flag.PrintDefaults()
    36  	}
    37  
    38  	flag.Parse()
    39  	if flag.NArg() != 1 {
    40  		flag.Usage()
    41  		return 1
    42  	}
    43  
    44  	fname := flag.Arg(0)
    45  	r, err := os.Open(fname)
    46  	if err != nil {
    47  		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
    48  		return 1
    49  	}
    50  	defer r.Close()
    51  
    52  	f, err := fits.Open(r)
    53  	if err != nil {
    54  		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
    55  		return 1
    56  	}
    57  	defer f.Close()
    58  
    59  	for _, hdu := range f.HDUs() {
    60  		if hdu.Type() == fits.IMAGE_HDU {
    61  			//fmt.Fprintf(os.Stderr, "Error: this program only displays tables, not images\n")
    62  			//return 1
    63  			continue
    64  		}
    65  
    66  		table := hdu.(*fits.Table)
    67  		ncols := len(table.Cols())
    68  		nrows := table.NumRows()
    69  		rows, err := table.Read(0, nrows)
    70  		if err != nil {
    71  			fmt.Fprintf(os.Stderr, "Error: %v\n", err)
    72  			return 1
    73  		}
    74  		w := os.Stdout
    75  		hdrline := strings.Repeat("=", 80-15)
    76  		maxname := 10
    77  		for _, col := range table.Cols() {
    78  			if len(col.Name) > maxname {
    79  				maxname = len(col.Name)
    80  			}
    81  		}
    82  
    83  		data := make([]interface{}, ncols)
    84  		names := make([]string, ncols)
    85  		for i, col := range table.Cols() {
    86  			names[i] = col.Name
    87  			data[i] = reflect.New(col.Type()).Interface()
    88  		}
    89  
    90  		rowfmt := fmt.Sprintf("%%-%ds | %%v\n", maxname)
    91  		for irow := 0; rows.Next(); irow++ {
    92  			err = rows.Scan(data...)
    93  			if err != nil {
    94  				fmt.Printf("Error: (row=%v) %v\n", irow, err)
    95  			}
    96  			fmt.Fprintf(w, "== %05d/%05d %s\n", irow, nrows, hdrline)
    97  			for i := 0; i < ncols; i++ {
    98  				rv := reflect.Indirect(reflect.ValueOf(data[i]))
    99  				fmt.Fprintf(w, rowfmt, names[i], rv.Interface())
   100  			}
   101  		}
   102  
   103  		err = rows.Err()
   104  		if err != nil {
   105  			fmt.Fprintf(os.Stderr, "Error: %v\n", err)
   106  			return 1
   107  		}
   108  	}
   109  
   110  	return 0
   111  }