1

我有一个包含 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++)
    {}
}
4

3 回答 3

4

您可以简单地循环遍历,保留一个计数器,并且仅在达到定义的条件时才增加“小计数”。

IE。

int smallCount = 1;

for (int recordCount = 0; recordCount < totalRecords; ++recordCount)
{
  if (recordCount % (totalRecords / 10) == 0)
    ++smallCount;
}
于 2013-10-22T14:07:41.260 回答
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++;
}
于 2013-10-22T14:07:43.473 回答
0

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

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

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

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

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

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

与上一个建议的想法相同,仅使用您的平均记录大小的估计值。

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

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

最终后备建议

如果其他建议都不起作用,您总是可以做一个简单的两遍解决方案。在第一个中,只需通读并计算记录数。如果您可以将其放入内存中,请存储每条记录,然后在内存中解析它。如果不能,只需读取文件以计算条目数,然后再次读取。

于 2013-10-22T14:21:03.613 回答