Rename Duplicate Fields
Updated: Dec 26, 2023
This example shows how to rename fields while allowing the result to contain multiple fields with the same name. Normally, the RenamField transformer does not allow duplicate names. However, the default behavior can be changed using the flag in this example.
Input CSV file
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
Java Code Listing
package com.northconcepts.datapipeline.examples.cookbook; import com.northconcepts.datapipeline.core.DataReader; import com.northconcepts.datapipeline.core.StreamWriter; import com.northconcepts.datapipeline.csv.CSVReader; import com.northconcepts.datapipeline.job.Job; import com.northconcepts.datapipeline.transform.RenameField; import com.northconcepts.datapipeline.transform.TransformingReader; import java.io.File; public class RenameDuplicateFields { public static void main(String[] args) { DataReader reader = new CSVReader(new File("example/data/input/credit-balance-01.csv")) .setFieldNamesInFirstRow(true); reader = new TransformingReader(reader) .add(new RenameField("LastName", "Name")) .add(new RenameField("FirstName", "Name").setAllowDuplicateFieldNames(true)) .add(new RenameField("Balance", "CreditLimit").setAllowDuplicateFieldNames(true)); Job.run(reader, new StreamWriter(System.out)); } }
Code walkthrough
- CSVReader is created corresponding to the input file
credit-balance-01.csv
. - The
CSVReader.setFieldNamesInFirstRow(true)
method is invoked to specify that the names specified in the first row should be used as field names. - A TransformingReader is created to apply one or more transformations to the incoming data sequentially.
- RenameField object accepts
oldName
andnewName
String arguments. By default, renaming does not allow duplicate field names in the dataset. To enable this feature, we need to callsetAllowDuplicateFieldNames(true)
method. In the given example, the "LastName" and "FirstName" fields are renamed to "Name". - Data is transferred from the
reader
to theStreamWriter(System.out)
via Job.run() method.
Console Output
----------------------------------------------- 0 - Record { 0:[Account]:STRING=[101]:String 1:[Name]:STRING=[Reeves]:String 2:[Name]:STRING=[Keanu]:String 3:[CreditLimit]:STRING=[9315.45]:String 4:[CreditLimit]:STRING=[10000.00]:String 5:[AccountCreated]:STRING=[1/17/1998]:String 6:[Rating]:STRING=[A]:String } ----------------------------------------------- 1 - Record { 0:[Account]:STRING=[312]:String 1:[Name]:STRING=[Butler]:String 2:[Name]:STRING=[Gerard]:String 3:[CreditLimit]:STRING=[90.00]:String 4:[CreditLimit]:STRING=[1000.00]:String 5:[AccountCreated]:STRING=[8/6/2003]:String 6:[Rating]:STRING=[B]:String } ----------------------------------------------- 2 - Record { 0:[Account]:STRING=[868]:String 1:[Name]:STRING=[Hewitt]:String 2:[Name]:STRING=[Jennifer Love]:String 3:[CreditLimit]:STRING=[0]:String 4:[CreditLimit]:STRING=[17000.00]:String 5:[AccountCreated]:STRING=[5/25/1985]:String 6:[Rating]:STRING=[B]:String } ----------------------------------------------- 3 - Record { 0:[Account]:STRING=[761]:String 1:[Name]:STRING=[Pinkett-Smith]:String 2:[Name]:STRING=[Jada]:String 3:[CreditLimit]:STRING=[49654.87]:String 4:[CreditLimit]:STRING=[100000.00]:String 5:[AccountCreated]:STRING=[12/5/2006]:String 6:[Rating]:STRING=[A]:String } ----------------------------------------------- 4 - Record { 0:[Account]:STRING=[317]:String 1:[Name]:STRING=[Murray]:String 2:[Name]:STRING=[Bill]:String 3:[CreditLimit]:STRING=[789.65]:String 4:[CreditLimit]:STRING=[5000.00]:String 5:[AccountCreated]:STRING=[2/5/2007]:String 6:[Rating]:STRING=[C]:String } ----------------------------------------------- 5 records