1CSV_XS(3) User Contributed Perl Documentation CSV_XS(3)
2
3
4
6 Text::CSV_XS - comma-separated values manipulation routines
7
9 use Text::CSV_XS;
10
11 $csv = Text::CSV_XS->new (); # create a new object
12 $csv = Text::CSV_XS->new (\%attr); # create a new object
13
14 $status = $csv->combine (@columns); # combine columns into a string
15 $line = $csv->string (); # get the combined string
16
17 $status = $csv->parse ($line); # parse a CSV string into fields
18 @columns = $csv->fields (); # get the parsed fields
19
20 $status = $csv->status (); # get the most recent status
21 $bad_argument = $csv->error_input (); # get the most recent bad argument
22
23 $status = $csv->print ($io, $colref); # Write an array of fields
24 # immediately to a file $io
25 $colref = $csv->getline ($io); # Read a line from file $io,
26 # parse it and return an array
27 # ref of fields
28 $eof = $csv->eof (); # Indicate if last parse or
29 # getline () hit End Of File
30
31 $csv->types (\@t_array); # Set column types
32
34 Text::CSV_XS provides facilities for the composition and decomposition
35 of comma-separated values. An instance of the Text::CSV_XS class can
36 combine fields into a CSV string and parse a CSV string into fields.
37
38 The module accepts either strings or files as input and can utilize any
39 user-specified characters as delimiters, separators, and escapes so it
40 is perhaps better called ASV (anything separated values) rather than
41 just CSV.
42
43 Embedded newlines
44
45 Important Note: The default behavior is to only accept ascii charac‐
46 ters. This means that fields can not contain newlines. If your data
47 contains newlines embedded in fields, or characters above 0x7e (tilde),
48 or binary data, you *must* set "binary => 1" in the call to "new ()".
49 To cover the widest range of parsing options, you will always want to
50 set binary.
51
52 But you still have the problem that you have to pass a correct line to
53 the "parse ()" method, which is more complicated from the usual point
54 of usage:
55
56 my $csv = Text::CSV_XS->new ({ binary => 1, eol => $/ });
57 while (<>) { # WRONG!
58 $csv->parse ($_);
59 my @fields = $csv->fields ();
60
61 will break, as the while might read broken lines, as that doesn't care
62 about the quoting. If you need to support embedded newlines, the way to
63 go is either
64
65 use IO::Handle;
66 my $csv = Text::CSV_XS->new ({ binary => 1, eol => $/ });
67 while (my $row = $csv->getline (*ARGV)) {
68 my @fields = @$row;
69
70 or, more safely in perl 5.6 and up
71
72 my $csv = Text::CSV_XS->new ({ binary => 1, eol => $/ });
73 open my $io, "<", $file or die "$file: $!";
74 while (my $row = $csv->getline ($io)) {
75 my @fields = @$row;
76
78 While no formal specification for CSV exists, RFC 4180 1) describes a
79 common format and establishes "text/csv" as the MIME type registered
80 with the IANA.
81
82 Many informal documents exist that describe the CSV format. How To: The
83 Comma Separated Value (CSV) File Format 2) provides an overview of the
84 CSV format in the most widely used applications and explains how it can
85 best be used and supported.
86
87 1) http://tools.ietf.org/html/rfc4180
88 2) http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm
89
90 The basic rules are as follows:
91
92 CSV is a delimited data format that has fields/columns separated by the
93 comma character and records/rows separated by newlines. Fields that
94 contain a special character (comma, newline, or double quote), must be
95 enclosed in double quotes. However, if a line contains a single entry
96 which is the empty string, it may be enclosed in double quotes. If a
97 field's value contains a double quote character it is escaped by plac‐
98 ing another double quote character next to it. The CSV file format does
99 not require a specific character encoding, byte order, or line termina‐
100 tor format.
101
102 · Each record is one line terminated by a line feed (ASCII/LF=0x0A) or
103 a carriage return and line feed pair (ASCII/CRLF=0x0D 0x0A), however,
104 line-breaks can be embedded.
105
106 · Fields are separated by commas.
107
108 · Allowable characters within a CSV field include 0x09 (tab) and the
109 inclusive range of 0x20 (space) through 0x7E (tilde). In binary mode
110 all characters are accepted, at least in quoted fields.
111
112 · A field within CSV must be surrounded by double-quotes to contain a
113 the separator character (comma).
114
115 Though this is the most clear and restrictive definition, Text::CSV_XS
116 is way more liberal than this, and allows extension:
117
118 · Line termination by a single carriage return is accepted by default
119
120 · The separation-, escape-, and escape- characters can be any ASCII
121 character in the range from 0x20 (space) to 0x7E (tilde). Characters
122 outside this range may or may not work as expected. Multibyte charac‐
123 ters, like U+060c (ARABIC COMMA), U+FF0C (FULLWIDTH COMMA), U+241B
124 (SYMBOL FOR ESCAPE), U+2424 (SYMBOL FOR NEWLINE), U+FF02 (FULLWIDTH
125 QUOTATION MARK), and U+201C (LEFT DOUBLE QUOTATION MARK) (to give
126 some examples of what might look promising) are therefor not allowed.
127
128 · A field within CSV must be surrounded by double-quotes to contain an
129 embedded double-quote, represented by a pair of consecutive dou‐
130 ble-quotes. In binary mode you may additionally use the sequence ""0"
131 for representation of a NULL byte.
132
133 · Several violations of the above specification may be allowed by pass‐
134 ing options to the object creator.
135
137 version ()
138 (Class method) Returns the current module version.
139
140 new (\%attr)
141 (Class method) Returns a new instance of Text::CSV_XS. The objects
142 attributes are described by the (optional) hash ref "\%attr". Cur‐
143 rently the following attributes are available:
144
145 eol An end-of-line string to add to rows, usually "undef" (nothing,
146 default), "\012" (Line Feed) or "\015\012" (Carriage Return,
147 Line Feed). Cannot be longer than 7 (ASCII) characters.
148
149 If both $/ and "eol" equal "\015", parsing lines that end on
150 only a Carriage Return without Line Feed, will be "parse"d cor‐
151 rect. Line endings, whether in $/ or "eol", other than
152 "undef", "\n", "\r\n", or "\r" are not (yet) supported for
153 parsing.
154
155 sep_char
156 The char used for separating fields, by default a comma. (",").
157 Limited to a single-byte character, usually in the range from
158 0x20 (space) to 0x7e (tilde).
159
160 The separation character can not be equal to the quote charac‐
161 ter. The separation character can not be equal to the escape
162 character.
163
164 allow_whitespace
165 When this option is set to true, whitespace (TAB's and SPACE's)
166 surrounding the separation character is removed when parsing.
167 So lines like:
168
169 1 , "foo" , bar , 3 , zapp
170
171 are now correctly parsed, even though it violates the CSV
172 specs. Note that all whitespace is stripped from start and end
173 of each field. That would make is more a feature than a way to
174 be able to parse bad CSV lines, as
175
176 1, 2.0, 3, ape , monkey
177
178 will now be parsed as
179
180 ("1", "2.0", "3", "ape", "monkey")
181
182 even if the original line was perfectly sane CSV.
183
184 quote_char
185 The char used for quoting fields containing blanks, by default
186 the double quote character ("""). A value of undef suppresses
187 quote chars. (For simple cases only). Limited to a single-byte
188 character, usually in the range from 0x20 (space) to 0x7e
189 (tilde).
190
191 The quote character can not be equal to the separation charac‐
192 ter.
193
194 allow_loose_quotes
195 By default, parsing fields that have "quote_char" characters
196 inside an unquoted field, like
197
198 1,foo "bar" baz,42
199
200 would result in a parse error. Though it is still bad practice
201 to allow this format, we cannot help there are some vendors
202 that make their applications spit out lines styled like this.
203
204 escape_char
205 The character used for escaping certain characters inside
206 quoted fields. Limited to a single-byte character, usually in
207 the range from 0x20 (space) to 0x7e (tilde).
208
209 The "escape_char" defaults to being the literal double-quote
210 mark (""") in other words, the same as the default
211 "quote_char". This means that doubling the quote mark in a
212 field escapes it:
213
214 "foo","bar","Escape ""quote mark"" with two ""quote marks""","baz"
215
216 If you change the default quote_char without changing the
217 default escape_char, the escape_char will still be the quote
218 mark. If instead you want to escape the quote_char by doubling
219 it, you will need to change the escape_char to be the same as
220 what you changed the quote_char to.
221
222 The escape character can not be equal to the separation charac‐
223 ter.
224
225 allow_loose_escapes
226 By default, parsing fields that have "escape_char" characters
227 that escape characters that do not need to be escaped, like:
228
229 my $csv = Text::CSV_XS->new ({ escape_char => "\\" });
230 $csv->parse (qq{1,"my bar\'s",baz,42});
231
232 would result in a parse error. Though it is still bad practice
233 to allow this format, this option enables you to treat all
234 escape character sequences equal.
235
236 binary
237 If this attribute is TRUE, you may use binary characters in
238 quoted fields, including line feeds, carriage returns and NULL
239 bytes. (The latter must be escaped as ""0".) By default this
240 feature is off.
241
242 types
243 A set of column types; this attribute is immediately passed to
244 the types method below. You must not set this attribute other‐
245 wise, except for using the types method. For details see the
246 description of the types method below.
247
248 always_quote
249 By default the generated fields are quoted only, if they need
250 to, for example, if they contain the separator. If you set this
251 attribute to a TRUE value, then all fields will be quoted. This
252 is typically easier to handle in external applications. (Poor
253 creatures who aren't using Text::CSV_XS. :-)
254
255 keep_meta_info
256 By default, the parsing of input lines is as simple and fast as
257 possible. However, some parsing information - like quotation of
258 the original field - is lost in that process. Set this flag to
259 true to be able to retrieve that information after parsing with
260 the methods "meta_info ()", "is_quoted ()", and "is_binary ()"
261 described below. Default is false.
262
263 verbatim
264 This is a quite controversial attribute to set, but it makes
265 hard things possible.
266
267 The basic thought behind this is to tell the parser that the
268 normally special characters newline (NL) and Carriage Return
269 (CR) will not be special when this flag is set, and be dealt
270 with as being ordinary binary characters. This will ease work‐
271 ing with data with embedded newlines.
272
273 When "verbatim" is used with "getline ()", getline auto-chomp's
274 every line.
275
276 Imagine a file format like
277
278 M^^Hans^Janssen^Klas 2\n2A^Ja^11-06-2007#\r\n
279
280 where, the line ending is a very specific "#\r\n", and the
281 sep_char is a ^ (caret). None of the fields is quoted, but
282 embedded binary data is likely to be present. With the specific
283 line ending, that shouldn't be too hard to detect.
284
285 By default, Text::CSV_XS' parse function however is instructed
286 to only know about "\n" and "\r" to be legal line endings, and
287 so has to deal with the embedded newline as a real end-of-line,
288 so it can scan the next line if binary is true, and the newline
289 is inside a quoted field. With this attribute however, we can
290 tell parse () to parse the line as if \n is just nothing more
291 than a binary character.
292
293 For parse () this means that the parser has no idea about line
294 ending anymore, and getline () chomps line endings on reading.
295
296 To sum it up,
297
298 $csv = Text::CSV_XS->new ();
299
300 is equivalent to
301
302 $csv = Text::CSV_XS->new ({
303 quote_char => '"',
304 escape_char => '"',
305 sep_char => ',',
306 eol => '',
307 always_quote => 0,
308 binary => 0,
309 keep_meta_info => 0,
310 allow_loose_quotes => 0,
311 allow_loose_escapes => 0,
312 allow_whitespace => 0,
313 verbatim => 0,
314 });
315
316 For all of the above mentioned flags, there is an accessor method
317 available where you can inquire for the current value, or change
318 the value
319
320 my $quote = $csv->quote_char;
321 $csv->binary (1);
322
323 It is unwise to change these settings halfway through writing CSV
324 data to a stream. If however, you want to create a new stream using
325 the available CSV object, there is no harm in changing them.
326
327 combine
328 $status = $csv->combine (@columns);
329
330 This object function constructs a CSV string from the arguments,
331 returning success or failure. Failure can result from lack of
332 arguments or an argument containing an invalid character. Upon
333 success, "string ()" can be called to retrieve the resultant CSV
334 string. Upon failure, the value returned by "string ()" is unde‐
335 fined and "error_input ()" can be called to retrieve an invalid
336 argument.
337
338 print
339 $status = $csv->print ($io, $colref);
340
341 Similar to combine, but it expects an array ref as input (not an
342 array!) and the resulting string is not really created, but imme‐
343 diately written to the $io object, typically an IO handle or any
344 other object that offers a print method. Note, this implies that
345 the following is wrong:
346
347 open FILE, ">", "whatever";
348 $status = $csv->print (\*FILE, $colref);
349
350 The glob "\*FILE" is not an object, thus it doesn't have a print
351 method. The solution is to use an IO::File object or to hide the
352 glob behind an IO::Wrap object. See IO::File(3) and IO::Wrap(3) for
353 details.
354
355 For performance reasons the print method doesn't create a result
356 string. In particular the $csv->string (), $csv->status (),
357 $csv-fields ()> and $csv->error_input () methods are meaningless
358 after executing this method.
359
360 string
361 $line = $csv->string ();
362
363 This object function returns the input to "parse ()" or the resul‐
364 tant CSV string of "combine ()", whichever was called more
365 recently.
366
367 parse
368 $status = $csv->parse ($line);
369
370 This object function decomposes a CSV string into fields, returning
371 success or failure. Failure can result from a lack of argument or
372 the given CSV string is improperly formatted. Upon success,
373 "fields ()" can be called to retrieve the decomposed fields . Upon
374 failure, the value returned by "fields ()" is undefined and
375 "error_input ()" can be called to retrieve the invalid argument.
376
377 You may use the types () method for setting column types. See the
378 description below.
379
380 getline
381 $colref = $csv->getline ($io);
382
383 This is the counterpart to print, like parse is the counterpart to
384 combine: It reads a row from the IO object $io using $io->getline
385 () and parses this row into an array ref. This array ref is
386 returned by the function or undef for failure.
387
388 The $csv->string (), $csv->fields () and $csv->status () methods
389 are meaningless, again.
390
391 eof
392 $eof = $csv->eof ();
393
394 If "parse ()" or "getline ()" was used with an IO stream, this
395 method will return true (1) if the last call hit end of file, oth‐
396 erwise it will return false (''). This is useful to see the differ‐
397 ence between a failure and end of file.
398
399 types
400 $csv->types (\@tref);
401
402 This method is used to force that columns are of a given type. For
403 example, if you have an integer column, two double columns and a
404 string column, then you might do a
405
406 $csv->types ([Text::CSV_XS::IV (),
407 Text::CSV_XS::NV (),
408 Text::CSV_XS::NV (),
409 Text::CSV_XS::PV ()]);
410
411 Column types are used only for decoding columns, in other words by
412 the parse () and getline () methods.
413
414 You can unset column types by doing a
415
416 $csv->types (undef);
417
418 or fetch the current type settings with
419
420 $types = $csv->types ();
421
422 IV Set field type to integer.
423
424 NV Set field type to numeric/float.
425
426 PV Set field type to string.
427
428 fields
429 @columns = $csv->fields ();
430
431 This object function returns the input to "combine ()" or the
432 resultant decomposed fields of "parse ()", whichever was called
433 more recently.
434
435 meta_info
436 @flags = $csv->meta_info ();
437
438 This object function returns the flags of the input to "combine ()"
439 or the flags of the resultant decomposed fields of "parse ()",
440 whichever was called more recently.
441
442 For each field, a meta_info field will hold flags that tell some‐
443 thing about the field returned by the "fields ()" method or passed
444 to the "combine ()" method. The flags are bitwise-or'd like:
445
446 0x0001
447 The field was quoted.
448
449 0x0002
450 The field was binary.
451
452 See the "is_*** ()" methods below.
453
454 is_quoted
455 my $quoted = $csv->is_quoted ($column_idx);
456
457 Where $column_idx is the (zero-based) index of the column in the
458 last result of "parse ()".
459
460 This returns a true value if the data in the indicated column was
461 enclosed in "quote_char" quotes. This might be important for data
462 where ",20070108," is to be treated as a numeric value, and where
463 ","20070108"," is explicitly marked as character string data.
464
465 is_binary
466 my $binary = $csv->is_binary ($column_idx);
467
468 Where $column_idx is the (zero-based) index of the column in the
469 last result of "parse ()".
470
471 This returns a true value if the data in the indicated column con‐
472 tained any byte in the range [\x00-\x08,\x10-\x1F,\x7F-\xFF]
473
474 status
475 $status = $csv->status ();
476
477 This object function returns success (or failure) of "combine ()"
478 or "parse ()", whichever was called more recently.
479
480 error_input
481 $bad_argument = $csv->error_input ();
482
483 This object function returns the erroneous argument (if it exists)
484 of "combine ()" or "parse ()", whichever was called more recently.
485
486 error_diag
487 $csv->error_diag ();
488 $error_code = 0 + $csv->error_diag ();
489 $error_str = "" . $csv->error_diag ();
490 ($cde, $str) = $csv->error_diag ();
491
492 If (and only if) an error occured, this function returns the diag‐
493 nostics of that error.
494
495 If called in void context, it will print the internal error code
496 and the associated error message to STDERR.
497
498 If called in list context, it will return the error code and the
499 error message in that order.
500
501 If called in scalar context, it will return the diagnostics in a
502 single scalar, a-la $!. It will contain the error code in numeric
503 context, and the diagnostics message in string context.
504
506 Combine (...)
507 Parse (...)
508
509 The arguments to these two internal functions are deliberately not
510 described or documented to enable the module author(s) to change it
511 when they feel the need for it and using them is highly discouraged as
512 the API may change in future releases.
513
515 An example for creating CSV files:
516
517 use Text::CSV_XS;
518
519 my $csv = Text::CSV_XS->new;
520
521 open my $csv_fh, ">", "hello.csv" or die "hello.csv: $!";
522
523 my @sample_input_fields = (
524 'You said, "Hello!"', 5.67,
525 '"Surely"', '', '3.14159');
526 if ($csv->combine (@sample_input_fields)) {
527 my $string = $csv->string;
528 print $csv_fh "$string\n";
529 }
530 else {
531 my $err = $csv->error_input;
532 print "combine () failed on argument: ", $err, "\n";
533 }
534 close $csv_fh;
535
536 An example for parsing CSV lines:
537
538 use Text::CSV_XS;
539
540 my $csv = Text::CSV_XS->new ({ keep_meta_info => 1, binary => 1 });
541
542 my $sample_input_string =
543 qq{"I said, ""Hi!""",Yes,"",2.34,,"1.09","\x{20ac}",};
544 if ($csv->parse ($sample_input_string)) {
545 my @field = $csv->fields;
546 foreach my $col (0 .. $#field) {
547 my $quo = $csv->is_quoted ($col) ? $csv->{quote_char} : "";
548 printf "%2d: %s%s%s\n", $col, $quo, $field[$col], $quo;
549 }
550 }
551 else {
552 my $err = $csv->error_input;
553 print STDERR "parse () failed on argument: ", $err, "\n";
554 $csv->error_diag ();
555 }
556
558 More Errors & Warnings
559 At current, it is hard to tell where or why an error occured (if at
560 all). New extensions ought to be clear and concise in reporting what
561 error occurred where and why, and possibly also tell a remedy to the
562 problem. error_diag is a (very) good start, but there is more work to
563 be done here.
564
565 Basic calls should croak or warn on illegal parameters. Errors should
566 be documented.
567
568 eol
569 Discuss an option to make the eol honor the $/ setting. Maybe
570
571 my $csv = Text::CSV_XS->new ({ eol => $/ });
572
573 is already enough, and new options only make things less opaque.
574
575 setting meta info
576 Future extensions might include extending the "meta_info ()",
577 "is_quoted ()", and "is_binary ()" to accept setting these flags for
578 fields, so you can specify which fields are quoted in the combine
579 ()/string () combination.
580
581 $csv->meta_info (0, 1, 1, 3, 0, 0);
582 $csv->is_quoted (3, 1);
583
584 parse returning undefined fields
585 Adding an option that enables the parser to distinguish between empty
586 fields and undefined fields, like
587
588 $csv->always_quote (1);
589 $csv->allow_undef (1);
590 $csv->parse (qq{,"",1,"2",,""});
591 my @fld = $csv->fields ();
592
593 Then would return (undef, "", "1", "2", undef, "") in @fld, instead
594 of the current ("", "", "1", "2", "", "").
595
596 combined methods
597 Requests for adding means (methods) that combine "combine ()" and
598 "string ()" in a single call will not be honored. Likewise for "parse
599 ()" and "fields ()". Given the trouble with embedded newlines, using
600 "getline ()" and "print ()" instead is the prefered way to go.
601
602 Unicode
603 Make "parse ()" and "combine ()" do the right thing for Unicode
604 (UTF-8) if requested. See t/50_utf8.t. More complicated, but evenly
605 important, also for "getline ()" and "print ()".
606
607 Probably the best way to do this is to make a subclass
608 Text::CSV_XS::Encoded that can be passed the required encoding and
609 then behaves transparently (but slower).
610
611 Double double quotes
612 There seem to be applications around that write their dates like
613
614 1,4,""12/11/2004"",4,1
615
616 If we would support that, probably through allow_double_quoted Defi‐
617 nitely belongs in t/65_allow.t
618
619 Parse the whole file at once
620 Implement a new methods that enables the parsing of a complete file
621 at once, returning a lis of hashes. Possible extension to this could
622 be to enable a column selection on the call:
623
624 my @AoH = $csv->parse_file ($filename, { cols => [ 1, 4..8, 12 ]});
625
626 Returning something like
627
628 [ { fields => [ 1, 2, "foo", 4.5, undef, "", 8 ],
629 flags => [ ... ],
630 errors => [ ... ],
631 },
632 { fields => [ ... ],
633 .
634 .
635 },
636 ]
637
638 EBCDIC
639 The hard-coding of characters and character ranges makes this module
640 unusable on EBCDIC system. Using some #ifdef structure could enable
641 these again without loosing speed. Testing would be the hard part.
642
644 No guarantees, but this is what I have in mind right now:
645
646 0.31
647 - croak / carp
648 - error cause, check if error_diag () is enough
649 - return undef
650 - DIAGNOSTICS setction in pod to *describe* the errors
651
652 0.32
653 - allow_double_quoted
654 - Text::CSV_XS::Encoded (maybe)
655
656 0.33
657 - csv2csv - a script to regenerate a CSV file to follow standards
658 - EBCDIC support
659
661 Still under construction ...
662
663 If an error occured, $csv->error_diag () can be used to get more infor‐
664 mation on the cause of the failure. Note that for speed reasons, the
665 internal value is never cleared on success, so using the value returned
666 by error_diag () in normal cases - when no error occured - may cause
667 unexpected results.
668
669 Currently these errors are available:
670
671 1001 "sep_char is equal to quote_char or escape_char"
672 2010 "ECR - QUO char inside quotes followed by CR not part of EOL"
673 2011 "ECR - Characters after end of quoted field"
674 2012 "EOF - End of data in parsing input stream"
675 2021 "EIQ - NL char inside quotes, binary off"
676 2022 "EIQ - CR char inside quotes, binary off"
677 2023 "EIQ - QUO ..."
678 2024 "EIQ - EOF cannot be escaped, not even inside quotes"
679 2025 "EIQ - Loose unescaped escape"
680 2026 "EIQ - Binary character inside quoted field, binary off"
681 2027 "EIQ - Quoted field not terminated"
682 2030 "EIF - NL char inside unquoted verbatim, binary off"
683 2031 "EIF - CR char is first char of field, not part of EOL"
684 2032 "EIF - CR char inside unquoted, not part of EOL"
685 2033 "EIF - QUO, QUO != ESC, binary off"
686 2034 "EIF - Loose unescaped quote"
687 2035 "EIF - Escaped EOF in unquoted field"
688 2036 "EIF - ESC error"
689 2037 "EIF - Binary character in unquoted field, binary off"
690 2110 "ECB - Binary character in Combine, binary off"
691
693 perl(1), IO::File(3), L{IO::Handle(3)>, IO::Wrap(3), Text::CSV(3),
694 Text::CSV_PP(3). and Spreadsheet::Read(3).
695
697 Alan Citterman <alan@mfgrtl.com> wrote the original Perl module. Please
698 don't send mail concerning Text::CSV_XS to Alan, as he's not involved
699 in the C part which is now the main part of the module.
700
701 Jochen Wiedmann <joe@ispsoft.de> rewrote the encoding and decoding in C
702 by implementing a simple finite-state machine and added the variable
703 quote, escape and separator characters, the binary mode and the print
704 and getline methods. See ChangeLog releases 0.10 through 0.23.
705
706 H.Merijn Brand <h.m.brand@xs4all.nl> cleaned up the code, added the
707 field flags methods, wrote the major part of the test suite, completed
708 the documentation, fixed some RT bugs. See ChangeLog releases 0.25 and
709 on.
710
712 Copyright (C) 2007-2007 H.Merijn Brand for PROCURA B.V. Copyright (C)
713 1998-2001 Jochen Wiedmann. All rights reserved. Portions Copyright (C)
714 1997 Alan Citterman. All rights reserved.
715
716 This library is free software; you can redistribute it and/or modify it
717 under the same terms as Perl itself.
718
719
720
721perl v5.8.8 2007-06-21 CSV_XS(3)