Finance::QIF(3pm) | User Contributed Perl Documentation | Finance::QIF(3pm) |
Finance::QIF - Parse and create Quicken Interchange Format files
use Finance::QIF; my $qif = Finance::QIF->new( file => "test.qif" ); while ( my $record = $qif->next ) { print( "Header: ", $record->{header}, "\n" ); foreach my $key ( keys %{$record} ) { next if ( $key eq "header" || $key eq "splits" || $key eq "budget" || $key eq "prices" ); print( " ", $key, ": ", $record->{$key}, "\n" ); } if ( exists( $record->{splits} ) ) { foreach my $split ( @{ $record->{splits} } ) { foreach my $key ( keys %{$split} ) { print( " Split: ", $key, ": ", $split->{$key}, "\n" ); } } } if ( exists( $record->{budget} ) ) { print(" Budget: "); foreach my $amount ( @{ $record->{budget} } ) { print( " ", $amount ); } print("\n"); } if ( exists( $record->{prices} ) ) { print(" Date Close Max Min Volume\n"); $format = " %8s %7.2f %7.2f %7.2f %-8d\n"; foreach my $price ( @{ $record->{prices} } ) { printf( $format, $price->{"date"}, $price->{"close"}, $price->{"max"}, $price->{"min"}, $price->{"volume"} ); } } }
Finance::QIF is a module for working with QIF (Quicken Interchange Format) files in Perl. This module reads QIF data records from a file passing each successive record to the caller for processing. This module also has the capability of writing QIF records to a file.
The QIF file format typically consists of a header containing a record or transaction type, followed by associated data records. Within a file there may be multiple headers. Headers are usually followed by data records, however data is not required to always follow a header.
A hash reference is returned for each record read from a file. The hash will have a "header" value which contains the header type that was read along with all supported values found for that record. If a value is not specified in the data file, the value will not exist in this hash.
No processing or validation is done on values found in files or data structures to try and convert them into appropriate types and formats. It is expected that users of this module or extensions to this module will do any additional processing or validation as required.
The following record types are currently supported by this module:
Each account record supports the following values.
Note: If this software finds unsupported record types or values in a data file a warning will be generated containing information on what unexpected value was found.
Creates a new instance of Finance::QIF. Supports the following initializing values.
my $qif = Finance::QIF->new( file => "myfile", debug => 1 );
If the file is specified it will be opened on new.
my $in = Finance::QIF->new( file => "myfile" ); OR my $in = Finance::QIF->new( file => [ "myfile", "<:crlf" ] );
For output files, be sure to open the file in write mode. For example:
my $out = Finance::QIF->new( file => ">myfile" );
my $in = Finance::QIF->new( record_separator => "\012" );
Note: For MacOS X it will most likely be necessary to change this to "\015". Quicken on MacOS X generates files with "\015" as the separator which is typical of Mac however the native perl in MacOS X is unix based and uses the default unix separator which is "\012". See "autodetect" for another option.
my $in = Finance::QIF->new( autodetect => 1 );
Perl uses $/ to define line separators for text files. Perl sets this value according to the OS perl is running on:
Windows="\015\012" Mac="\015" Unix="\012"
In many cases you may find yourself with text files that do not match the OS. In these cases Finance::QIF by default will not process that QIF file correctly. This feature is an attempt to help with the most common cases of having the wrong text file for the OS Finance::QIF is running on.
This feature depends on being able to seek to the end of the file and reading the last 2 characters to determine the proper separator. If a seek can not be performed or the last 2 characters are not a proper separator the record_separator will default to $/ or the value passed in. If a valid record_separator is found then it will be set according to what was in the file.
This code requires a file use a consistent line separator. If you find your self dealing with unusual files containing mixed separators you need to first Normalize the file to a consistent separator.
Normalizing a text file to have a consistent line separator is done in modules like File::LocalizeNewlines or Template::Parser::LocalizeNewlines so if you are having issues with trying to process poorly formated text files look at preprocessing them with something like those before passing on to Finance::QIF.
my $qif = Finance::QIF->new( trim_white_space => 1 );
my $qif = Finance::QIF->new( debug => 1 );
Specify file name and optionally additional parameters that will be used to obtain a filehandle. The argument can be a filename (SCALAR), an ARRAY reference, or an ARRAY whose values must be valid arguments for passing to IO::File->new.
$qif->file( "myfile" ); OR $qif->file( [ "myfile", "<:crlf" ] ); OR $qif->file( "myfile", "<:crlf" );
For output files, be sure to open the file in write mode.
Returns the currently used record_separator. This is used primarly in situations where you open a QIF file with autodetect and then want to write out a QIF file in the same format.
my $in = Finance::QIF->new( file => "input.qif", autodetect => 1 ); my $out = Finance::QIF->new( file => ">write.qif", record_separator => $in->record_separator );
Open already specified file.
$qif->open();
Open also supports the same arguments as "file()".
For input files return the next record in the QIF file.
my $record = $in->next();
Returns undef if no more records are available.
For output files use to output the passed header for records that will then be written with write.
$out->header( "Type:Bank" );
See "RECORD TYPES & VALUES" for list of possible record types that can be passed.
For output files use to output the passed record to the file.
$out->write( $record );
Resets the filehandle so the records can be read again from the beginning of the file.
$qif->reset();
Closes the open file.
$qif->close();
Read an existing QIF file then write out to new QIF file.
my $in = Finance::QIF->new( file => "input.qif" ); my $out = Finance::QIF->new( file => ">write.qif" ); my $header = ""; while ( my $record = $in->next() ) { if ( $header ne $record->{header} ) { $out->header( $record->{header} ); $header = $record->{header}; } $out->write($record); } $in->close(); $out->close();
Carp, IO::File
Quicken Interchange Format (QIF) specification <http://web.intuit.com/support/quicken/docs/d_qif.html>
Simon Cozens "simon@cpan.org", Author of original Finance::QIF
Nathan McFarland "nmcfarl@cpan.org", Maintainer of original Finance::QIF
Matthew McGillis <matthew@mcgillis.org> <http://www.mcgillis.org/>
Phil Lobbes <phil at perkpartners dot com>
Project maintained at <http://sourceforge.net/projects/finance-qif>
Copyright (C) 2006-2008 by Matthew McGillis. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
2021-01-07 | perl v5.32.0 |