BAEL-3462 Univosity Parsers (#9222)
* BAEL-3462 CSV Univosity Example * Added a row processor example
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
package com.baeldung.univocity;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.baeldung.univocity.model.Product;
|
||||
import com.univocity.parsers.common.processor.BeanWriterProcessor;
|
||||
import com.univocity.parsers.csv.CsvWriter;
|
||||
import com.univocity.parsers.csv.CsvWriterSettings;
|
||||
import com.univocity.parsers.fixed.FixedWidthFields;
|
||||
import com.univocity.parsers.fixed.FixedWidthWriter;
|
||||
import com.univocity.parsers.fixed.FixedWidthWriterSettings;
|
||||
import com.univocity.parsers.tsv.TsvWriter;
|
||||
import com.univocity.parsers.tsv.TsvWriterSettings;
|
||||
|
||||
public class OutputService {
|
||||
private Logger logger = LoggerFactory.getLogger(ParsingService.class);
|
||||
|
||||
public enum OutputType {
|
||||
CSV, TSV, FIXED_WIDTH
|
||||
};
|
||||
|
||||
public boolean writeData(List<Object[]> products, OutputType outputType, String outputPath) {
|
||||
try (Writer outputWriter = new OutputStreamWriter(new FileOutputStream(new File(outputPath)), "UTF-8")) {
|
||||
switch (outputType) {
|
||||
case CSV: {
|
||||
CsvWriter writer = new CsvWriter(outputWriter, new CsvWriterSettings());
|
||||
writer.writeRowsAndClose(products);
|
||||
}
|
||||
break;
|
||||
case TSV: {
|
||||
TsvWriter writer = new TsvWriter(outputWriter, new TsvWriterSettings());
|
||||
writer.writeRowsAndClose(products);
|
||||
}
|
||||
break;
|
||||
case FIXED_WIDTH: {
|
||||
FixedWidthFields fieldLengths = new FixedWidthFields(8, 30, 10);
|
||||
FixedWidthWriterSettings settings = new FixedWidthWriterSettings(fieldLengths);
|
||||
FixedWidthWriter writer = new FixedWidthWriter(outputWriter, settings);
|
||||
writer.writeRowsAndClose(products);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
logger.warn("Invalid OutputType: " + outputType);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean writeBeanToFixedWidthFile(List<Product> products, String outputPath) {
|
||||
try (Writer outputWriter = new OutputStreamWriter(new FileOutputStream(new File(outputPath)), "UTF-8")) {
|
||||
BeanWriterProcessor<Product> rowProcessor = new BeanWriterProcessor<Product>(Product.class);
|
||||
FixedWidthFields fieldLengths = new FixedWidthFields(8, 30, 10);
|
||||
FixedWidthWriterSettings settings = new FixedWidthWriterSettings(fieldLengths);
|
||||
settings.setHeaders("product_no", "description", "unit_price");
|
||||
settings.setRowWriterProcessor(rowProcessor);
|
||||
FixedWidthWriter writer = new FixedWidthWriter(outputWriter, settings);
|
||||
writer.writeHeaders();
|
||||
for (Product product : products) {
|
||||
writer.processRecord(product);
|
||||
}
|
||||
writer.close();
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package com.baeldung.univocity;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.baeldung.univocity.model.Product;
|
||||
import com.univocity.parsers.common.processor.BatchedColumnProcessor;
|
||||
import com.univocity.parsers.common.processor.BeanListProcessor;
|
||||
import com.univocity.parsers.csv.CsvParser;
|
||||
import com.univocity.parsers.csv.CsvParserSettings;
|
||||
import com.univocity.parsers.fixed.FixedWidthFields;
|
||||
import com.univocity.parsers.fixed.FixedWidthParser;
|
||||
import com.univocity.parsers.fixed.FixedWidthParserSettings;
|
||||
|
||||
public class ParsingService {
|
||||
private Logger logger = LoggerFactory.getLogger(ParsingService.class);
|
||||
|
||||
public List<String[]> parseCsvFile(String relativePath) {
|
||||
try (Reader inputReader = new InputStreamReader(new FileInputStream(new File(relativePath)), "UTF-8")) {
|
||||
CsvParserSettings settings = new CsvParserSettings();
|
||||
settings.setMaxCharsPerColumn(100);
|
||||
settings.setMaxColumns(50);
|
||||
CsvParser parser = new CsvParser(settings);
|
||||
List<String[]> parsedRows = parser.parseAll(inputReader);
|
||||
return parsedRows;
|
||||
} catch (IOException e) {
|
||||
logger.error("IOException opening file: " + relativePath + " " + e.getMessage());
|
||||
return new ArrayList<String[]>();
|
||||
}
|
||||
}
|
||||
|
||||
public List<String[]> parseFixedWidthFile(String relativePath) {
|
||||
try (Reader inputReader = new InputStreamReader(new FileInputStream(new File(relativePath)), "UTF-8")) {
|
||||
FixedWidthFields fieldLengths = new FixedWidthFields(8, 30, 10);
|
||||
FixedWidthParserSettings settings = new FixedWidthParserSettings(fieldLengths);
|
||||
|
||||
FixedWidthParser parser = new FixedWidthParser(settings);
|
||||
List<String[]> parsedRows = parser.parseAll(inputReader);
|
||||
return parsedRows;
|
||||
} catch (IOException e) {
|
||||
logger.error("IOException opening file: " + relativePath + " " + e.getMessage());
|
||||
return new ArrayList<String[]>();
|
||||
}
|
||||
}
|
||||
|
||||
public List<Product> parseCsvFileIntoBeans(String relativePath) {
|
||||
try (Reader inputReader = new InputStreamReader(new FileInputStream(new File(relativePath)), "UTF-8")) {
|
||||
BeanListProcessor<Product> rowProcessor = new BeanListProcessor<Product>(Product.class);
|
||||
CsvParserSettings settings = new CsvParserSettings();
|
||||
settings.setHeaderExtractionEnabled(true);
|
||||
settings.setProcessor(rowProcessor);
|
||||
CsvParser parser = new CsvParser(settings);
|
||||
parser.parse(inputReader);
|
||||
return rowProcessor.getBeans();
|
||||
} catch (IOException e) {
|
||||
logger.error("IOException opening file: " + relativePath + " " + e.getMessage());
|
||||
return new ArrayList<Product>();
|
||||
}
|
||||
}
|
||||
|
||||
public List<String[]> parseCsvFileInBatches(String relativePath) {
|
||||
try (Reader inputReader = new InputStreamReader(new FileInputStream(new File(relativePath)), "UTF-8")) {
|
||||
CsvParserSettings settings = new CsvParserSettings();
|
||||
settings.setProcessor(new BatchedColumnProcessor(5) {
|
||||
@Override
|
||||
public void batchProcessed(int rowsInThisBatch) {
|
||||
}
|
||||
});
|
||||
CsvParser parser = new CsvParser(settings);
|
||||
List<String[]> parsedRows = parser.parseAll(inputReader);
|
||||
return parsedRows;
|
||||
} catch (IOException e) {
|
||||
logger.error("IOException opening file: " + relativePath + " " + e.getMessage());
|
||||
return new ArrayList<String[]>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.baeldung.univocity.model;
|
||||
|
||||
import com.univocity.parsers.annotations.Parsed;
|
||||
|
||||
public class Product {
|
||||
|
||||
@Parsed(field = "product_no")
|
||||
private String productNumber;
|
||||
|
||||
@Parsed
|
||||
private String description;
|
||||
|
||||
@Parsed(field = "unit_price")
|
||||
private float unitPrice;
|
||||
|
||||
public String getProductNumber() {
|
||||
return productNumber;
|
||||
}
|
||||
|
||||
public void setProductNumber(String productNumber) {
|
||||
this.productNumber = productNumber;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public float getUnitPrice() {
|
||||
return unitPrice;
|
||||
}
|
||||
|
||||
public void setUnitPrice(float unitPrice) {
|
||||
this.unitPrice = unitPrice;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Product [Product Number: " + productNumber + ", Description: " + description + ", Unit Price: " + unitPrice + "]";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user