A library for working with fixed width files in dart.
This library helps you easily create a Record
layout that clearly describes
the desired layout size and output formats. You can go both ways - taking a
fixed width record and turning it into a dart object, or loading a dart object
and outputting a fixed width string.
To get started - first define your Record
layout.
Note that class constructors are not inherited and you'll need to
include them in your own Record
definition to get the fromRecord
behavior.
import 'package:intl/intl.dart';
import 'package:fixedwidth/fixedwidth.dart';
class PersonRecord extends Record {
StringField first_name = new StringField(20);
StringField last_name = new StringField(20);
DateTimeField dob =
new DateTimeField(10, format: new DateFormat("yyyy-MM-dd"));
IntegerField num_siblings = new IntegerField(2, defaultValue: 0);
DecimalField amount_due = new DecimalField(8, decimals: 2);
PersonRecord();
PersonRecord.fromRecord(String record) : super.fromString(record);
}
You can take a Record, populate it, and turn it to a fixed width string.
var record = new PersonRecord()
..first_name.value = "John"
..last_name.value = "Doe"
..dob.value = new DateTime(1980, 4, 16)
..num_siblings.value = 2
..amount_due.value = 24.75;
print(record.toString());
print("Total Record Length: ${record.length()}");
You can also take a fixed width string and turn it into the appropriate
dart object. Calling a field's value
gives you the dart typed object.
var record2 = new PersonRecord.fromRecord(
"Benjamin Franklin 1706-01-171600003.00");
print(record2.first_name);
print(record2.last_name);
print(record2.dob.value);
print(record2.num_siblings.value);
print(record2.amount_due.value);
}
StringField
#This is the most common field. Just a string, padded to the right.
StringField name = new StringField(15);
String Representation: right padded to the given length
i.e.: "Peter "
Dart Value: the raw string assigned ie. "Peter"
DateTimeField
#DateTimeField
is for dates or timestamps. You can set desired output
format on the field to control the string output.
Uses the intl
library for date formatting.
DateTimeField completedDate = new DateTimeField(10, format: new DateFormat("yyyy-MM-dd");
String Representation: Formatted date as defined by format
. i.e. 2018-03-16
Dart Value: DateTime
- 2018-03-16 14:53:02.030
IntegerField
#IntegerField amount = new IntegerField(5);
String Representation: zero padded integer: 00300
Dart Value: int
- 300
DecimalField
#A num
type that outputs the desired length w/ decimals.
Value will be rounded if necessary to shorten decimal precision.
DecimalField amount = new DecimalField(8, decimals: 2);
String Representation: zero padded decimal: 00300.50
Dart Value: num
- 300.50
ImpliedDecimalField
#With COBOL programs it used to be common to have implied decimals
which means a decimal is implied at a certain spot, but not present.
ImpliedDecimalField amount = new ImpliedDecimalField(7, decimals: 2);
String Representation: zero padded decimal: 0030075
Dart Value: num
- 300.75
SignedImpliedDecimalField
#Same thing as Implied Decimal Field, but has a trailing sign that indicates whether the value is positive or negative.
If you'd like a signed integer field, just set decimals to 0
SignedImpliedDecimalField amount = new SignedImpliedDecimalField(8, decimals: 2);
String Representation: : 0030075-
Dart Value: num
- -300.75
BooleanField
#BooleanField isActive = new BooleanField();
String Representation: Y
or N
Dart Value: bool
NullBooleanField
#Like a BooleanField
, but can also be null
. This is
sometimes used when a value is unset or unknown.
NullBooleanField likesPizza = new NullBooleanField();
String Representation: Y
, N
, or
Dart Value: bool
RecordField
#RecordField
can be thought of as a "sub-record", or a "record within a record".
i.e. Sometimes parts of a record (like an address) are repeated in multiple places
and it is less work to define the "sub-record" only once.
class AddressRecord extends Record {
StringField address = new StringField(60);
StringField city = new StringField(30);
StringField state = new StringField(2);
StringField postalCode = new StringField(12);
AddressRecord();
AddressRecord.fromRecord(String record) : super.fromString(record);
}
class Transaction extends Record {
RecordField billingAddress = new RecordField(record: AddressRecord);
RecordField shippingAddress = new RecordField(record: AddressRecord);
Transaction();
Transaction.fromRecord(String record) : super.fromString(record);
}
String Representation: the entire padded string of the declared record
Dart Value: an instance of the declared Record
ListField
#ListField
is like a RecordField
, but it is a list of records.
Very similar to COBOL occurs
functionality.
class ItemRecord extends Record {
StringField sku = new StringField(10);
IntegerField qty = new IntegerField(2);
DecimalField amount = new StringField(9, decimals: 2);
ItemRecord();
ItemRecord.fromRecord(String record) : super.fromString(record);
}
class Transaction extends Record {
ListField orderItems = new ListField(record: ItemRecord, occurs: 25);
Transaction();
Transaction.fromRecord(String record) : super.fromString(record);
}
String Representation: the entire padded string of the list of declared record
s
Dart Value: List of Record
instances
defaultValue
#each field type accepts a defaultValue
parameter. A field's value is initially
set to the default value when it is instantiated.
StringField name = new StringField(10, defaultValue: "Peter");
print("'${name.value}'");
print("'${name.toString()}'");
prints
'Peter'
'Peter '
autoTruncate
#set autoTruncate = true
If you want to automatically truncate the string
value to fit the necessary fixed width length (instead of throwing an exception),
This is useful when you store data in fields longer than what the fixed width file layout requirement is.
class MyRecord extends Record {
bool autoTruncate = true;
StringField description = new StringField(10);
}
var record = new MyRecord()
..description.value = "Pigeons are super cool";
print("'${record.description.value}'");
print("'${record.toString()}'");
prints
'Pigeons are super cool'
'Pigeons ar'
See the examples for additional usage samples.
Please file feature requests and bugs at the issue tracker.
Added autoTruncate
feature
This helps in a scenario where you're storing data and you allow
longer field values than the record you need to create. (i.e. format
data for a third party service) Instead of always trimming your values
for each field, you can just set autoTruncate = true
on the record
class and each field will be truncated down to the appropriate field
record length.
ImpliedDecimalField
SignedImpliedDecimalField
RecordField
ListField
Record.length
is now a getter, not a methodInitial version.
Contains StringField
, IntegerField
, DecimalField
,
DateTimeField
, BooleanField
, and NullBooleanField
example/fixedwidth_example.dart
import 'package:intl/intl.dart';
import 'package:fixedwidth/fixedwidth.dart';
class PhoneNumber extends Record {
IntegerField area_code = new IntegerField(3);
IntegerField prefix = new IntegerField(3);
IntegerField line_number = new IntegerField(4);
PhoneNumber();
PhoneNumber.fromRecord(String record) : super.fromString(record);
}
/// Person Record demonstrates using most field types.
///
/// The phone_number field is a `RecordField` which is comprised of
/// an entire record.
class PersonRecord extends Record {
StringField first_name = new StringField(20);
StringField last_name = new StringField(20);
DateTimeField dob =
new DateTimeField(10, format: new DateFormat("yyyy-MM-dd"));
IntegerField num_siblings = new IntegerField(2, defaultValue: 0);
DecimalField amount_due = new DecimalField(8, decimals: 2);
RecordField phone_number = new RecordField(PhoneNumber);
PersonRecord();
PersonRecord.fromRecord(String record) : super.fromString(record);
}
main() {
// You can take a Record, populate it, and turn it to a fixed width string.
var phone = new PhoneNumber()
..area_code.value = 215
..prefix.value = 222
..line_number.value = 3333;
var record = new PersonRecord()
..first_name.value = "John"
..last_name.value = "Doe"
..dob.value = new DateTime(1980, 4, 16)
..num_siblings.value = 2
..amount_due.value = 24.75
..phone_number.value = phone;
print("'${record.toString()}'");
print("Total Record Length: ${record.length}");
// You can take a fixed width string and turn it into the appropriate
// dart object
var record2 = new PersonRecord.fromRecord(
"Benjamin Franklin 1706-01-171600003.002151112222");
print(record2.first_name);
print(record2.last_name);
print(record2.dob.value);
print(record2.num_siblings.value);
print(record2.amount_due.value);
print(record2.phone_number.value.area_code.value);
print(record2.phone_number.value.prefix.value);
print(record2.phone_number.value.line_number.value);
}
Add this to your package's pubspec.yaml file:
dependencies:
fixedwidth: ^0.3.1
You can install packages from the command line:
with pub:
$ pub get
Alternatively, your editor might support pub get
.
Check the docs for your editor to learn more.
Now in your Dart code, you can use:
import 'package:fixedwidth/fixedwidth.dart';
Version | Uploaded | Documentation | Archive |
---|---|---|---|
0.3.1 | Apr 11, 2018 |
|
|
0.3.0 | Mar 16, 2018 |
|
|
0.2.0 | Mar 13, 2018 |
|
|
0.1.0 | Mar 9, 2018 |
|
|
0.0.1 | Mar 4, 2018 |
|
|
Popularity:
Describes how popular the package is relative to other packages.
[more]
|
0
|
Health:
Code health derived from static analysis.
[more]
|
97
|
Maintenance:
Reflects how tidy and up-to-date the package is.
[more]
|
100
|
Overall:
Weighted score of the above.
[more]
|
49
|
We analyzed this package on Feb 14, 2019, and provided a score, details, and suggestions below. Analysis was completed with status completed using:
Detected platforms: web, other
Primary library:
package:fixedwidth/fixedwidth.dart
with components:mirrors
.
Fix lib/src/utils.dart
. (-1 points)
Analysis of lib/src/utils.dart
reported 2 hints:
line 3 col 63: Use =
to separate a named parameter from its default value.
line 10 col 72: Use =
to separate a named parameter from its default value.
Fix lib/src/fields/decimal_field.dart
. (-0.50 points)
Analysis of lib/src/fields/decimal_field.dart
reported 1 hint:
line 7 col 64: Use =
to separate a named parameter from its default value.
Fix lib/src/fields/fixedwidth_field.dart
. (-0.50 points)
Analysis of lib/src/fields/fixedwidth_field.dart
reported 1 hint:
line 52 col 3: Avoid return types on setters.
Fix additional 3 files with analysis or formatting issues. (-1.50 points)
Additional issues in the following files:
lib/src/fields/implied_decimal_field.dart
(1 hint)lib/src/fields/list_field.dart
(1 hint)lib/src/fields/signed_implied_decimal_field.dart
(1 hint)