Opencsv is a very simple csv (comma-separated values) parser library for Java. It was developed because all of current csv parsers I've come across don't have commercial-friendly licenses.
Source and binaries are available from SourceForge
opencsv supports all the basic csv-type things you're likely to want to do:
* Arbitrary numbers of values per line. * Ignoring commas in quoted elements. * Handling quoted entries with embedded carriage returns (ie entries that span multiple lines). * Configurable separator and quote characters (or use sensible defaults). * Read all the entries at once, or use an Iterator style modell * Creating csv files from String[] (ie. automatic escaping of embedded quote chars).
If you want to use an Iterator style pattern, you might do something like this:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
// nextLine[] is an array of values from the line
System.out.println(nextLine[0] + nextLine[1] + "etc...");
}
Or, if you might just want to slurp the whole lot into a List, just call readAll()...
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
List myEntries = reader.readAll();
which will give you a List of String[] that you can iterate over. If all else fails, check out the Javadocs.
Yes. There are constructors that cater for supplying your own separator and quote characters. Say you're using a tab for your separator, you can do something like this:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t');
And if you single quoted your escaped characters rather than double quote them, you can use the three arg constructor:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'');
You may also skip the first few lines of the file if you know that the content doesn't start till later in the file. So, for example, you can skip the first two lines by doing:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'', 2);
Yes. There is a CSVWriter in the same package that follows the same semantics as the CSVReader. For example, to write a tab separated file:
CSVWriter writer = new CSVWriter(new FileWriter("yourfile.csv"), '\t');
// feed in your array (or convert your data to an array)
String[] entries = "first#second#third".split("#");
writer.writeNext(entries);
writer.close();
If you'd prefer to use your own quote characters, you may use the three arg version of the constructor, which takes a quote character (or feel free to pass in CSVWriter.NO_QUOTE_CHARACTER).
You can also customise the line terminators used in the generated file (which is handy when you're exporting from your Linux web application to Windows clients). There is a constructor argument for this purpose.
Yes you can. Sean Sullivan added a neat feature to CSVWriter so you can pass writeAll() a ResultSet.
java.sql.ResultSet myResultSet = ....
writer.writeAll(myResultSet, includeHeaders);
Yes there is. Kyle Miller added a set of classes to allow you to bind a CSV file to a list of JavaBeans based on column name, column position, or a custom mapping strategy. You can find the new classes in the com.opencsv.bean package. Here's how you can map to a java bean based on the field positions in your CSV file:
ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(YourOrderBean.class);
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, yourReader);
Tom Squires extended this feature to allow annotation-based binding of CSV file to Java Beans. Consider the following Bean:
import com.opencsv.bean.CsvBind;
import java.util.Date;
public class SimpleAnnotatedMockBean {
@CsvBind
private String name;
@CsvBind
private String orderNumber;
@CsvBind(required = true)
private int num;
private Date someOtherField;
public String getName() {
return name;
}
public String getOrderNumber() {
return orderNumber;
}
public int getNum() {
return num;
}
}
And the following code:
HeaderColumnNameMappingStrategy<SimpleAnnotatedMockBean> strategy = new HeaderColumnNameMappingStrategy<>();
strategy.setType(SimpleAnnotatedMockBean.class);
CsvToBean<SimpleAnnotatedMockBean> csvToBean = new CsvToBean<>();
List<SimpleAnnotatedMockBean> beanList = csvToBean.parse(strategy, createReader());
The resulting beanList variable will contain a List of SimpleAnnotatedMockBean objects with the name, orderNumber and num fields populated.
The someOtherField property will not have been populated, because it was not annotated with @CsvBind.
For more detailed examples, check out the test cases for each of the available mapping strategies under the /test/java/com/opencsv/bean/.
Yes. opencsv is available under a commercial-friendly Apache 2.0 license. You are free to include it in your commericial applications without any fee or charge, and you are free to modify it to suit your circumstances. To find out more details of the license, read the Apache 2.0 license agreement
You can view the source from the opencsv source section. The source section also gives you the url to the git repository so you can download source code. There is also a sample addressbook csv reader in the /examples directory. And for extra marks, there's a JUnit test suite in the /test directory.
Add a dependency element to your pom:
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>3.9</version>
</dependency>
You can report it on the support page at Sourceforge. Please post a sample file that demonstrates your issue. For bonus marks, post a patch too. :-)