[libtext-recordparser-perl] 01/01: Imported Upstream version 1.6.3
Salvatore Bonaccorso
carnil at debian.org
Sat Aug 10 14:51:53 UTC 2013
This is an automated email from the git hooks/post-receive script.
carnil pushed a commit to annotated tag upstream/1.6.3
in repository libtext-recordparser-perl.
commit 8469b318b2325957551cce8a30874f646926abe0
Author: Salvatore Bonaccorso <carnil at debian.org>
Date: Sat Aug 10 16:29:35 2013 +0200
Imported Upstream version 1.6.3
---
Build.PL | 49 ++++-
Changes | 8 +
INSTALL | 4 +-
MANIFEST | 2 +-
META.json | 35 ++--
META.yml | 15 +-
README | 430 ------------------------------------------
README.md | 466 ++++++++++++++++++++++++++++++++++++++++++++++
bin/tablify | 21 ++-
lib/Text/RecordParser.pm | 6 +-
10 files changed, 574 insertions(+), 462 deletions(-)
diff --git a/Build.PL b/Build.PL
index 3488ec0..459ad3d 100644
--- a/Build.PL
+++ b/Build.PL
@@ -2,27 +2,72 @@ use strict;
use Module::Build;
-my $build = Module::Build->new(
+my $class = Module::Build->subclass(
+ class => 'TRP::Builder',
+ code => q*
+ sub ACTION_docs {
+ require 'Pod/Readme.pm';
+ require 'Pod/Select.pm';
+ require 'Pod/Markdown.pm';
+
+ my $self = shift;
+ my $pod = 'README.pod';
+
+ Pod::Select::podselect({ -output => $pod }, 'lib/Text/RecordParser.pm');
+
+ my $parser = Pod::Readme->new();
+
+ $parser->parse_from_file('README.pod', 'README');
+
+ open my $pod_fh, '<', $pod or die "Can't read POD '$pod'";
+ open my $md_fh , '>', 'README.md' or die "Can't write README.md";
+
+ my $md = Pod::Markdown->new;
+ $md->parse_from_filehandle($pod_fh);
+ print $md_fh $md->as_markdown;
+
+ close $pod_fh;
+ close $md_fh;
+
+ return $self->SUPER::ACTION_docs;
+ }
+ *
+);
+
+my $build = $class->new(
module_name => 'Text::RecordParser',
dist_author => 'Ken Youens-Clark <kclark at cpan.org>',
dist_version_from => 'lib/Text/RecordParser.pm',
add_to_cleanup => [ '$(DISTNAME)-$(VERSION).tar.gz' ],
- create_readme => 1,
dist_abstract => 'Parse record-oriented data in a text file',
license => 'gpl',
script_files => ['bin/tablify', 'bin/tabmerge', 'bin/tab2graph'],
+
+ configure_requires => {
+ 'Module::Build' => 0.40,
+ 'Pod::Markdown' => 0,
+ 'Pod::Readme' => 0,
+ 'Pod::Select' => 0,
+ },
+
requires => {
'IO::Scalar' => 0,
'Class::Accessor' => 0,
'Readonly' => 0,
'List::Util' => 0,
'List::MoreUtils' => 0,
+ 'Text::Autoformat' => 0,
'version' => 0,
},
+
build_requires => {
'Test::More' => 0,
'Test::Exception' => 0,
+ 'Pod::Readme' => 0,
+ 'Pod::Select' => 0,
+ 'Pod::Markdown' => 0,
},
+
recommends => {
'Readonly::XS' => 0,
'Text::TabularDisplay' => '1.22',
diff --git a/Changes b/Changes
index b9fff54..fba5ec1 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,11 @@
+1.6.3 August 9 2012
+
+- Fixed bug in "Build.PL" regarding "podselect," updated Build.PL reqs
+
+1.6.2 August 9 2012
+
+- Made output of "tablify -v" prettier using Text::Autoformat
+
1.6.1 April 30 2013
- Removed a debug statement
diff --git a/INSTALL b/INSTALL
index a0c08e2..80ea377 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,4 +1,4 @@
$ perl Build.PL
+$ sudo cpanm --installdeps .
$ ./Build test
-$ su
-# ./Build install
+$ sudo ./Build install
diff --git a/MANIFEST b/MANIFEST
index 705db91..8fc4c4c 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -10,7 +10,7 @@ lib/Text/RecordParser/Object.pm
lib/Text/RecordParser/Tab.pm
Makefile.PL
MANIFEST This list of files
-README
+README.md
t/00-pipe.t
t/01-new.t
t/02-filename-fh.t
diff --git a/META.json b/META.json
index fa454ea..ae93508 100644
--- a/META.json
+++ b/META.json
@@ -4,7 +4,7 @@
"Ken Youens-Clark <kclark at cpan.org>"
],
"dynamic_config" : 1,
- "generated_by" : "Module::Build version 0.4003, CPAN::Meta::Converter version 2.112150",
+ "generated_by" : "Module::Build version 0.4007, CPAN::Meta::Converter version 2.120921",
"license" : [
"open_source"
],
@@ -16,35 +16,42 @@
"prereqs" : {
"build" : {
"requires" : {
- "Test::Exception" : 0,
- "Test::More" : 0
+ "Pod::Markdown" : "0",
+ "Pod::Readme" : "0",
+ "Pod::Select" : "0",
+ "Test::Exception" : "0",
+ "Test::More" : "0"
}
},
"configure" : {
"requires" : {
- "Module::Build" : "0.40"
+ "Module::Build" : "0.4",
+ "Pod::Markdown" : "0",
+ "Pod::Readme" : "0",
+ "Pod::Select" : "0"
}
},
"runtime" : {
"recommends" : {
- "GraphViz" : 0,
- "Readonly::XS" : 0,
+ "GraphViz" : "0",
+ "Readonly::XS" : "0",
"Text::TabularDisplay" : "1.22"
},
"requires" : {
- "Class::Accessor" : 0,
- "IO::Scalar" : 0,
- "List::MoreUtils" : 0,
- "List::Util" : 0,
- "Readonly" : 0,
- "version" : 0
+ "Class::Accessor" : "0",
+ "IO::Scalar" : "0",
+ "List::MoreUtils" : "0",
+ "List::Util" : "0",
+ "Readonly" : "0",
+ "Text::Autoformat" : "0",
+ "version" : "0"
}
}
},
"provides" : {
"Text::RecordParser" : {
"file" : "lib/Text/RecordParser.pm",
- "version" : "v1.6.1"
+ "version" : "v1.6.3"
},
"Text::RecordParser::Object" : {
"file" : "lib/Text/RecordParser/Object.pm",
@@ -61,5 +68,5 @@
"http://opensource.org/licenses/gpl-license.php"
]
},
- "version" : "v1.6.1"
+ "version" : "v1.6.3"
}
diff --git a/META.yml b/META.yml
index be4d30b..c936255 100644
--- a/META.yml
+++ b/META.yml
@@ -3,12 +3,18 @@ abstract: 'Parse record-oriented data in a text file'
author:
- 'Ken Youens-Clark <kclark at cpan.org>'
build_requires:
+ Pod::Markdown: 0
+ Pod::Readme: 0
+ Pod::Select: 0
Test::Exception: 0
Test::More: 0
configure_requires:
- Module::Build: 0.40
+ Module::Build: 0.4
+ Pod::Markdown: 0
+ Pod::Readme: 0
+ Pod::Select: 0
dynamic_config: 1
-generated_by: 'Module::Build version 0.4003, CPAN::Meta::Converter version 2.112150'
+generated_by: 'Module::Build version 0.4007, CPAN::Meta::Converter version 2.120921'
license: open_source
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -17,7 +23,7 @@ name: Text-RecordParser
provides:
Text::RecordParser:
file: lib/Text/RecordParser.pm
- version: v1.6.1
+ version: v1.6.3
Text::RecordParser::Object:
file: lib/Text/RecordParser/Object.pm
version: v1.4.0
@@ -34,7 +40,8 @@ requires:
List::MoreUtils: 0
List::Util: 0
Readonly: 0
+ Text::Autoformat: 0
version: 0
resources:
license: http://opensource.org/licenses/gpl-license.php
-version: v1.6.1
+version: v1.6.3
diff --git a/README b/README
deleted file mode 100644
index 3332fd1..0000000
--- a/README
+++ /dev/null
@@ -1,430 +0,0 @@
-NAME
- Text::RecordParser - read record-oriented files
-
-SYNOPSIS
- use Text::RecordParser;
-
- # use default record (\n) and field (,) separators
- my $p = Text::RecordParser->new( $file );
-
- # or be explicit
- my $p = Text::RecordParser->new({
- filename => $file,
- field_separator => "\t",
- });
-
- $p->filename('foo.csv');
-
- # Split records on two newlines
- $p->record_separator("\n\n");
-
- # Split fields on tabs
- $p->field_separator("\t");
-
- # Skip lines beginning with hashes
- $p->comment( qr/^#/ );
-
- # Trim whitespace
- $p->trim(1);
-
- # Use the fields in the first line as column names
- $p->bind_header;
-
- # Get a list of the header fields (in order)
- my @columns = $p->field_list;
-
- # Extract a particular field from the next row
- my ( $name, $age ) = $p->extract( qw[name age] );
-
- # Return all the fields from the next row
- my @fields = $p->fetchrow_array;
-
- # Define a field alias
- $p->set_field_alias( name => 'handle' );
-
- # Return all the fields from the next row as a hashref
- my $record = $p->fetchrow_hashref;
- print $record->{'name'};
- # or
- print $record->{'handle'};
-
- # Return the record as an object with fields as accessors
- my $object = $p->fetchrow_object;
- print $object->name; # or $object->handle;
-
- # Get all data as arrayref of arrayrefs
- my $data = $p->fetchall_arrayref;
-
- # Get all data as arrayref of hashrefs
- my $data = $p->fetchall_arrayref( { Columns => {} } );
-
- # Get all data as hashref of hashrefs
- my $data = $p->fetchall_hashref('name');
-
-DESCRIPTION
- This module is for reading record-oriented data in a delimited text
- file. The most common example have records separated by newlines and
- fields separated by commas or tabs, but this module aims to provide a
- consistent interface for handling sequential records in a file however
- they may be delimited. Typically this data lists the fields in the first
- line of the file, in which case you should call "bind_header" to bind
- the field name (or not, and it will be called implicitly). If the first
- line contains data, you can still bind your own field names via
- "bind_fields". Either way, you can then use many methods to get at the
- data as arrays or hashes.
-
-METHODS
- new
- This is the object constructor. It takes a hash (or hashref) of
- arguments. Each argument can also be set through the method of the same
- name.
-
- * filename
-
- The path to the file being read. If the filename is passed and the
- fh is not, then it will open a filehandle on that file and sets "fh"
- accordingly.
-
- * comment
-
- A compiled regular expression identifying comment lines that should
- be skipped.
-
- * data
-
- The data to read.
-
- * fh
-
- The filehandle of the file to read.
-
- * field_separator | fs
-
- The field separator (default is comma).
-
- * record_separator | rs
-
- The record separator (default is newline).
-
- * field_filter
-
- A callback applied to all the fields as they are read.
-
- * header_filter
-
- A callback applied to the column names.
-
- * trim
-
- Boolean to enable trimming of leading and trailing whitespace from
- fields (useful if splitting on whitespace only).
-
- See methods for each argument name for more information.
-
- Alternately, if you supply a single argument to "new", it will be
- treated as the "filename" argument.
-
- bind_fields
- $p->bind_fields( qw[ name rank serial_number ] );
-
- Takes an array of field names and memorizes the field positions for
- later use. If the input file has no header line but you still wish to
- retrieve the fields by name (or even if you want to call "bind_header"
- and then give your own field names), simply pass in the an array of
- field names you wish to use.
-
- Pass in an empty array reference to unset:
-
- $p->bind_field( [] ); # unsets fields
-
- bind_header
- $p->bind_header;
- my $name = $p->extract('name');
-
- Takes the fields from the next row under the cursor and assigns the
- field names to the values. Usually you would call this immediately after
- opening the file in order to bind the field names in the first row.
-
- comment
- $p->comment( qr/^#/ ); # Perl-style comments
- $p->comment( qr/^--/ ); # SQL-style comments
-
- Takes a regex to apply to a record to see if it looks like a comment to
- skip.
-
- data
- $p->data( $string );
- $p->data( \$string );
- $p->data( @lines );
- $p->data( [$line1, $line2, $line3] );
- $p->data( IO::File->new('<data') );
-
- Allows a scalar, scalar reference, glob, array, or array reference as
- the thing to read instead of a file handle.
-
- It's not advised to pass a filehandle to "data" as it will read the
- entire contents of the file rather than one line at a time if you set it
- via "fh".
-
- extract
- my ( $foo, $bar, $baz ) = $p->extract( qw[ foo bar baz ] );
-
- Extracts a list of fields out of the last row read. The field names must
- correspond to the field names bound either via "bind_fields" or
- "bind_header".
-
- fetchrow_array
- my @values = $p->fetchrow_array;
-
- Reads a row from the file and returns an array or array reference of the
- fields.
-
- fetchrow_hashref
- my $record = $p->fetchrow_hashref;
- print "Name = ", $record->{'name'}, "\n";
-
- Reads a line of the file and returns it as a hash reference. The keys of
- the hashref are the field names bound via "bind_fields" or
- "bind_header". If you do not bind fields prior to calling this method,
- the "bind_header" method will be implicitly called for you.
-
- fetchrow_object
- while ( my $object = $p->fetchrow_object ) {
- my $id = $object->id;
- my $name = $object->naem; # <-- this will throw a runtime error
- }
-
- This will return the next data record as a Text::RecordParser::Object
- object that has read-only accessor methods of the field names and any
- aliases. This allows you to enforce field names, further helping ensure
- that your code is reading the input file correctly. That is, if you are
- using the "fetchrow_hashref" method to read each line, you may misspell
- the hash key and introduce a bug in your code. With this method, Perl
- will throw an error if you attempt to read a field not defined in the
- file's headers. Additionally, any defined field aliases will be created
- as additional accessor methods.
-
- fetchall_arrayref
- my $records = $p->fetchall_arrayref;
- for my $record ( @$records ) {
- print "Name = ", $record->[0], "\n";
- }
-
- my $records = $p->fetchall_arrayref( { Columns => {} } );
- for my $record ( @$records ) {
- print "Name = ", $record->{'name'}, "\n";
- }
-
- Like DBI's fetchall_arrayref, returns an arrayref of arrayrefs. Also
- accepts optional "{ Columns => {} }" argument to return an arrayref of
- hashrefs.
-
- fetchall_hashref
- my $records = $p->fetchall_hashref('id');
- for my $id ( keys %$records ) {
- my $record = $records->{ $id };
- print "Name = ", $record->{'name'}, "\n";
- }
-
- Like DBI's fetchall_hashref, this returns a hash reference of hash
- references. The keys of the top-level hashref are the field values of
- the field argument you supply. The field name you supply can be a field
- created by a "field_compute".
-
- fh
- open my $fh, '<', $file or die $!;
- $p->fh( $fh );
-
- Gets or sets the filehandle of the file being read.
-
- field_compute
- A callback applied to the fields identified by position (or field name
- if "bind_fields" or "bind_header" was called).
-
- The callback will be passed two arguments:
-
- 1 The current field
-
- 2 A reference to all the other fields, either as an array or hash
- reference, depending on the method which you called.
-
- If data looks like this:
-
- parent children
- Mike Greg,Peter,Bobby
- Carol Marcia,Jane,Cindy
-
- You could split the "children" field into an array reference with the
- values like so:
-
- $p->field_compute( 'children', sub { [ split /,/, shift() ] } );
-
- The field position or name doesn't actually have to exist, which means
- you could create new, computed fields on-the-fly. E.g., if you data
- looks like this:
-
- 1,3,5
- 32,4,1
- 9,5,4
-
- You could write a field_compute like this:
-
- $p->field_compute( 3,
- sub {
- my ( $cur, $others ) = @_;
- my $sum;
- $sum += $_ for @$others;
- return $sum;
- }
- );
-
- Field "3" will be created as the sum of the other fields. This allows
- you to further write:
-
- my $data = $p->fetchall_arrayref;
- for my $rec ( @$data ) {
- print "$rec->[0] + $rec->[1] + $rec->[2] = $rec->[3]\n";
- }
-
- Prints:
-
- 1 + 3 + 5 = 9
- 32 + 4 + 1 = 37
- 9 + 5 + 4 = 18
-
- field_filter
- $p->field_filter( sub { $_ = shift; uc(lc($_)) } );
-
- A callback which is applied to each field. The callback will be passed
- the current value of the field. Whatever is passed back will become the
- new value of the field. The above example capitalizes field values. To
- unset the filter, pass in the empty string.
-
- field_list
- $p->bind_fields( qw[ foo bar baz ] );
- my @fields = $p->field_list;
- print join ', ', @fields; # prints "foo, bar, baz"
-
- Returns the fields bound via "bind_fields" (or "bind_header").
-
- field_positions
- my %positions = $p->field_positions;
-
- Returns a hash of the fields and their positions bound via "bind_fields"
- (or "bind_header"). Mostly for internal use.
-
- field_separator
- $p->field_separator("\t"); # splits fields on tabs
- $p->field_separator('::'); # splits fields on double colons
- $p->field_separator(qr/\s+/); # splits fields on whitespace
- my $sep = $p->field_separator; # returns the current separator
-
- Gets and sets the token to use as the field delimiter. Regular
- expressions can be specified using qr//. If not specified, it will take
- a guess based on the filename extension ("comma" for ".txt," ".dat," or
- ".csv"; "tab" for ".tab"). The default is a comma.
-
- filename
- $p->filename('/path/to/file.dat');
-
- Gets or sets the complete path to the file to be read. If a file is
- already opened, then the handle on it will be closed and a new one
- opened on the new file.
-
- get_field_aliases
- my @aliases = $p->get_field_aliases('name');
-
- Allows you to define alternate names for fields, e.g., sometimes your
- input file calls city "town" or "township," sometimes a file uses
- "Moniker" instead of "name."
-
- header_filter
- $p->header_filter( sub { $_ = shift; s/\s+/_/g; lc $_ } );
-
- A callback applied to column header names. The callback will be passed
- the current value of the header. Whatever is returned will become the
- new value of the header. The above example collapses spaces into a
- single underscore and lowercases the letters. To unset a filter, pass in
- the empty string.
-
- record_separator
- $p->record_separator("\n//\n");
- $p->field_separator("\n");
-
- Gets and sets the token to use as the record separator. The default is a
- newline ("\n").
-
- The above example would read a file that looks like this:
-
- field1
- field2
- field3
- //
- data1
- data2
- data3
- //
-
- set_field_alias
- $p->set_field_alias({
- name => 'Moniker,handle', # comma-separated string
- city => [ qw( town township ) ], # or anonymous arrayref
- });
-
- Allows you to define alternate names for fields, e.g., sometimes your
- input file calls city "town" or "township," sometimes a file uses
- "Moniker" instead of "name."
-
- trim
- my $trim_value = $p->trim(1);
-
- Provide "true" argument to remove leading and trailing whitespace from
- fields. Use a "false" argument to disable.
-
-AUTHOR
- Ken Youens-Clark <kclark at cpan.org>
-
-CREDITS
- Thanks to the following:
-
- * Benjamin Tilly
-
- For Text::xSV, the inspirado for this module
-
- * Tim Bunce et al.
-
- For DBI, from which many of the methods were shamelessly stolen
-
- * Tom Aldcroft
-
- For contributing code to make it easy to parse whitespace-delimited
- data
-
- * Liya Ren
-
- For catching the column-ordering error when parsing with
- "no-headers"
-
- * Sharon Wei
-
- For catching bug in "extract" that sets up infinite loops
-
- * Lars Thegler
-
- For bug report on missing "script_files" arg in Build.PL
-
-BUGS
- None known. Please use http://rt.cpan.org/ for reporting bugs.
-
-LICENSE AND COPYRIGHT
- Copyright (C) 2006-10 Ken Youens-Clark. All rights reserved.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the
- Free Software Foundation; version 2.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
- Public License for more details.
-
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..23d8782
--- /dev/null
+++ b/README.md
@@ -0,0 +1,466 @@
+# NAME
+
+Text::RecordParser - read record-oriented files
+
+# SYNOPSIS
+
+ use Text::RecordParser;
+
+ # use default record (\n) and field (,) separators
+ my $p = Text::RecordParser->new( $file );
+
+ # or be explicit
+ my $p = Text::RecordParser->new({
+ filename => $file,
+ field_separator => "\t",
+ });
+
+ $p->filename('foo.csv');
+
+ # Split records on two newlines
+ $p->record_separator("\n\n");
+
+ # Split fields on tabs
+ $p->field_separator("\t");
+
+ # Skip lines beginning with hashes
+ $p->comment( qr/^#/ );
+
+ # Trim whitespace
+ $p->trim(1);
+
+ # Use the fields in the first line as column names
+ $p->bind_header;
+
+ # Get a list of the header fields (in order)
+ my @columns = $p->field_list;
+
+ # Extract a particular field from the next row
+ my ( $name, $age ) = $p->extract( qw[name age] );
+
+ # Return all the fields from the next row
+ my @fields = $p->fetchrow_array;
+
+ # Define a field alias
+ $p->set_field_alias( name => 'handle' );
+
+ # Return all the fields from the next row as a hashref
+ my $record = $p->fetchrow_hashref;
+ print $record->{'name'};
+ # or
+ print $record->{'handle'};
+
+ # Return the record as an object with fields as accessors
+ my $object = $p->fetchrow_object;
+ print $object->name; # or $object->handle;
+
+ # Get all data as arrayref of arrayrefs
+ my $data = $p->fetchall_arrayref;
+
+ # Get all data as arrayref of hashrefs
+ my $data = $p->fetchall_arrayref( { Columns => {} } );
+
+ # Get all data as hashref of hashrefs
+ my $data = $p->fetchall_hashref('name');
+
+# DESCRIPTION
+
+This module is for reading record-oriented data in a delimited text
+file. The most common example have records separated by newlines and
+fields separated by commas or tabs, but this module aims to provide a
+consistent interface for handling sequential records in a file however
+they may be delimited. Typically this data lists the fields in the
+first line of the file, in which case you should call `bind_header`
+to bind the field name (or not, and it will be called implicitly). If
+the first line contains data, you can still bind your own field names
+via `bind_fields`. Either way, you can then use many methods to get
+at the data as arrays or hashes.
+
+# METHODS
+
+## new
+
+This is the object constructor. It takes a hash (or hashref) of
+arguments. Each argument can also be set through the method of the
+same name.
+
+- filename
+
+ The path to the file being read. If the filename is passed and the fh
+ is not, then it will open a filehandle on that file and sets `fh`
+ accordingly.
+
+- comment
+
+ A compiled regular expression identifying comment lines that should
+ be skipped.
+
+- data
+
+ The data to read.
+
+- fh
+
+ The filehandle of the file to read.
+
+- field\_separator | fs
+
+ The field separator (default is comma).
+
+- record\_separator | rs
+
+ The record separator (default is newline).
+
+- field\_filter
+
+ A callback applied to all the fields as they are read.
+
+- header\_filter
+
+ A callback applied to the column names.
+
+- trim
+
+ Boolean to enable trimming of leading and trailing whitespace from fields
+ (useful if splitting on whitespace only).
+
+See methods for each argument name for more information.
+
+Alternately, if you supply a single argument to `new`, it will be
+treated as the `filename` argument.
+
+## bind\_fields
+
+ $p->bind_fields( qw[ name rank serial_number ] );
+
+Takes an array of field names and memorizes the field positions for
+later use. If the input file has no header line but you still wish to
+retrieve the fields by name (or even if you want to call
+`bind_header` and then give your own field names), simply pass in the
+an array of field names you wish to use.
+
+Pass in an empty array reference to unset:
+
+ $p->bind_field( [] ); # unsets fields
+
+## bind\_header
+
+ $p->bind_header;
+ my $name = $p->extract('name');
+
+Takes the fields from the next row under the cursor and assigns the field
+names to the values. Usually you would call this immediately after
+opening the file in order to bind the field names in the first row.
+
+## comment
+
+ $p->comment( qr/^#/ ); # Perl-style comments
+ $p->comment( qr/^--/ ); # SQL-style comments
+
+Takes a regex to apply to a record to see if it looks like a comment
+to skip.
+
+## data
+
+ $p->data( $string );
+ $p->data( \$string );
+ $p->data( @lines );
+ $p->data( [$line1, $line2, $line3] );
+ $p->data( IO::File->new('<data') );
+
+Allows a scalar, scalar reference, glob, array, or array reference as
+the thing to read instead of a file handle.
+
+It's not advised to pass a filehandle to `data` as it will read the
+entire contents of the file rather than one line at a time if you set
+it via `fh`.
+
+## extract
+
+ my ( $foo, $bar, $baz ) = $p->extract( qw[ foo bar baz ] );
+
+Extracts a list of fields out of the last row read. The field names
+must correspond to the field names bound either via `bind_fields` or
+`bind_header`.
+
+## fetchrow\_array
+
+ my @values = $p->fetchrow_array;
+
+Reads a row from the file and returns an array or array reference
+of the fields.
+
+## fetchrow\_hashref
+
+ my $record = $p->fetchrow_hashref;
+ print "Name = ", $record->{'name'}, "\n";
+
+Reads a line of the file and returns it as a hash reference. The keys
+of the hashref are the field names bound via `bind_fields` or
+`bind_header`. If you do not bind fields prior to calling this method,
+the `bind_header` method will be implicitly called for you.
+
+## fetchrow\_object
+
+ while ( my $object = $p->fetchrow_object ) {
+ my $id = $object->id;
+ my $name = $object->naem; # <-- this will throw a runtime error
+ }
+
+This will return the next data record as a Text::RecordParser::Object
+object that has read-only accessor methods of the field names and any
+aliases. This allows you to enforce field names, further helping
+ensure that your code is reading the input file correctly. That is,
+if you are using the "fetchrow\_hashref" method to read each line, you
+may misspell the hash key and introduce a bug in your code. With this
+method, Perl will throw an error if you attempt to read a field not
+defined in the file's headers. Additionally, any defined field
+aliases will be created as additional accessor methods.
+
+## fetchall\_arrayref
+
+ my $records = $p->fetchall_arrayref;
+ for my $record ( @$records ) {
+ print "Name = ", $record->[0], "\n";
+ }
+
+ my $records = $p->fetchall_arrayref( { Columns => {} } );
+ for my $record ( @$records ) {
+ print "Name = ", $record->{'name'}, "\n";
+ }
+
+Like DBI's fetchall\_arrayref, returns an arrayref of arrayrefs. Also
+accepts optional "{ Columns => {} }" argument to return an arrayref of
+hashrefs.
+
+## fetchall\_hashref
+
+ my $records = $p->fetchall_hashref('id');
+ for my $id ( keys %$records ) {
+ my $record = $records->{ $id };
+ print "Name = ", $record->{'name'}, "\n";
+ }
+
+Like DBI's fetchall\_hashref, this returns a hash reference of hash
+references. The keys of the top-level hashref are the field values
+of the field argument you supply. The field name you supply can be
+a field created by a `field_compute`.
+
+## fh
+
+ open my $fh, '<', $file or die $!;
+ $p->fh( $fh );
+
+Gets or sets the filehandle of the file being read.
+
+## field\_compute
+
+A callback applied to the fields identified by position (or field
+name if `bind_fields` or `bind_header` was called).
+
+The callback will be passed two arguments:
+
+- 1
+
+ The current field
+
+- 2
+
+ A reference to all the other fields, either as an array or hash
+ reference, depending on the method which you called.
+
+If data looks like this:
+
+ parent children
+ Mike Greg,Peter,Bobby
+ Carol Marcia,Jane,Cindy
+
+You could split the "children" field into an array reference with the
+values like so:
+
+ $p->field_compute( 'children', sub { [ split /,/, shift() ] } );
+
+The field position or name doesn't actually have to exist, which means
+you could create new, computed fields on-the-fly. E.g., if you data
+looks like this:
+
+ 1,3,5
+ 32,4,1
+ 9,5,4
+
+You could write a field\_compute like this:
+
+ $p->field_compute( 3,
+ sub {
+ my ( $cur, $others ) = @_;
+ my $sum;
+ $sum += $_ for @$others;
+ return $sum;
+ }
+ );
+
+Field "3" will be created as the sum of the other fields. This allows
+you to further write:
+
+ my $data = $p->fetchall_arrayref;
+ for my $rec ( @$data ) {
+ print "$rec->[0] + $rec->[1] + $rec->[2] = $rec->[3]\n";
+ }
+
+Prints:
+
+ 1 + 3 + 5 = 9
+ 32 + 4 + 1 = 37
+ 9 + 5 + 4 = 18
+
+## field\_filter
+
+ $p->field_filter( sub { $_ = shift; uc(lc($_)) } );
+
+A callback which is applied to each field. The callback will be
+passed the current value of the field. Whatever is passed back will
+become the new value of the field. The above example capitalizes
+field values. To unset the filter, pass in the empty string.
+
+## field\_list
+
+ $p->bind_fields( qw[ foo bar baz ] );
+ my @fields = $p->field_list;
+ print join ', ', @fields; # prints "foo, bar, baz"
+
+Returns the fields bound via `bind_fields` (or `bind_header`).
+
+## field\_positions
+
+ my %positions = $p->field_positions;
+
+Returns a hash of the fields and their positions bound via
+`bind_fields` (or `bind_header`). Mostly for internal use.
+
+## field\_separator
+
+ $p->field_separator("\t"); # splits fields on tabs
+ $p->field_separator('::'); # splits fields on double colons
+ $p->field_separator(qr/\s+/); # splits fields on whitespace
+ my $sep = $p->field_separator; # returns the current separator
+
+Gets and sets the token to use as the field delimiter. Regular
+expressions can be specified using qr//. If not specified, it will
+take a guess based on the filename extension ("comma" for ".txt,"
+".dat," or ".csv"; "tab" for ".tab"). The default is a comma.
+
+## filename
+
+ $p->filename('/path/to/file.dat');
+
+Gets or sets the complete path to the file to be read. If a file is
+already opened, then the handle on it will be closed and a new one
+opened on the new file.
+
+## get\_field\_aliases
+
+ my @aliases = $p->get_field_aliases('name');
+
+Allows you to define alternate names for fields, e.g., sometimes your
+input file calls city "town" or "township," sometimes a file uses "Moniker"
+instead of "name."
+
+## header\_filter
+
+ $p->header_filter( sub { $_ = shift; s/\s+/_/g; lc $_ } );
+
+A callback applied to column header names. The callback will be
+passed the current value of the header. Whatever is returned will
+become the new value of the header. The above example collapses
+spaces into a single underscore and lowercases the letters. To unset
+a filter, pass in the empty string.
+
+## record\_separator
+
+ $p->record_separator("\n//\n");
+ $p->field_separator("\n");
+
+Gets and sets the token to use as the record separator. The default is
+a newline ("\\n").
+
+The above example would read a file that looks like this:
+
+ field1
+ field2
+ field3
+ //
+ data1
+ data2
+ data3
+ //
+
+## set\_field\_alias
+
+ $p->set_field_alias({
+ name => 'Moniker,handle', # comma-separated string
+ city => [ qw( town township ) ], # or anonymous arrayref
+ });
+
+Allows you to define alternate names for fields, e.g., sometimes your
+input file calls city "town" or "township," sometimes a file uses "Moniker"
+instead of "name."
+
+## trim
+
+ my $trim_value = $p->trim(1);
+
+Provide "true" argument to remove leading and trailing whitespace from
+fields. Use a "false" argument to disable.
+
+# AUTHOR
+
+Ken Youens-Clark <kclark at cpan.org>
+
+# SOURCE
+
+http://github.com/kyclark/text-recordparser
+
+# CREDITS
+
+Thanks to the following:
+
+- Benjamin Tilly
+
+ For Text::xSV, the inspirado for this module
+
+- Tim Bunce et al.
+
+ For DBI, from which many of the methods were shamelessly stolen
+
+- Tom Aldcroft
+
+ For contributing code to make it easy to parse whitespace-delimited data
+
+- Liya Ren
+
+ For catching the column-ordering error when parsing with "no-headers"
+
+- Sharon Wei
+
+ For catching bug in `extract` that sets up infinite loops
+
+- Lars Thegler
+
+ For bug report on missing "script\_files" arg in Build.PL
+
+# BUGS
+
+None known. Please use http://rt.cpan.org/ for reporting bugs.
+
+# LICENSE AND COPYRIGHT
+
+Copyright (C) 2006-10 Ken Youens-Clark. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; version 2.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
diff --git a/bin/tablify b/bin/tablify
index 6858df2..0f0d65f 100755
--- a/bin/tablify
+++ b/bin/tablify
@@ -3,12 +3,12 @@
use strict;
use warnings;
use version;
-use English qw( -no_match_vars );
use File::Basename;
use Getopt::Long;
-use List::Util qw( max );
+use List::Util 'max';
use Pod::Usage;
use Readonly;
+use Text::Autoformat 'autoformat';
use Text::RecordParser;
use Text::TabularDisplay;
@@ -17,6 +17,7 @@ Readonly my $DASH => q{-};
Readonly my $EMPTY_STR => q{};
Readonly my $TAB => qq{\t};
Readonly my $NEWLINE => qq{\n};
+Readonly my $WIDTH => 78;
my $comment_start = '';
my $fs = $TAB;
@@ -54,7 +55,7 @@ if ( $help || $man_page ) {
};
if ( $show_version ) {
- my $prog = basename( $PROGRAM_NAME );
+ my $prog = basename( $0 );
print "$prog $VERSION\n";
exit 0;
}
@@ -158,8 +159,8 @@ if ( $no_headers ) {
RECORD:
while ( my @data = $p->fetchrow_array ) {
if ( !@fields ) {
- @fields = ( 0..$#data );
- @field_names = map { 'Field' . ($_+1) } @fields;
+ @fields = ( 0..$#data );
+ @field_names = map { 'Field' . ($_+1) } @fields;
$max_col_length = max( map { length $_ } @field_names );
$tab->columns( @field_names );
}
@@ -202,9 +203,13 @@ else {
printf $fh $separator, $num_records;
for my $field ( @fields ) {
next unless $field;
- printf $fh "%${max_col_length}s: %s\n",
- $field,
- defined $data->{ $field } ? $data->{ $field } : q{};
+ my $v = defined $data->{ $field } ? $data->{ $field } : q{};
+ if ( length $v > $WIDTH ) {
+ ( $v = autoformat( $v, { left => $max_col_length + 3 } ) )
+ =~ s/^\s+|\s+$//g;
+ }
+
+ printf $fh "%${max_col_length}s: %s\n", $field, $v;
}
}
else {
diff --git a/lib/Text/RecordParser.pm b/lib/Text/RecordParser.pm
index 8d50fad..4cef291 100644
--- a/lib/Text/RecordParser.pm
+++ b/lib/Text/RecordParser.pm
@@ -91,7 +91,7 @@ use List::MoreUtils qw( uniq );
use Readonly;
use Text::ParseWords qw( parse_line );
-our $VERSION = version->new('1.6.1');
+our $VERSION = version->new('1.6.3');
Readonly my $COMMA => q{,};
Readonly my $EMPTY_STR => q{};
@@ -1109,6 +1109,10 @@ fields. Use a "false" argument to disable.
Ken Youens-Clark E<lt>kclark at cpan.orgE<gt>
+=head1 SOURCE
+
+http://github.com/kyclark/text-recordparser
+
=head1 CREDITS
Thanks to the following:
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libtext-recordparser-perl.git
More information about the Pkg-perl-cvs-commits
mailing list