Read a Fixed-width File / Fixed-length Record File
Updated: Jun 1, 2023
The FixedWidthReader can be used to parse fixed-width / fixed-length record (FLR) text files and input streams.
The following fixed-width file (credit-balance-01.fw) will be used as the input for this example.
Fixed Width Input
Account LastName FirstName Balance CreditLimit AccountCreated Rating 101 Reeves Keanu 9315.45 10000.00 1/17/1998 A 312 Butler Gerard 90.00 1000.00 8/6/2003 B 868 Hewitt Jennifer Love 0 17000.00 5/25/1985 B 761 Pinkett-Smith Jada 49654.87 100000.00 12/5/2006 A 317 Murray Bill 789.65 5000.00 2/5/2007 C
FixedWidthReader requires that you either call addField(s)
for the fields you wish to read in or skipField
with the number of characters to skip before the next field.
This example uses space as the fill char (the default), but this can be changed for the entire reader or for individual fields.
Java Code
/* * Copyright (c) 2006-2022 North Concepts Inc. All rights reserved. * Proprietary and Confidential. Use is subject to license terms. * * https://northconcepts.com/data-pipeline/licensing/ */ package com.northconcepts.datapipeline.examples.cookbook; import java.io.File; import org.apache.log4j.Logger; import com.northconcepts.datapipeline.core.DataEndpoint; import com.northconcepts.datapipeline.core.Record; import com.northconcepts.datapipeline.fixedwidth.FixedWidthReader; public class ReadAFixedWidthFile { public static final Logger log = DataEndpoint.log; public static void main(String[] args) { FixedWidthReader reader = new FixedWidthReader(new File("example/data/input/credit-balance-01.fw")); reader.setFieldNamesInFirstRow(true); reader.addFields(8); reader.addFields(16); reader.addFields(16); reader.skipField(12); // ignore field 3 - Balance reader.addFields(14); reader.addFields(16); reader.addFields(7); reader.open(); try { Record record; while ((record = reader.read()) != null) { log.info(record); } } finally { reader.close(); } } }
Code Walkthrough
- A FixedWidthReader is instantiated with the file
credit-balance-01.fw
. - The reader is configured according to the file being read. The first column is 8 chars long, the second one is 16 chars long and so on.
- The reader is opened.
- Each row in the file is deserialized into a Record object and printed to the console.
- The reader is closed.
The resulting output would look like the following.
22:53:25,229 INFO [main] datapipeline:39 - Record { 0:[Account]:STRING=[101]:String 1:[LastName]:STRING=[Reeves]:String 2:[FirstName]:STRING=[Keanu]:String 3:[CreditLimit]:STRING=[10000.00]:String 4:[AccountCreated]:STRING=[1/17/1998]:String 5:[Rating]:STRING=[A]:String } 22:53:25,238 INFO [main] datapipeline:39 - Record { 0:[Account]:STRING=[312]:String 1:[LastName]:STRING=[Butler]:String 2:[FirstName]:STRING=[Gerard]:String 3:[CreditLimit]:STRING=[1000.00]:String 4:[AccountCreated]:STRING=[8/6/2003]:String 5:[Rating]:STRING=[B]:String } 22:53:25,240 INFO [main] datapipeline:39 - Record { 0:[Account]:STRING=[868]:String 1:[LastName]:STRING=[Hewitt]:String 2:[FirstName]:STRING=[Jennifer Love]:String 3:[CreditLimit]:STRING=[17000.00]:String 4:[AccountCreated]:STRING=[5/25/1985]:String 5:[Rating]:STRING=[B]:String } 22:53:25,241 INFO [main] datapipeline:39 - Record { 0:[Account]:STRING=[761]:String 1:[LastName]:STRING=[Pinkett-Smith]:String 2:[FirstName]:STRING=[Jada]:String 3:[CreditLimit]:STRING=[100000.00]:String 4:[AccountCreated]:STRING=[12/5/2006]:String 5:[Rating]:STRING=[A]:String } 22:53:25,242 INFO [main] datapipeline:39 - Record { 0:[Account]:STRING=[317]:String 1:[LastName]:STRING=[Murray]:String 2:[FirstName]:STRING=[Bill]:String 3:[CreditLimit]:STRING=[5000.00]:String 4:[AccountCreated]:STRING=[2/5/2007]:String 5:[Rating]:STRING=[C]:String }