This is ffe.info, produced by makeinfo version 4.8 from ffe.texi.
INFO-DIR-SECTION Utilities
START-INFO-DIR-ENTRY
* ffe: (ffe). Flat File Extractor.
END-INFO-DIR-ENTRY
This file documents version 0.2.3 of `ffe', a flat file extractor.
Copyright (C) 2007 Timo Savinen
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission
notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided
that the entire resulting derived work is distributed under the
terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for
modified versions.
File: ffe.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir)
ffe
***
This file documents version 0.2.3 of `ffe', a flat file extractor.
Copyright (C) 2007 Timo Savinen
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission
notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided
that the entire resulting derived work is distributed under the
terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for
modified versions.
* Menu:
* Overview:: Preliminary information.
* Samples:: Samples using `ffe'.
* Invoking ffe:: How to run `ffe'.
* ffe configuration:: How `ffe' works.
* Problems:: Reporting bugs.
File: ffe.info, Node: Overview, Next: Samples, Prev: Top, Up: Top
1 Preliminary information
*************************
The `ffe' program is a used to extract fields from flat files and to
print them in different formats. The input file structure and printing
definitions are defined in a configuration file, which is always
required. Default configuration file is `~/.fferc' (`ffe.rc' in
windows).
`ffe' is a command line tool developed for GNU/Linux and UNIX
systems. `ffe' can read from standard input and write to standard
output, so it can be used as a part of a pipeline.
There is also binary distribution for windows.
File: ffe.info, Node: Samples, Next: Invoking ffe, Prev: Overview, Up: Top
2 Samples using `ffe'
*********************
One example of using `ffe' for printing personnel information in XML
format from fixed length flat file:
$ cat personnel
john Ripper 23
Scott Tiger 45
Mary Moore 41
$
A file `personnel' contains three fixed length fields: `FirstName',
`LastName' and `Age', their respective lengths are 9,13 and 2.
In order to print data above in XML, following configuration file must
be available:
$cat personnel.fferc
structure personel {
type fixed
output xml
record person {
field FirstName 9
field LastName 13
field Age 2
}
}
output xml {
file_header "\n"
data "<%n>%t%n>\n"
record_header "<%r>\n"
record_trailer "%r>\n"
indent " "
}
$
Using ffe:
$ffe -c personnel.fferc personnel
john
Ripper
23
Scott
Tiger
45
Mary
Moore
41
$
File: ffe.info, Node: Invoking ffe, Next: ffe configuration, Prev: Samples, Up: Top
3 How to run `ffe'
******************
`ffe' is a command line tool. Normally `ffe' can be invoked as:
`ffe -o OUTPUTFILE INPUTFILE...'
`ffe' uses the definitions from configuration file and tries to guess
the input file structure using the first 10 000 lines or 1 MB of input
data.
If the structure cannot be guessed the option `-s' must be used.
* Menu:
* Invocation:: Program invocation
* Configuration:: Input and printing definitions
* Guessing:: How ffe identifies input structure
* Limits:: Limitations
File: ffe.info, Node: Invocation, Next: Configuration, Up: Invoking ffe
3.1 Program invocation
======================
The format for running the `ffe' program is:
ffe OPTION ...
`ffe' supports the following options:
`-c FILE'
`--configuration=FILE'
Configuration is read from FILE, instead of `~/.fferc' (`ffe.rc'
in windows).
`-s STRUCTURE'
`--structure=STRUCTURE'
Use structure STRUCTURE for input file, suppresses guessing.
`-p OUTPUT'
`--print=OUTPUT'
Use output format OUTPUT for printing. If not defined, then the
record or structure related output format is used. Printing can be
suppressed using format NO.
`-o FILE'
`--output=FILE'
Write output to FILE instead of standard output.
`-f LIST'
`--field-list=LIST'
Print only fields and constants listed in comma separated list
LIST. Order of names in LIST defines also the printing order.
`-e EXPRESSION'
`--expression=EXPRESSION'
Print only those records for which the EXPRESSION evaluates to
true.
`-a'
`--and'
Expressions are combined with logical and, default is logical or.
`-v'
`--invert-match'
Print only those records which don't match the expression.
`-l'
`--loose'
Normally `ffe' stops when it encounters an input line which
doesn't match any of the records in selected structure. Defining
this option causes `ffe' continue despite the error.
`-r'
`--replace=FIELD=VALUE'
Replace FIELDs contents with VALUE in output. VALUE can contain
same directives as output option `data'.
`-?'
`--help'
Print an informative help message describing the options and then
exit successfully.
`-V'
`--version'
Print the version number of `ffe' and then exit successfully.
All remaining options are names of input files, if no input files
are specified or `-' is given, then the standard input is read.
Expressions (option `-e', `--expression')
-----------------------------------------
Expression can be used to select specific records comparing field
values. Expression has syntax FIELD*x*VALUE, where *x* is the
comparison operator. Expression is used to compare field's contents to
VALUE and if comparison is successful the record is printed. Several
expressions can be defined and at least one must evaluate to true in
order to print a record. If option `-a' is defined all expressions must
evaluate to true.
If VALUE starts with string `file:' then the rest of VALUE is
considered as a file name. Every line in file is used as VALUE in
comparison. Comparison evaluates true if one or more values matches, so
this makes possible use several different values in comparison. *Note*:
The file size is limited by available memory because the file contents
is loaded to memory.
Expressions can be defined as:
FIELD*=*VALUE
Field FIELD is equal to VALUE.
FIELD*^*VALUE
Field FIELD starts with VALUE.
FIELD*~*VALUE
Field FIELD contains VALUE.
FIELD*!*VALUE
Field FIELD is not equal to VALUE.
FIELD*?*VALUE
Field FIELD matches the regular expression VALUE. `ffe' supports
POSIX extended regular expressions.
File: ffe.info, Node: Configuration, Next: Guessing, Prev: Invocation, Up: Invoking ffe
3.2 Configuration
=================
`ffe' uses a configuration file in order to read the input file and
print the output.
Configuration file for `ffe' is a text file. The file may contain
empty lines. Commands are case sensitive. Comments begin with the
`#'-character and end at the end of the line. The `string' definitions
can be enclosed in double quotation `"' characters. `char' is a single
character. `string' and `char' can contain following escape codes:
`\a', `\b', `\t', `\n', `\v', `\f', `\r', `\"' and `\#'. A backslash
can be escaped as `\\'.
Configuration has two main parts: the structure, which defines the
input file structure and the output, which defines how the input data
is formatted for output.
Common syntax
-------------
Common syntax for configuration file is:
#comment
const NAME VALUE
...
structure NAME {
option value ...
...
record NAME {
option value ...
...
}
record NAME {
option value ...
...
}
...
}
structure NAME {
...
}
...
output NAME {
option value ...
...
}
output NAME {
...
}
...
lookup NAME {
option value ...
...
}
lookup NAME {
...
}
...
Structure
---------
Keyword `structure' is used to define an input file content. An input
file can contain several types of records (or lines). E.g. file can
have a header, data and trailer record types. Records must be
distinguishable from each other, this can be achieved defining
different 'keys' (`id' in record definition) or having different line
lengths (for fixed length structure) or different count of fields (for
separated structure) for different records.
Typically a `structure' maps to a file and a `records' maps to a line
in the file.
A structure is defined as:
structure NAME {
option value ...
...
}
A structure can contain following options:
`type fixed|separated [CHAR] [*]'
The fields in the input are fixed length fields or separated by
CHAR. If * is defined, multiple sequential separators are
considered as one. Default separator is comma.
`quoted [CHAR]'
Fields may be quoted with char, default quotation mark is double
quotation mark '"'. A quotation mark is assumed be escaped as
\CHAR or doubling the mark as CHARCHAR in input. Non escaped
quotation marks are not preserved in output.
`header first|all|no'
Controls the occurrence of the header line. Default is no. If set
as _first_ or _all_, the first line of the first input file is
considered as header line containing the names of the fields.
_first_ means that only the first file has a header, _all_
means means that all files have a header, all though the names are
still taken from the header of the first file. Header line is
handled according the record definition, meaning that the name
positions, separators etc. are the same as for fields.
`output NAME'
All records belonging this structure are printed according output
format name. Default is to use output named as `default'.
`record NAME {options ...}'
Defines one record for a structure. A structure can contain
several record types.
Record
------
A record defines one type of input line in a file. Different records
can be distinguished using the `id' option or different line lengths or
field counts.
A record is defined as:
record NAME {
option value ...
...
}
A record can contain following options:
`id POSITION STRING'
Identifies a record in the input file. Records are identified by
the string in input record position POSITION. For fixed length
input the position is the byte position of input record and for
separated input the position is the POSITION'th field of the input
record. Positions start from one.
A record definition can contain several id's, then all id's must
match the input line (`id''s are _and-ed_).
`field NAME|FILLER|* [LENGTH]|* [LOOKUP]'
Defines one field in input structure. LENGTH is mandatory
for fixed length input structure. Length is also used for
printing the fields in fixed length format (directive `%D' in
output definitions).
If _*_ is defined instead of the name, then the NAME will be the
ordinal number of the field, or if the `header' option has value
_first_ or _all_, then the name of the field will taken from the
header line (first line of the input).
If field is named as `FILLER', the field will not appear in output.
If LOOKUP is defined the fields contents is used to make a lookup
in lookup table LOOKUP. If LENGTH is not needed (separated
format) but lookup is needed, use asterisk (*) in place of length
definition.
The order of fields in configuration file is essential, it defines
the field order in a record.
`fields-from RECORD'
Fields for this record are the same as for record RECORD. `field'
and `fields-from' are mutually exclusive.
`output NAME'
This record is printed according output format NAME. Default is to
use output format defined in structure.
Output
------
Keyword `output' defines one output format for formatting the flat file
data. Formatting is controlled using options and printf style
directives. An output definition is all ways independent from
structure, so one output format can be used with different input file
formats.
A output is defined as:
output NAME {
option value ...
...
}
Actual formatting and printing is controlled using _pictures_ in output
options. Pictures can contain following printf style directives:
`%f'
Name of the input file.
`%s'
Name of the current structure.
`%r'
Name of the current record.
`%o'
Input record number in current file.
`%O'
Input record number starting from the first file.
`%n'
Field name.
`%t'
Field contents, without leading and trailing whitespaces.
`%d'
Field contents.
`%D'
Field contents, right padded to the field length (requires length
definition for the field).
`%l'
Lookup value which has been found using current field as a search
key.
`%L'
Lookup value, right padded to the field length.
`%p'
Fields start position in a record. For fixed structure this is
field's byte position in the input line and for separated
structure this is the ordinal number of the field. Starts from one.
`%e'
Does not print anything, causes still the "field empty" check to
be performed. Can be used when only the names of non-empty
fields should be printed.
`%%'
Percent sign.
Output options:
`file_header PICTURE'
PICTURE is printed once before file contents.
`file_trailer PICTURE'
PICTURE is printed once after file contents.
`header PICTURE'
If defined, then the header line describing the field names is
printed before records. Every field name is printed according the
PICTURE using the same separator and fields length as defined for
the fields. Picture can contain only `%n' directive.
`data PICTURE'
Field contents is printed according PICTURE.
`lookup PICTURE'
If current field is related to lookup table, then this PICTURE is
used instead of picture from `data'. This makes possible to use
different picture when the field is related to a lookup table.
Default is to use the picture from `data'.
`separator STRING'
All fields are terminated by STRING, except the last field of the
record. Default is not to print separator.
`record_header PICTURE'
All records are started by PICTURE. Default is not to print the
record header.
`record_trailer PICTURE'
All records are ended with PICTURE. Default is newline.
`justify left|right|CHAR'
The output from the `data' option is left or right justified.
CHAR justifies output according the first occurrence of CHAR in
the data picture. Default is left.
`indent STRING'
Record contents is intended by STRING. Field contents is intended
by two times the string. Default is not to indent.
`field-list NAME1,NAME2,...'
Only fields and constants named as NAME1,NAME2,... are printed,
same effect as has option `-f'. Default is print all fields and
no constants. Fields and constants are also printed in the same
order as they are listed.
`no-data-print yes|no'
If `field-list' is defined and and this is set as no and none of
the fields in `field-list' does not belong to the current record,
then the `record_header' and `record_trailer' are not printed.
Default is yes.
`field-empty-print yes|no'
When set as no, nothing is printed for fields which consist
entirely of characters from `empty-chars'. If none of the fields
of a record are printed, then the printing of `record_trailer' is
also suppressed. Default is yes.
`empty-chars STRING'
STRING defines a set of characters which define an "empty" field.
Default is " \f\n\r\t\v" (space, form-feed, newline, carriage
return, horizontal tab and vertical tab).
Lookup
------
Keyword `lookup' defines a lookup table which can searched using field
contents. Found values can be printed using output directives `%l' and
`%L'.
A lookup table is defined as:
lookup NAME {
option value ...
...
}
Lookup options:
`search exact | longest'
Search method for this table. Either exact or longest match is
used when searching the table. Default is `exact'.
`pair KEY VALUE'
Defines one key/value pair for the lookup table.
`file NAME [SEPARATOR]'
Data for the lookup table is read from file NAME. Each line in
file NAME is considered as a key/value pair separated by a single
character SEPARATOR. Default separator is semicolon. Lines without
separator are silently omitted. *Note*: The file size is limited
by available memory because the file contents is loaded to memory.
`default-value VALUE'
If searching the lookup table is unsuccessful then VALUE is used
in printing. Default is empty string.
Constants
---------
Keyword `const' defines one name/value pair which can be used as an
additional output field. Constants can be used only in field lists
(option `-f,--field-list', or output option `field-list').
Constants can be used to add fields to output which do not appear in
input. E.g. new fields for separated output or adding spaces after a
fixed length field (changing the field length).
Note that VALUE is printed as it is for every record. It cannot be
changed record by record.
If a constant has the same name as one of the input fields, the
value VALUE is printed instead of the input field contents.
A constant is defined as:
const NAME VALUE
When NAME appears in field list it is treated as one of the input
fields having contents VALUE.
File: ffe.info, Node: Guessing, Next: Limits, Prev: Configuration, Up: Invoking ffe
3.3 Guessing
============
If `-s' is not given, `ffe' tries to guess the input structure. `ffe'
reads first 10 000 lines or 1 MB of input data and tries to match the
structure definitions from configuration file to input stream. If all
lines match one and only one structure, the structure is used for
reading the input file.
Guessing uses following execution cycle:
1. Input line is read
2. All record `id''s are compared to the input line, if all `id''s of
a record match the input line and the records line length matches
the total length (or total count for separated structure) of the
fields, the record is considered to match the input line. If there
are no `id''s, only the line length or field count is checked.
3. If all lines match at least one of the records in a particular
structure, the structure is considered as selected. There must be
only one structure matching all lines used for guessing.
File: ffe.info, Node: Limits, Prev: Guessing, Up: Invoking ffe
3.4 Limitations
===============
At least in GNU/Linux `ffe' should be able to handle big files (> 4
GB), other systems are not tested.
Regular expression can be used in expressions (operator *?* in
option `-e', `--expression') only in systems where regular expression
functions (regcomp, regexec, ...) are available.
File: ffe.info, Node: ffe configuration, Next: Problems, Prev: Invoking ffe, Up: Top
4 How `ffe' works
*****************
Following examples use two different input files:
Fixed length example
--------------------
Fixed length personnel file with header and trailer, line (record) is
identified by the first byte (H = Header, E = Employee, B = Boss, T =
trailer).
$cat personnel.fix
H2006-02-25
EJohn Ripper 23
BScott Tiger 45
EMary Moore 41
ERidge Forrester 31
T0004
$
Structure for reading file above. Note that record `boss' reuses fields
from `employee'.
structure personel_fix {
type fixed
record header {
id 1 H
field type 1
field date 10
}
record employee {
id 1 E
field EmpType 1
field FirstName 9
field LastName 13
field Age 2
}
record boss {
id 1 B
fields-from employee
}
record trailer {
id 1 T
field type 1
field count 4
}
}
Separated example
-----------------
Same file as above, but now separated by colon.
$cat personnel.sep
H,2006-02-25
E,john,Ripper,23
B,Scott,Tiger,45
E,Mary,Moore,41
E,Ridge,Forrester,31
T,0004
$
Structure for reading file above. Note that the field lengths are not
needed in separated format.
structure personel_sep {
type separated ,
record header {
id 1 H
field type
field date
}
record employee {
id 1 E
field type
field FirstName
field LastName
field Age
}
record boss {
id 1 B
fields-from employee
}
record trailer {
id 1 T
field type
field count
}
}
Printing in XML format
----------------------
Data in examples above can be printed in XML using output definition
like:
output xml {
file_header "\n"
data "<%n>%t%n>\n"
record_header "<%r>\n"
record_trailer "%r>\n"
indent " "
}
Example output using command (assuming definitions above are saved in
~/.fferc)
`ffe -p xml personnel.sep'
E
john
Ripper
23
B
Scott
Tiger
45
E
Mary
Moore
41
E
Ridge
Forrester
31
T
0004
Printing sql commands
---------------------
Data in examples above can be loaded to database by generated sql
commands. Note that the header and trailer are not loaded, because only
fields `FirstName',`LastName' and `Age' are printed and `no-data-print'
is set as no. This prevents the `record_header' and `record_trailer' to
be printed for file header and trailer.
output sql {
file_header "delete table boss;\ndelete table employee;\n"
record_header "insert into %r values("
data "'%t'"
separator ","
record_trailer ");\n"
file_trailer "commit\nquit\n"
no-data-print no
field-list FirstName,LastName,Age
}
Output from command
`ffe -p sql personnel.sep'
delete table boss;
delete table employee;
insert into employee values('john','Ripper','23');
insert into boss values('Scott','Tiger','45');
insert into employee values('Mary','Moore','41');
insert into employee values('Ridge','Forrester','31');
commit
quit
Human readable output
---------------------
This output format shows the fields suitable for displaying in screen
or printing.
output nice {
record_header "%s - %r - %f - %o\n"
data "%n=%t\n"
justify =
indent " "
}
Output from command
`ffe -p nice personnel.fix'
personel - header - personnel.fix - 1
type=H
date=2006-02-25
personel - employee - personnel.fix - 2
EmpType=E
FirstName=John
LastName=Ripper
Age=23
personel - boss - personnel.fix - 3
EmpType=B
FirstName=Scott
LastName=Tiger
Age=45
personel - employee - personnel.fix - 4
EmpType=E
FirstName=Mary
LastName=Moore
Age=41
personel - employee - personnel.fix - 5
EmpType=E
FirstName=Ridge
LastName=Forrester
Age=31
personel - trailer - personnel.fix - 6
type=T
count=0004
HTML table
----------
Personnel data can be displayed as HTML table using output like:
output html {
file_header "\n
\n\n\n\n\n"
header "| %n | \n"
record_header "
\n"
data "| %t | \n"
file_trailer "
\n\n\n"
no-data-print no
}
Output from command
`ffe -p html -f FirstName,LastName,Age personnel.fix'
| FirstName |
LastName |
Age |
| John |
Ripper |
23 |
| Scott |
Tiger |
45 |
| Mary |
Moore |
41 |
| Ridge |
Forrester |
31 |
Using expression
----------------
Printing only Scott's record using expression with previous example:
`ffe -p html -f FirstName,LastName,Age -e FirstName^Scott
personnel.fix'
| FirstName |
LastName |
Age |
| Scott |
Tiger |
45 |
Using replace
-------------
Make all bosses and write a new personnel file printing the fields in
fixed length format using directive `%D':
Output definition:
output fixed
{
data "%D"
}
Write a new file:
$ffe -p fixed -r EmpType=B -o personnel.fix.new personnel.fix
$cat personnel.fix.new
H2006-02-25
BJohn Ripper 23
BScott Tiger 45
BMary Moore 41
BRidge Forrester 31
T0004
$
Using constant
--------------
The length of the fields FirstName and LastName in fixed length format
will be made two bytes longer. This will be done by printing a
constant after those two fields. We use dots instead of spaces in
order to make change more visible.
Because we do not want to change header and trailer we need
specially crafted configuration file. Employee and boss records will
be printed using new output FIXED2 and other records will be printed
using output DEFAULT.
New definition file `new_fixed.rc':
const 2dots ".."
structure personel_fix {
type fixed
record header {
id 1 H
field type 1
field date 10
}
record employee {
id 1 E
field EmpType 1
field FirstName 9
field LastName 13
field Age 2
output fixed2
}
record boss {
id 1 B
fields-from employee
output fixed2
}
record trailer {
id 1 T
field type 1
field count 4
}
}
output default
{
data "%D"
}
output fixed2
{
data "%D"
field-list Emptype,FirstName,2dots,LastName,2dots,Age
}
Print new flat file:
$ ffe -c new_fixed.rc personel_fix
H2006-02-25
EJohn ..Ripper ..23
BScott ..Tiger ..45
EMary ..Moore ..41
ERidge ..Forrester ..31
T0004
$
Using lookup table
------------------
Lookup table is used to explain the EmpTypes contents in output format
`nice':
Lookup definition:
lookup Type
{
search exact
pair H Header
pair B "He is a Boss!"
pair E "Not a Boss!"
pair T Trailer
default-value "Unknown record type!"
}
Mapping the EmpType field to lookup:
structure personel_fix {
type fixed
record header {
id 1 H
field type 1
field date 10
}
record employee {
id 1 E
field EmpType 1 Type
field FirstName 9
field LastName 13
field Age 2
}
record boss {
id 1 B
fields-from employee
}
record trailer {
id 1 T
field type 1
field count 4
}
}
Adding the lookup option to output definition `nice'.
output nice {
record_header "%s - %r - %f - %o\n"
data "%n=%t\n"
lookup "%n=%t (%l)\n"
justify =
indent " "
}
Running ffe:
$ffe -p nice personnel.fix
personel_fix - header - personel_fix - 1
type=H
date=2006-02-25
personel_fix - employee - personel_fix - 2
EmpType=E (Not a Boss!)
FirstName=John
LastName=Ripper
Age=23
personel_fix - boss - personel_fix - 3
EmpType=B (He is a Boss!)
FirstName=Scott
LastName=Tiger
Age=45
personel_fix - employee - personel_fix - 4
EmpType=E (Not a Boss!)
FirstName=Mary
LastName=Moore
Age=41
personel_fix - employee - personel_fix - 5
EmpType=E (Not a Boss!)
FirstName=Ridge
LastName=Forrester
Age=31
personel_fix - trailer - personel_fix - 6
type=T
count=0004
External lookup file
--------------------
In previous example the lookup data could be read from external file
like:
$cat lookupdata
H;Header
B;He is a Boss!
E;Not a Boss!
T;Trailer
$
Lookup definition using file above:
lookup Type
{
search exact
file lookupdata
default-value "Unknown record type!"
}
The whole configuration file used in examples
---------------------------------------------
structure personel_fix {
type fixed
record header {
id 1 H
field type 1
field date 10
}
record employee {
id 1 E
field EmpType 1 Type
field FirstName 9
field LastName 13
field Age 2
}
record boss {
id 1 B
fields-from employee
}
record trailer {
id 1 T
field type 1
field count 4
}
}
structure personel_sep {
type separated ,
record header {
id 1 H
field type
field date
}
record employee {
id 1 E
field type
field FirstName
field LastName
field Age
}
record boss {
id 1 B
fields-from employee
}
record trailer {
id 1 T
field type
field count
}
}
output xml {
file_header "\n"
data "<%n>%t%n>\n"
record_header "<%r>\n"
record_trailer "%r>\n"
indent " "
}
output sql {
file_header "delete table boss;\ndelete table employee;\n"
record_header "insert into %r values("
data "'%t'"
separator ","
record_trailer ");\n"
file_trailer "commit\nquit\n"
no-data-print no
field-list FirstName,LastName,Age
}
output nice {
record_header "%s - %r - %f - %o\n"
data "%n=%t\n"
lookup "%n=%t (%l)\n"
justify =
indent " "
}
output html {
file_header "\n\n\n\n\n\n"
header "| %n | \n"
record_header "
\n"
data "| %t | \n"
file_trailer "
\n\n\n"
no-data-print no
}
output fixed
{
data "%D"
}
lookup Type
{
search exact
pair H Header
pair B "He is a Boss!"
pair E "Not a Boss!"
pair T Trailer
default-value "Unknown record type!"
}
Using `ffe' to test file integrity
----------------------------------
`ffe' can be used to check flat file integrity, because `ffe' checks
for all lines the line length and id's for fixed length structure and
field count and id's for separated structure.
Integrity can be checked using command
`ffe -p no -l inputfiles...'
Because option `-p' has value `no' nothing is printed to output except
the error messages. Option `-l' causes all erroneous lines to be
reported, not just the first one.
Example output:
ffe: Invalid input line in file 'inputfileB', line 14550
ffe: Invalid input line in file 'inputfileD', line 12
File: ffe.info, Node: Problems, Prev: ffe configuration, Up: Top
5 Reporting Bugs
****************
If you find a bug in `ffe', please send electronic mail to
. Include the version number, which you can find by
running `ffe --version'. Also include in your message the output that
the program produced and the output you expected.
If you have other questions, comments or suggestions about `ffe',
contact the author via electronic mail to . The author
will try to help you out, although he may not have time to fix your
problems.
Tag Table:
Node: Top900
Node: Overview1960
Node: Samples2600
Node: Invoking ffe4089
Node: Invocation4722
Node: Configuration7857
Node: Guessing19120
Node: Limits20164
Node: ffe configuration20557
Node: Problems34696
End Tag Table