OpenCSV - узнать номер строки

Как узнать фактический номер строки в файле, связанный со строкой, прочитанной классом CSVReader? Я могу сосчитать строки, предполагая, что каждая строка, прочитанная этим классом, является новой строкой в ​​файле. Проблема в том, что в файле CSV могут быть символы новой строки. Так, например, наличие 3 «логических» строк не означает, что у нас есть 3 «физических» строки в файле. У меня есть функция сообщения об ошибках, которая почти всегда сообщает неправильный номер строки из-за этого.

Любые идеи, как определить реальный номер строки в файле? Спасибо!


person Paul    schedule 10.09.2012    source источник


Ответы (3)


Если вы хотите изменить исходный код, вы можете добавить счетчик в

private String getNextLine()

Увеличьте счетчик в двух местах, где

br.readLine();

вызывается и выставляет счетчик как общедоступное свойство.

Если вы не хотите изменять исходный код, для каждой возвращаемой строки CSV вы можете увеличить свой собственный счетчик на 1 + the sum of the newline characters in the CSV line (предположительно, OpenCSV возвращает столбцы, включая символы новой строки, в ваш код, хотя я не проверял это поведение). Если у вас есть столбец A с одной новой строкой и столбец B с двумя новыми строками, фактический файл должен выглядеть примерно так:

"Это

Ячейка А», «И

Клетка

B"

в результате получается 3 символа новой строки (или последовательности \r\n, в зависимости от вашей платформы) плюс 1 строка, возвращаемая OpenCSV. Увеличьте свой счетчик на 4.

person Eric J.    schedule 10.09.2012
comment
Я пытался избежать этих вещей, но я думаю, что это невозможно, поэтому я выберу второй вариант. Спасибо. - person Paul; 12.09.2012

Если вы хотите перейти от API с открытым исходным кодом к Super CSV (который различает физическую строку и строку CSV), то вам будут доступны следующие 3 метода:

/**
 * Gets the current position in the file. 
 * The first line of the file is line number 1.
 * 
 * @since 1.0
 */
int getLineNumber();

/**
 * Returns the untokenized CSV row that was just read 
 * (which can potentially span multiple lines in the file).
 * 
 * @return the untokenized CSV row that was just read
 * @since 2.0.0
 */
String getUntokenizedRow();

/**
 * Gets the current row number (i.e. the number of CSV records - including the 
 * header - that have been read). This differs from the lineNumber, which is 
 * the number of real lines that have been read in the file. 
 * The first row is row 1 (which is typically the header row).
 * 
 * @since 2.0.0
 */
int getRowNumber();
person James Bassett    schedule 12.12.2012