我正在用 C# 开发一个文件解析器,这样我就有一个包含很多行的文件。我想将其写入数据库。
我创建了一个循环,在其中读取文件并发出插入。
但是,我想做的是读取 100 行然后提交所有 100 行,然后读取下 100 行并提交它们,依此类推。
我的问题(有点概念性)是如何找出最后一组行,因为它可能小于 100。
例如,如果我的文件有 550 行,我可以读取 5 块 100 并在行计数器上使用模运算符提交它们,但最后一批 50 会发生什么?
这方面的任何想法都将受到高度赞赏。
谢谢。
我正在用 C# 开发一个文件解析器,这样我就有一个包含很多行的文件。我想将其写入数据库。
我创建了一个循环,在其中读取文件并发出插入。
但是,我想做的是读取 100 行然后提交所有 100 行,然后读取下 100 行并提交它们,依此类推。
我的问题(有点概念性)是如何找出最后一组行,因为它可能小于 100。
例如,如果我的文件有 550 行,我可以读取 5 块 100 并在行计数器上使用模运算符提交它们,但最后一批 50 会发生什么?
这方面的任何想法都将受到高度赞赏。
谢谢。
在这里顶一下我的想法:
第一个选项,快速计算'\n',从而获得行数。然后,以 2 的倍数读取块,使得结果非常接近行数,例如如果存在 501 行,则读取 250 和 250 的块。然后只剩下 1 行。首次运行代码时,请检查奇数或偶数。如果奇数,记得提交最后一行,否则如果行数是偶数,则不需要对最后一行进行补偿。希望这可以帮助。
PS:将数字除以2的倍数后,如果很大,可以进一步除以2(分而治之!)
大概是这样的吧?以下是伪代码:
int rowCount = 0;
while more records to read
{
// Get record
// Parse record
// Do something with results
if(++rowCount % 100 == 0)
{
// Commit
rowCount = 0;
}
}
// If you have 0 records, you just did a commit (unless you had zero records to read,
// but I assume you can code your way around that!) So you only need a final commit
// if you had more than 0 records still uncommitted.
if(rowCount > 0)
{
// Commit remaining records
}
如果您的 read 函数在没有其他内容可读取时返回 false。那么你可以试试这个。
int i = 1;
while (read())
{
if (i % 100 == 0)
{
for int (j = 0; j < 100; j++)
{
write();
}
}
i++;
}
for (int j = 0; j < i % 100; j++)
{
write();
}