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 }