我如何知道文件上与 CSVReader 类读取的行相关联的实际行号?假设此类读取的每一行都是文件中的新行,我可以计算行数。问题是 CSV 文件中可能有换行符。因此,例如,拥有 3 条“逻辑”行并不意味着我们在文件中有 3 条“物理”行。我有一个错误报告功能,因此几乎总是报告错误的行号。
任何想法如何确定文件中的真实行号?谢谢!
我如何知道文件上与 CSVReader 类读取的行相关联的实际行号?假设此类读取的每一行都是文件中的新行,我可以计算行数。问题是 CSV 文件中可能有换行符。因此,例如,拥有 3 条“逻辑”行并不意味着我们在文件中有 3 条“物理”行。我有一个错误报告功能,因此几乎总是报告错误的行号。
任何想法如何确定文件中的真实行号?谢谢!
如果您愿意修改源代码,您可以添加一个计数器
private String getNextLine()
在两个地方增加计数器
br.readLine();
被调用,并将计数器作为公共属性公开。
如果您不想修改源代码,对于返回的每个 CSV 行,您可以将自己的计数器递增1 + the sum of the newline characters in the CSV line
(可能 OpenCSV 正在将包含换行符的列返回到您的代码,尽管我没有测试过这种行为)。如果 A 列有一个换行符,B 列有两个换行符,则实际文件应如下所示:
“这是
单元格 A","和
细胞
乙"
产生 3 个换行符(或 \r\n 序列,取决于您的平台),加上 OpenCSV 返回的 1 行。将您的计数器增加 4。
如果您愿意将开源 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();
您写道,您需要错误报告的行号。
该类CsvException
有一个getLineNumber
您可以使用的方法。
当然,这仅在您有异常时才有效。