循环记录并分批处理

时间:2013-10-22 14:04:01

标签: c#

我有一个包含X个记录的文本文件,这些记录有24个以管道分隔的字段。

 ABCDEFG|123456|BILLING|1234567|12345678|12345678|...

我关注的是BILLING列。我需要用当前日期和序号BILLING-20131021-1附加这个单词,但这里有诀窍:数字可以或必须仅增加记录的每10%。例如,如果我有100条记录,前10条记录将以1结尾,接下来的10条将以2结束,依此类推。如果数字不均匀,则余数将获得下一个序列。

我从两个循环开始,但没有产生结果。第一个循环遍历记录计数,第二个循环遍历前10%的记录,但后来我无法弄清楚如何获取下一批记录。

for (uint recordCount = 0; recordCount < RecordsPerBatch; recordCount++)
{
    for (uint smallCount = 0; smallCount < (RecordsPerBatch / 10)); smallCount++)
    {}
}

3 个答案:

答案 0 :(得分:4)

你可以简单地循环,保留一个计数器,只有当你达到一个定义的条件时才增加“小计数”。

int smallCount = 1;

for (int recordCount = 0; recordCount < totalRecords; ++recordCount)
{
  if (recordCount % (totalRecords / 10) == 0)
    ++smallCount;
}

答案 1 :(得分:3)

维护当前逻辑,您可以添加另一个保留批处理计数器的变量,并简化内循环上的条件,计算批量大小(占总记录的10%)。
此外,有必要检查内循环中的索引器是否不超过总记录数。

uint TotalRecordCounter = 101;
uint currentBatch = 1;
uint batchSize = TotalRecordCounter / 10;

// This will account for batch size that are not exactly divisible for 10.
// But if it is allowed to have more than 10 batches then remove it
// if((TotalRecordCounter % 10) != 0)
//    batchSize++;

for (uint recordCount = 0; recordCount < TotalRecordCounter; recordCount+=batchSize)
{

    for (uint smallCount = 0; 
         smallCount < batchSize && (recordCount+smallCount) < TotalRecordCounter; 
         smallCount++)
    {
         string billing = string.Format("BILLING-{0:yyyymmdd}-{1}", DateTime.Today, currentBatch);

    }
    currentBatch++;
}

答案 2 :(得分:0)

如果我理解正确,那么你说这个问题是在你达到文件阈值的10%(以及20%和30%等)的时候搞清楚。给出一个好的答案很大程度上取决于你的系统能力,但是有很多方法可以用一个循环来完成,在最坏的情况下,你可以在一个非嵌套的循环中完成。

您能找到文件中的确切行数吗?

如果您的文件不是很大,而且您的文件是行分隔的(每行一条记录),这是最简单的解决方案,只需将文件作为字符串数组读入即可。然后,您只需要遍历每一行,并使用current_record / exact_count每次生成最后一个数字。

您能计算文件中的确切行数吗?

如果您的记录是固定长度的,您可以取文件大小,除以记录大小,然后计算确切的记录数,然后生成上面的最后一个数字。

估计文件中的行数是否足够?

与之前的建议相同,只使用您的平均记录大小的估计值。

您使用什么类型的流来读取文件?

如果您可以找到流的总长度和当前位置,则可以使用该值计算百分比,而不是使用行索引。

最终后备建议

如果其他建议都不起作用,您可以随时进行简单的双程解决方案。在第一个中,只需读取并计算记录数。如果您可以将其放入内存中,请存储每条记录,然后将其解析到内存中。如果你不能,只需读取文件来计算条目数,然后再读一遍。