Class CSVReader
- java.lang.Object
-
- com.opencsv.CSVReader
-
- All Implemented Interfaces:
java.io.Closeable,java.lang.AutoCloseable,java.lang.Iterable<java.lang.String[]>
- Direct Known Subclasses:
CSVReaderHeaderAware
public class CSVReader extends java.lang.Object implements java.io.Closeable, java.lang.Iterable<java.lang.String[]>A very simple CSV reader released under a commercial-friendly license.
-
-
Field Summary
Fields Modifier and Type Field Description protected java.io.BufferedReaderbr(package private) static intCONTEXT_MULTILINE_EXCEPTION_MESSAGE_SIZEstatic booleanDEFAULT_KEEP_CRstatic intDEFAULT_MULTILINE_LIMITThe default limit for the number of lines in a multiline record.static intDEFAULT_SKIP_LINESThe default line to start reading.static booleanDEFAULT_VERIFY_READERprotected java.util.LocaleerrorLocaleprotected booleanhasNextprotected booleankeepCRprotected LineReaderlineReaderprotected longlinesReadprotected booleanlinesSkippedprivate LineValidatorAggregatorlineValidatorAggregatorprivate static intMAX_WIDTHprotected intmultilineLimitprotected ICSVParserparserprotected static java.util.List<java.lang.Class<? extends java.io.IOException>>PASSTHROUGH_EXCEPTIONSprotected java.lang.String[]peekedLineprotected java.util.Queue<OrderedObject<java.lang.String>>peekedLinesstatic intREAD_AHEAD_LIMITprotected longrecordsReadprivate RowProcessorrowProcessorprivate RowValidatorAggregatorrowValidatorAggregatorprotected intskipLinesprotected booleanverifyReader
-
Constructor Summary
Constructors Constructor Description CSVReader(java.io.Reader reader)Constructs CSVReader using defaults for all parameters.CSVReader(java.io.Reader reader, int line, ICSVParser icsvParser, boolean keepCR, boolean verifyReader, int multilineLimit, java.util.Locale errorLocale, LineValidatorAggregator lineValidatorAggregator, RowValidatorAggregator rowValidatorAggregator, RowProcessor rowProcessor)Constructs CSVReader with supplied CSVParser.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidclose()Closes the underlying reader.protected java.lang.String[]combineResultsFromMultipleReads(java.lang.String[] buffer, java.lang.String[] lastRead)For multi-line records this method combines the current result with the result from previous read(s).private java.lang.String[]flexibleRead(boolean popLine, boolean validate)Reads a line of input, popping or validating as desired.longgetLinesRead()This method returns the number of lines that has been read from the reader passed into the CSVReader.intgetMultilineLimit()Only useful for tests.protected java.lang.StringgetNextLine()Reads the next line from the file.ICSVParsergetParser()longgetRecordsRead()Used for debugging purposes, this method returns the number of records that has been read from the CSVReader.intgetSkipLines()Returns the number of lines in the CSV file to skip before processing.protected booleanisClosed()Checks to see if the file is closed.java.util.Iterator<java.lang.String[]>iterator()Creates an Iterator for processing the CSV data.booleankeepCarriageReturns()Returns if the reader will keep carriage returns found in data or remove them.java.lang.String[]peek()Returns the next line from the input without removing it from the CSVReader and not running any validators.private voidprimeNextRecord()Reads the next line from the buffer and converts to a string array.java.util.List<java.lang.String[]>readAll()Reads the entire file into a List with each element being a String[] of tokens.java.lang.String[]readNext()Reads the next line from the buffer and converts to a string array.java.lang.String[]readNextSilently()Reads the next line from the buffer and converts to a string array without running the custom defined validators.voidsetErrorLocale(java.util.Locale errorLocale)Sets the locale for all error messages.voidskip(int numberOfLinesToSkip)Skip a given number of lines.private voidvalidateLine(long lastSuccessfulLineRead, java.lang.String nextLine)Runs all line validators on the input.protected voidvalidateResult(java.lang.String[] result, long lineStartOfRow)Increments the number of records read if the result passed in is not null.booleanverifyReader()Returns if the CSVReader will verify the reader before each read.
-
-
-
Field Detail
-
DEFAULT_KEEP_CR
public static final boolean DEFAULT_KEEP_CR
- See Also:
- Constant Field Values
-
DEFAULT_VERIFY_READER
public static final boolean DEFAULT_VERIFY_READER
- See Also:
- Constant Field Values
-
CONTEXT_MULTILINE_EXCEPTION_MESSAGE_SIZE
static final int CONTEXT_MULTILINE_EXCEPTION_MESSAGE_SIZE
- See Also:
- Constant Field Values
-
DEFAULT_SKIP_LINES
public static final int DEFAULT_SKIP_LINES
The default line to start reading.- See Also:
- Constant Field Values
-
DEFAULT_MULTILINE_LIMIT
public static final int DEFAULT_MULTILINE_LIMIT
The default limit for the number of lines in a multiline record. Less than one means no limit.- See Also:
- Constant Field Values
-
PASSTHROUGH_EXCEPTIONS
protected static final java.util.List<java.lang.Class<? extends java.io.IOException>> PASSTHROUGH_EXCEPTIONS
-
READ_AHEAD_LIMIT
public static final int READ_AHEAD_LIMIT
- See Also:
- Constant Field Values
-
MAX_WIDTH
private static final int MAX_WIDTH
- See Also:
- Constant Field Values
-
parser
protected ICSVParser parser
-
skipLines
protected int skipLines
-
br
protected java.io.BufferedReader br
-
lineReader
protected LineReader lineReader
-
hasNext
protected boolean hasNext
-
linesSkipped
protected boolean linesSkipped
-
keepCR
protected boolean keepCR
-
verifyReader
protected boolean verifyReader
-
multilineLimit
protected int multilineLimit
-
errorLocale
protected java.util.Locale errorLocale
-
linesRead
protected long linesRead
-
recordsRead
protected long recordsRead
-
peekedLine
protected java.lang.String[] peekedLine
-
peekedLines
protected final java.util.Queue<OrderedObject<java.lang.String>> peekedLines
-
lineValidatorAggregator
private final LineValidatorAggregator lineValidatorAggregator
-
rowValidatorAggregator
private final RowValidatorAggregator rowValidatorAggregator
-
rowProcessor
private final RowProcessor rowProcessor
-
-
Constructor Detail
-
CSVReader
public CSVReader(java.io.Reader reader)
Constructs CSVReader using defaults for all parameters.- Parameters:
reader- The reader to an underlying CSV source.
-
CSVReader
CSVReader(java.io.Reader reader, int line, ICSVParser icsvParser, boolean keepCR, boolean verifyReader, int multilineLimit, java.util.Locale errorLocale, LineValidatorAggregator lineValidatorAggregator, RowValidatorAggregator rowValidatorAggregator, RowProcessor rowProcessor)Constructs CSVReader with supplied CSVParser.This constructor sets all necessary parameters for CSVReader, and intentionally has package access so only the builder can use it.
- Parameters:
reader- The reader to an underlying CSV sourceline- The number of lines to skip before readingicsvParser- The parser to use to parse inputkeepCR- True to keep carriage returns in data read, false otherwiseverifyReader- True to verify reader before each read, false otherwisemultilineLimit- Allow the user to define the limit to the number of lines in a multiline record. Less than one means no limit.errorLocale- Set the locale for error messages. If null, the default locale is used.lineValidatorAggregator- contains all the custom defined line validators.rowValidatorAggregator- contains all the custom defined row validators.rowProcessor- Custom row processor to run on all columns on a csv record.
-
-
Method Detail
-
getParser
public ICSVParser getParser()
- Returns:
- The CSVParser used by the reader.
-
getSkipLines
public int getSkipLines()
Returns the number of lines in the CSV file to skip before processing. This is useful when there are miscellaneous data at the beginning of a file.- Returns:
- The number of lines in the CSV file to skip before processing.
-
keepCarriageReturns
public boolean keepCarriageReturns()
Returns if the reader will keep carriage returns found in data or remove them.- Returns:
- True if reader will keep carriage returns, false otherwise.
-
readAll
public java.util.List<java.lang.String[]> readAll() throws java.io.IOException, CsvExceptionReads the entire file into a List with each element being a String[] of tokens. Since the current implementation returns aLinkedList, you are strongly discouraged from using index-based access methods to get at items in the list. Instead, iterate over the list.- Returns:
- A List of String[], with each String[] representing a line of the file.
- Throws:
java.io.IOException- If bad things happen during the readCsvException- If there is a failed validator
-
readNext
public java.lang.String[] readNext() throws java.io.IOException, CsvValidationExceptionReads the next line from the buffer and converts to a string array.- Returns:
- A string array with each comma-separated element as a separate entry, or null if there is no more input.
- Throws:
java.io.IOException- If bad things happen during the readCsvValidationException- If a user-defined validator fails
-
readNextSilently
public java.lang.String[] readNextSilently() throws java.io.IOExceptionReads the next line from the buffer and converts to a string array without running the custom defined validators. This is called by the bean readers when reading the header.- Returns:
- A string array with each comma-separated element as a separate entry, or null if there is no more input.
- Throws:
java.io.IOException- If bad things happen during the read.
-
primeNextRecord
private void primeNextRecord() throws java.io.IOExceptionReads the next line from the buffer and converts to a string array. The results are stored inpeekedLinesandpeekedLine.- Throws:
java.io.IOException- If bad things happen during the read
-
validateLine
private void validateLine(long lastSuccessfulLineRead, java.lang.String nextLine) throws CsvValidationExceptionRuns all line validators on the input.- Parameters:
lastSuccessfulLineRead- The line number for error messagesnextLine- The input to be validated- Throws:
CsvValidationException- Only thrown if a user-supplied validator throws it
-
validateResult
protected void validateResult(java.lang.String[] result, long lineStartOfRow) throws CsvValidationExceptionIncrements the number of records read if the result passed in is not null.- Parameters:
result- The result of the read operationlineStartOfRow- Line number that the row started on- Throws:
CsvValidationException- if there is a validation error caught by a custom RowValidator.
-
combineResultsFromMultipleReads
protected java.lang.String[] combineResultsFromMultipleReads(java.lang.String[] buffer, java.lang.String[] lastRead)For multi-line records this method combines the current result with the result from previous read(s).- Parameters:
buffer- Previous data read for this recordlastRead- Latest data read for this record.- Returns:
- String array with union of the buffer and lastRead arrays.
-
getNextLine
protected java.lang.String getNextLine() throws java.io.IOExceptionReads the next line from the file.- Returns:
- The next line from the file without trailing newline, or null if there is no more input.
- Throws:
java.io.IOException- If bad things happen during the read
-
getMultilineLimit
public int getMultilineLimit()
Only useful for tests.- Returns:
- The maximum number of lines allowed in a multiline record.
-
isClosed
protected boolean isClosed() throws java.io.IOExceptionChecks to see if the file is closed.Certain
IOExceptions will be passed out, as they are indicative of a real problem, not that the file has already been closed. These exceptions are:- CharacterCodingException
- CharConversionException
- FileNotFoundException
- UnsupportedEncodingException
- UTFDataFormatException
- ZipException
- MalformedInputException
- Returns:
trueif the reader can no longer be read from- Throws:
java.io.IOException- IfverifyReader()was set totruecertainIOExceptions will still be passed out as they are indicative of a problem, not end of file.
-
close
public void close() throws java.io.IOExceptionCloses the underlying reader.- Specified by:
closein interfacejava.lang.AutoCloseable- Specified by:
closein interfacejava.io.Closeable- Throws:
java.io.IOException- If the close fails
-
iterator
public java.util.Iterator<java.lang.String[]> iterator()
Creates an Iterator for processing the CSV data.- Specified by:
iteratorin interfacejava.lang.Iterable<java.lang.String[]>- Returns:
- A String[] iterator.
-
verifyReader
public boolean verifyReader()
Returns if the CSVReader will verify the reader before each read.By default the value is true, which is the functionality for version 3.0. If set to false the reader is always assumed ready to read - this is the functionality for version 2.4 and before.
The reason this method was needed was that certain types of readers would return false for their ready() methods until a read was done (namely readers created using Channels). This caused opencsv not to read from those readers.
- Returns:
- True if CSVReader will verify the reader before reads. False otherwise.
- Since:
- 3.3
- See Also:
- Bug 108
-
getLinesRead
public long getLinesRead()
This method returns the number of lines that has been read from the reader passed into the CSVReader.Given the following data:
First line in the file some other descriptive line a,b,c a,"b\nb",c
With a CSVReader constructed like so:
CSVReader c = builder.withCSVParser(new CSVParser())
.withSkipLines(2)
.build();
The initial call to getLinesRead() will be 0. After the first call to readNext() then getLinesRead() will return 3 (because the header was read). After the second call to read the blank line then getLinesRead() will return 4 (still a read). After the third call to readNext(), getLinesRead() will return 6 because it took two line reads to retrieve this record. Subsequent calls to readNext() (since we are out of data) will not increment the number of lines read.- Returns:
- The number of lines read by the reader (including skipped lines).
- Since:
- 3.6
-
getRecordsRead
public long getRecordsRead()
Used for debugging purposes, this method returns the number of records that has been read from the CSVReader.Given the following data:
First line in the file some other descriptive line a,b,c a,"b\nb",c
With a CSVReader constructed like so:
CSVReader c = builder.withCSVParser(new CSVParser())
.withSkipLines(2)
.build();
The initial call to getRecordsRead() will be 0. After the first call to readNext() then getRecordsRead() will return 1. After the second call to read the blank line then getRecordsRead() will return 2 (a blank line is considered a record with one empty field). After third call to readNext() getRecordsRead() will return 3 because even though it reads to retrieve this record, it is still a single record read. Subsequent calls to readNext() (since we are out of data) will not increment the number of records read.An example of this is in the linesAndRecordsRead() test in CSVReaderTest.
- Returns:
- The number of records (array of Strings[]) read by the reader.
- Since:
- 3.6
- See Also:
- Feature Request 73
-
skip
public void skip(int numberOfLinesToSkip) throws java.io.IOExceptionSkip a given number of lines.- Parameters:
numberOfLinesToSkip- The number of lines to skip- Throws:
java.io.IOException- If anything bad happens when reading the file- Since:
- 4.2
-
setErrorLocale
public void setErrorLocale(java.util.Locale errorLocale)
Sets the locale for all error messages.- Parameters:
errorLocale- Locale for error messages. If null, the default locale is used.- Since:
- 4.2
-
peek
public java.lang.String[] peek() throws java.io.IOExceptionReturns the next line from the input without removing it from the CSVReader and not running any validators. Subsequent calls to this method will continue to return the same line until a call is made toreadNext()or any other method that advances the cursor position in the input. The first call toreadNext()after calling this method will return the same line this method does.- Returns:
- The next line from the input, or
nullif there are no more lines - Throws:
java.io.IOException- If bad things happen during the read operation- Since:
- 4.2
-
flexibleRead
private java.lang.String[] flexibleRead(boolean popLine, boolean validate) throws java.io.IOException, CsvValidationExceptionReads a line of input, popping or validating as desired.- Parameters:
popLine- Whether the line returned should be popped off the queue of input. If this istrue, this method consumes the line and further calls will return the next line of input. Iffalse, the line returned stays in the queue and further calls to this method will return the same line again.validate- Whether all user-supplied validators should be run.- Returns:
- The next line of input
- Throws:
java.io.IOException- If this exception is thrown while readingCsvValidationException- If a user-supplied validator throws it
-
-