Mercurial > repos > fgiacomoni > massbank_ws_searchspectrum
comparison lib/csv.pm @ 0:023c380900ef draft default tip
Init repository with last massbank_ws_searchspectrum master version
author | fgiacomoni |
---|---|
date | Wed, 19 Apr 2017 11:31:58 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:023c380900ef |
---|---|
1 package lib::csv ; | |
2 | |
3 use strict; | |
4 use warnings ; | |
5 use Exporter ; | |
6 use Carp ; | |
7 | |
8 use Text::CSV ; | |
9 | |
10 use Data::Dumper ; | |
11 | |
12 use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS); | |
13 | |
14 our $VERSION = "1.0"; | |
15 our @ISA = qw(Exporter); | |
16 our @EXPORT = qw( get_csv_object get_value_from_csv get_value_from_csv_multi_header ); | |
17 our %EXPORT_TAGS = ( ALL => [qw( get_csv_object get_value_from_csv get_value_from_csv_multi_header )] ); | |
18 | |
19 =head1 NAME | |
20 | |
21 My::Module - An example module | |
22 | |
23 =head1 SYNOPSIS | |
24 | |
25 use My::Module; | |
26 my $object = My::Module->new(); | |
27 print $object->as_string; | |
28 | |
29 =head1 DESCRIPTION | |
30 | |
31 This module does not really exist, it | |
32 was made for the sole purpose of | |
33 demonstrating how POD works. | |
34 | |
35 =head1 METHODS | |
36 | |
37 Methods are : | |
38 | |
39 =head2 METHOD new | |
40 | |
41 ## Description : new | |
42 ## Input : $self | |
43 ## Ouput : bless $self ; | |
44 ## Usage : new() ; | |
45 | |
46 =cut | |
47 | |
48 sub new { | |
49 ## Variables | |
50 my $self={}; | |
51 bless($self) ; | |
52 return $self ; | |
53 } | |
54 ### END of SUB | |
55 | |
56 =head2 METHOD get_csv_object | |
57 | |
58 ## Description : builds a csv object and etablishes format | |
59 ## Input : $separator | |
60 ## Output : $csv | |
61 ## Usage : my ( $csv ) = get_csv_object( $separator ) ; | |
62 | |
63 =cut | |
64 ## START of SUB | |
65 sub get_csv_object { | |
66 ## Retrieve Values | |
67 my $self = shift ; | |
68 my ( $separator ) = @_ ; | |
69 | |
70 # my $csv = Text::CSV->new({'sep_char' => "$separator"}); | |
71 my $csv = Text::CSV->new ( {'sep_char' => "$separator", binary => 1, } ) # should set binary attribute. | |
72 or die "Cannot use CSV: ".Text::CSV->error_diag (); | |
73 | |
74 return($csv) ; | |
75 } | |
76 ## END of SUB | |
77 | |
78 =head2 METHOD get_value_from_csv | |
79 | |
80 ## Description : extract a targeted column in a csv file | |
81 ## Input : $csv, $file, $column, $is_header | |
82 ## Output : $value | |
83 ## Usage : my ( $value ) = get_value_from_csv( $csv, $file, $column, $is_header ) ; | |
84 | |
85 =cut | |
86 ## START of SUB | |
87 sub get_value_from_csv { | |
88 ## Retrieve Values | |
89 my $self = shift ; | |
90 my ( $csv, $file, $column, $is_header ) = @_ ; | |
91 | |
92 my @value = () ; | |
93 | |
94 ## Adapte the number of the colunm : (nb of column to position in array) | |
95 $column = $column - 1 ; | |
96 | |
97 open (CSV, "<", $file) or die $! ; | |
98 | |
99 my $line = 0 ; | |
100 | |
101 while (<CSV>) { | |
102 $line++ ; | |
103 chomp $_ ; | |
104 # file has a header | |
105 if ( defined $is_header ) { if ($line == 1) { next ; } } | |
106 # parsing the targeted column | |
107 if ( $csv->parse($_) ) { | |
108 my @columns = $csv->fields(); | |
109 push ( @value, $columns[$column] ) ; | |
110 } | |
111 else { | |
112 my $err = $csv->error_input; | |
113 die "Failed to parse line: $err"; | |
114 } | |
115 } | |
116 close CSV; | |
117 return(\@value) ; | |
118 } | |
119 ## END of SUB | |
120 | |
121 =head2 METHOD get_value_from_csv_multi_header | |
122 | |
123 ## Description : extract a targeted column in a csv file | |
124 ## Input : $csv, $file, $column, $is_header, $nb_header | |
125 ## Output : $value | |
126 ## Usage : my ( $value ) = get_value_from_csv_multi_header( $csv, $file, $column, $is_header, $nb_header ) ; | |
127 | |
128 =cut | |
129 ## START of SUB | |
130 sub get_value_from_csv_multi_header { | |
131 ## Retrieve Values | |
132 my $self = shift ; | |
133 my ( $csv, $file, $column, $is_header, $nb_header ) = @_ ; | |
134 | |
135 my @value = () ; | |
136 | |
137 ## Adapte the number of the colunm : (nb of column to position in array) | |
138 $column = $column - 1 ; | |
139 | |
140 open (CSV, "<", $file) or die $! ; | |
141 | |
142 my $line = 0 ; | |
143 | |
144 while (<CSV>) { | |
145 $line++ ; | |
146 chomp $_ ; | |
147 # file has a header | |
148 if ( defined $is_header and $is_header eq 'yes') { if ($line <= $nb_header) { next ; } } | |
149 # parsing the targeted column | |
150 if ( $csv->parse($_) ) { | |
151 my @columns = $csv->fields(); | |
152 my $value = $columns[$column] ; | |
153 $value =~s/\r|\n// ; | |
154 push ( @value, $value ) ; | |
155 } | |
156 else { | |
157 my $err = $csv->error_input; | |
158 die "Failed to parse line: $err"; | |
159 } | |
160 } | |
161 close CSV; | |
162 return(\@value) ; | |
163 } | |
164 ## END of SUB | |
165 | |
166 =head2 METHOD parse_csv_object | |
167 | |
168 ## Description : parse_all csv object and return a array of rows | |
169 ## Input : $csv, $file | |
170 ## Output : $csv_matrix | |
171 ## Usage : my ( $csv_matrix ) = parse_csv_object( $csv, $file ) ; | |
172 | |
173 =cut | |
174 ## START of SUB | |
175 sub parse_csv_object { | |
176 ## Retrieve Values | |
177 my $self = shift ; | |
178 my ( $csv, $file ) = @_ ; | |
179 | |
180 my @csv_matrix = () ; | |
181 | |
182 open my $fh, "<:encoding(utf8)", $$file or die "Can't open csv file $$file: $!"; | |
183 | |
184 while ( my $row = $csv->getline( $fh ) ) { | |
185 push @csv_matrix, $row; | |
186 } | |
187 $csv->eof or $csv->error_diag(); | |
188 close $fh; | |
189 | |
190 return(\@csv_matrix) ; | |
191 } | |
192 ## END of SUB | |
193 | |
194 =head2 METHOD parse_allcsv_object | |
195 | |
196 ## Description : parse_all csv object and return a array of rows with or without header | |
197 ## Input : $csv, $file, $keep_header | |
198 ## Output : $csv_matrix | |
199 ## Usage : my ( $csv_matrix ) = parse_csv_object( $csv, $file, $keep_header ) ; | |
200 | |
201 =cut | |
202 ## START of SUB | |
203 sub parse_allcsv_object { | |
204 ## Retrieve Values | |
205 my $self = shift ; | |
206 my ( $csv, $file, $keep_header ) = @_ ; | |
207 | |
208 my @csv_matrix = () ; | |
209 my $line = 1 ; | |
210 | |
211 open my $fh, "<:encoding(utf8)", $$file or die "Can't open csv file $$file: $!"; | |
212 | |
213 while ( my $row = $csv->getline( $fh ) ) { | |
214 if ( ( $keep_header eq 'n' ) and ($line == 1) ) { } | |
215 else { push @csv_matrix, $row; } | |
216 $line ++ ; | |
217 } | |
218 my $status = $csv->eof or $csv->error_diag(); | |
219 close $fh; | |
220 | |
221 return(\@csv_matrix, $status) ; | |
222 } | |
223 ## END of SUB | |
224 | |
225 | |
226 =head2 METHOD write_csv_from_arrays | |
227 | |
228 ## Description : write a csv file from list of rows | |
229 ## Input : $csv, $file_name, $rows | |
230 ## Output : $csv_file | |
231 ## Usage : my ( $csv_file ) = write_csv_from_arrays( $csv, $file_name, $rows ) ; | |
232 | |
233 =cut | |
234 ## START of SUB | |
235 sub write_csv_from_arrays { | |
236 ## Retrieve Values | |
237 my $self = shift ; | |
238 my ( $csv, $file_name, $rows ) = @_ ; | |
239 | |
240 my $fh = undef ; | |
241 $csv->eol ("\n"); ## end-of-line string to add to rows | |
242 $csv->quote_char(undef) ; | |
243 open $fh, ">:encoding(utf8)", "$file_name" or die "$file_name: $!"; | |
244 | |
245 my $status = $csv->print ($fh, $_) for @{$rows}; | |
246 close $fh or die "$file_name: $!"; | |
247 | |
248 return(\$file_name) ; | |
249 } | |
250 ## END of SUB | |
251 | |
252 1 ; | |
253 | |
254 | |
255 __END__ | |
256 | |
257 =head1 SUPPORT | |
258 | |
259 You can find documentation for this module with the perldoc command. | |
260 | |
261 perldoc csv.pm | |
262 | |
263 =head1 Exports | |
264 | |
265 =over 4 | |
266 | |
267 =item :ALL is get_csv_object, get_value_from_csv | |
268 | |
269 =back | |
270 | |
271 =head1 AUTHOR | |
272 | |
273 Franck Giacomoni E<lt>franck.giacomoni@clermont.inra.frE<gt> | |
274 | |
275 =head1 LICENSE | |
276 | |
277 This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. | |
278 | |
279 =head1 VERSION | |
280 | |
281 version 1 : 23 / 10 / 2013 | |
282 | |
283 version 2 : ?? | |
284 | |
285 =cut |