uniVocity Features
Simple
uniVocity is simple. All you need to do is to configure your mappings and all the rest is taken care of.
Data consistency, data management, performance and the complexity involved in the process are no longer problems you should worry about.
Fast
uniVocity is extremely fast. It's faster than what most developers can implement manually.
It is also faster than any other commercial ETL application in the market. We have years of experience developing real-time, concurrent and distributed systems. Performance is our top priority.
Free
uniVocity is free for non-commercial use.
For commercial users, a 30-day trial license is available to test uniVocity in your enterprise environment.
Easy mapping definition
With the fluent API uniVocity provides, you need very little to accomplish a lot.
EntityMapping entityMapping = dataStoreMapping.map("source_entity", "destination_entity");
entityMapping.identity().associate("pk1", "pk2").toGeneratedId("id");
entityMapping.value().copy("name", "quantity", "price").to("description", "amount", "price");
Data management
uniVocity is the only data integration solution that cares about your data once it has been mapped. You can easily manage how to handle data updates, and leverage the automatic update detection and synchronization features to deliver extremely complex mapping solutions in no time.
entityMapping.persistence().usingMetadata().deleteAbsent().updateModified().insertNewRows();
Information integrity
Decompose your input data and map it into a new schema. uniVocity manages referential constraints and generated keys, even when information is obtained from irregular data (such as words in free text). It doesn't matter how data is stored, uniVocity can transform it whilst maintaining information integrity.

Flexibility
Have access to each step of the mapping process and tailor your data flow from one end to another.
entityMapping.addOutputRowReader(new RowReader() {
@Override
public void processRow(Object[] inputRow, Object[] outputRow, RowMappingContext context) {
// modify data as it is processed
String name = context.getOutputValue("name", String.class);
if(name != null){
context.setOutputValue("name", name.toUpperCase());
} else {
context.discardRow();
}
// use any objects accessible from within your application
context.setOutputValue("processed_date", new Date());
context.setOutputValue("username", session.getAttribute("currentSessionUser"));
}
});
Convenience
Use components from your existing application: are you using a distributed cache? Do you need to use data from external services, or from objects in your system? You can make uniVocity use these and any other resources from your application stack.
engine.addFunction(EngineScope.CYCLE, "getAccountBalance", new FunctionCall<BigDecimal, String>() {
@Override
public BigDecimal execute(String accountNumber) {
return yourAccountService.findAccount(accountNumber).getBalance();
}
});
...
entityMapping.value().copy("accountNumber").to("balance").readingWith("getAccountBalance");
Control
uniVocity gives you control over what records to update, when and how.
engine.disableUpdateOnRecords("myEntity", datasetWithRecords);
engine.executeCycle();
...
engine.enableUpdateOnAllRecords("myEntity");
engine.executeCycle();
...
No limitations
Data inputs and outputs can be anything. uniVocity lets you create custom data entities, data stores and queries. Any database that has a JDBC driver will work out of the box with uniVocity.
public class MyEntity implements com.univocity.api.entity.custom.CustomDataEntity {
private final MyDataStore dataStore;
...
public com.univocity.api.entity.custom.ReadingProcess preareToRead(String[] fieldNames){
...
}
public com.univocity.api.entity.custom.WritingProcess prepareToWrite(String[] fieldNames){
...
}
}
Lightweight
Manage the use of potentially slow operations and determine when to invoke them using the various scope levels provided by uniVocity.
engine.addQuery(EngineScope.APPLICATION, "findAccountType")
.onDataStore("csvDataStore")
.fromString("SELECT account_type_id FROM account_type WHERE code = :accountTypeCode")
.returnSingleValue()
.directly()
.onErrorAbort();
...
entityMapping.value().copy("{findAccountType('CHEQUE')}").to("acctyp");
And much, much more! Check our tutorials, documentation and source code