我需要读取一个有20,000条记录的CSV文件。我不能一下子把所有这些记录都列在一张表里。我们没有使用任何数据库。我们正在通过openCSV框架读取CSV。请告诉我一些方法,这样我就可以阅读csv部分明智的部分,并将列表发送到Servlet进行分页。这是代码的样本,我已经开始实现分页,但它不工作。
private void viewRecords(List<CSVBean> generated)
{
int page = 1;
int recordsPerPage = 100;
int offset = (page - 1) * recordsPerPage;
System.out.println("offset:"+offset);
System.out.println("recordsPerPage:"+recordsPerPage);
for(int i= offset;i<recordsPerPage;i++)
{
CSVBean csvBean = generated.get(i);
System.out.println(csvBean.getAttr1());
System.out.println(csvBean.getAttr2());
System.out.println(csvBean.getAttr3());
System.out.println(csvBean.getAttr4());
System.out.println(csvBean.getAttr5());
}
}
假设有一个变量totalRecords
,用于存储记录的数量。
计算总页数
int totalPages = (int) (totalRecords / recordsPerPage);
if (totalRecords % recordsPerPage > 0) {
totalPages++; // increase totalPages if there's a division remainder
}
向客户端发送totalPages
信息,表示如下信息
page 1 of 199
其中199
为totalPages
现在,计算第一个记录号:
final int firstRecordNumber = (pageNumber - 1) * recordsPerPage + 1;
检查请求的页码是否正确:
if (firstRecordNumber > totalRecords) {
// incorrect page number requested, throw exception, process error, etc
}
那么,现在遍历记录,从firstRecordNumber
开始并将它们打印到输出中。添加一个新变量,如
int printedRecords = 0;
并在循环中增加它。像这样:
String oneRecord = getRecord(firstRecordNumber);
while ( (null != oneRecord) && (printedRecords < recordsPerPage) ) {
printedRecords++;
// print information to output here
oneRecord = getNextRecord();
}
绝对不要使用接受List<CSVBean>
的方法。必须使用CSVReader#readNext()
方法逐个读取CSV行,不能将前面的行存储在内存中。你必须跳过属于前几页的所有行,然后从适当的行构建响应。这当然会增加O(n)的开销,其中n是属于前一个页面的行数。没有办法使用opencsv.