11extern crate plotters;
2- extern crate serde;
32extern crate csv;
3+ use csv:: StringRecord ;
44use plotters:: prelude:: * ;
5- use serde:: Deserialize ;
65use std:: io;
76use std:: collections:: BTreeMap ;
87use structopt:: StructOpt ;
@@ -19,6 +18,10 @@ struct Opt
1918 /// optional file with on entry per line [default: STDIN]
2019 input : Option < PathBuf > ,
2120
21+ #[ structopt( long, short, default_value = "1" ) ]
22+ /// key (column) selector
23+ key : usize ,
24+
2225 #[ structopt( parse( from_os_str) , long, short, default_value = "histogram.png" ) ]
2326 /// file to save PNG plot to
2427 output : PathBuf ,
@@ -52,12 +55,6 @@ struct Opt
5255 ydesc : String ,
5356}
5457
55- #[ derive( Debug , Deserialize ) ]
56- struct Record
57- {
58- key : String ,
59- }
60-
6158fn main ( ) -> Result < ( ) , Box < dyn Error > >
6259{
6360 let opt = Opt :: from_args ( ) ;
@@ -72,19 +69,18 @@ fn main() -> Result<(), Box<dyn Error>>
7269 Box :: new ( io:: stdin ( ) )
7370 } ;
7471
75- let key_counts =
76- csv:: ReaderBuilder :: new ( )
72+ let mut reader = csv:: ReaderBuilder :: new ( )
7773 . has_headers ( false )
7874 . delimiter ( b'\t' )
79- . from_reader ( input)
80- . deserialize :: < Record > ( )
81- . fold ( BTreeMap :: new ( ) , | mut map , rec|
82- {
83- let s = rec . unwrap ( ) . key ;
84- //*map.entry(s).or_insert(0) += 1;
85- map . entry ( s ) . and_modify ( |e| * e += 1 ) . or_insert ( 1 ) ;
86- map
87- } ) ;
75+ . from_reader ( input) ;
76+
77+ let mut key_counts = BTreeMap :: new ( ) ;
78+ let mut record = StringRecord :: new ( ) ;
79+ while reader . read_record ( & mut record ) ?
80+ {
81+ let s = record . get ( opt . key - 1 ) . unwrap ( ) . to_string ( ) ;
82+ key_counts . entry ( s ) . and_modify ( |e| * e += 1 ) . or_insert ( 1 ) ;
83+ }
8884
8985 if let Some ( path) = & opt. save
9086 {
0 commit comments