0
|
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 );
|
|
17 our %EXPORT_TAGS = ( ALL => [qw( get_csv_object get_value_from_csv )] );
|
|
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 push ( @value, $columns[$column] ) ;
|
|
153 }
|
|
154 else {
|
|
155 my $err = $csv->error_input;
|
|
156 die "Failed to parse line: $err";
|
|
157 }
|
|
158 }
|
|
159 close CSV;
|
|
160 return(\@value) ;
|
|
161 }
|
|
162 ## END of SUB
|
|
163
|
|
164 =head2 METHOD parse_csv_object
|
|
165
|
|
166 ## Description : parse_all csv object and return a array of rows
|
|
167 ## Input : $csv, $file
|
|
168 ## Output : $csv_matrix
|
|
169 ## Usage : my ( $csv_matrix ) = parse_csv_object( $csv, $file ) ;
|
|
170
|
|
171 =cut
|
|
172 ## START of SUB
|
|
173 sub parse_csv_object {
|
|
174 ## Retrieve Values
|
|
175 my $self = shift ;
|
|
176 my ( $csv, $file ) = @_ ;
|
|
177
|
|
178 my @csv_matrix = () ;
|
|
179
|
|
180 open my $fh, "<:encoding(utf8)", $$file or die "Can't open csv file $$file: $!";
|
|
181
|
|
182 while ( my $row = $csv->getline( $fh ) ) {
|
|
183 push @csv_matrix, $row;
|
|
184 }
|
|
185 $csv->eof or $csv->error_diag();
|
|
186 close $fh;
|
|
187
|
|
188 return(\@csv_matrix) ;
|
|
189 }
|
|
190 ## END of SUB
|
|
191
|
|
192 =head2 METHOD parse_allcsv_object
|
|
193
|
|
194 ## Description : parse_all csv object and return a array of rows with or without header
|
|
195 ## Input : $csv, $file, $keep_header
|
|
196 ## Output : $csv_matrix
|
|
197 ## Usage : my ( $csv_matrix ) = parse_csv_object( $csv, $file, $keep_header ) ;
|
|
198
|
|
199 =cut
|
|
200 ## START of SUB
|
|
201 sub parse_allcsv_object {
|
|
202 ## Retrieve Values
|
|
203 my $self = shift ;
|
|
204 my ( $csv, $file, $keep_header ) = @_ ;
|
|
205
|
|
206 my @csv_matrix = () ;
|
|
207 my $line = 1 ;
|
|
208
|
|
209 open my $fh, "<:encoding(utf8)", $$file or die "Can't open csv file $$file: $!";
|
|
210
|
|
211 while ( my $row = $csv->getline( $fh ) ) {
|
|
212 if ( ( $keep_header eq 'n' ) and ($line == 1) ) { }
|
|
213 else { push @csv_matrix, $row; }
|
|
214 $line ++ ;
|
|
215 }
|
|
216 my $status = $csv->eof or $csv->error_diag();
|
|
217 close $fh;
|
|
218
|
|
219 return(\@csv_matrix, $status) ;
|
|
220 }
|
|
221 ## END of SUB
|
|
222
|
|
223
|
|
224 =head2 METHOD write_csv_from_arrays
|
|
225
|
|
226 ## Description : write a csv file from list of rows
|
|
227 ## Input : $csv, $file_name, $rows
|
|
228 ## Output : $csv_file
|
|
229 ## Usage : my ( $csv_file ) = write_csv_from_arrays( $csv, $file_name, $rows ) ;
|
|
230
|
|
231 =cut
|
|
232 ## START of SUB
|
|
233 sub write_csv_from_arrays {
|
|
234 ## Retrieve Values
|
|
235 my $self = shift ;
|
|
236 my ( $csv, $file_name, $rows ) = @_ ;
|
|
237
|
|
238 my $fh = undef ;
|
|
239 $csv->eol ("\n"); ## end-of-line string to add to rows
|
|
240 open $fh, ">:encoding(utf8)", "$file_name" or die "$file_name: $!";
|
|
241
|
|
242 my $status = $csv->print ($fh, $_) for @{$rows};
|
|
243 close $fh or die "$file_name: $!";
|
|
244
|
|
245 return(\$file_name) ;
|
|
246 }
|
|
247 ## END of SUB
|
|
248
|
|
249 1 ;
|
|
250
|
|
251
|
|
252 __END__
|
|
253
|
|
254 =head1 SUPPORT
|
|
255
|
|
256 You can find documentation for this module with the perldoc command.
|
|
257
|
|
258 perldoc csv.pm
|
|
259
|
|
260 =head1 Exports
|
|
261
|
|
262 =over 4
|
|
263
|
|
264 =item :ALL is get_csv_object, get_value_from_csv
|
|
265
|
|
266 =back
|
|
267
|
|
268 =head1 AUTHOR
|
|
269
|
|
270 Franck Giacomoni E<lt>franck.giacomoni@clermont.inra.frE<gt>
|
|
271
|
|
272 =head1 LICENSE
|
|
273
|
|
274 This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
|
|
275
|
|
276 =head1 VERSION
|
|
277
|
|
278 version 1 : 23 / 10 / 2013
|
|
279
|
|
280 version 2 : ??
|
|
281
|
|
282 =cut |