拆分列表<;t>;按n个编号转换为文件

本文关键字:编号 转换 文件 gt 列表 lt 拆分 | 更新日期: 2023-09-27 18:28:00

我有一个包含4000多个项目的列表。这些项通过一个方法传递,该方法以字符串的形式返回XML块。然后,我需要使用StreamWriter将这些字符串写入XML文件。每个文件只允许使用1000个"字符串"。

int elementCount = 0;
int fileNumber = 1;
string fileName = "C:''test''" + DateTime.Now().toString("ddMMyyyy") + "_0" +fileNumber + ".xml";
Do 
{ 
    StreamWriter sw = new StreamWriter(fileName);
    foreach (Vehicles v in vehicles)
    {
        if (elementCount != 1000)
        {
            sw.WriteLine(ConvertCode.ToXml(v));
            elementCount++;
        }
        else
        {
            sw.Close();
            fileNumber++;
            sw = new StreamWriter(fileName);
            elementCount = 0;
            sw.WriteLine(ConvertCode.ToXml(v));
            elementCount++;
            break;
        }
    }
}
while (elementCount < 1000) 

因此,在这段代码的末尾,我预计会有5个文件。4个包含1000个项目的文件和1个包含项目余额的其他文件。在他们的时刻,我只得到一个文件,似乎有前500个项目和最后500个项目。

我知道我的循环结构一定有问题,但我似乎不知道如何获得一个成功的结构。感谢

拆分列表<;t>;按n个编号转换为文件

我想文件名是错误的。在else块中,您有:

sw = new StreamWriter(fileName);

如您所见,您可以创建新文件,而无需将文件名更改为new(表示新编号)。我想应该是:

var currDate = DateTime.Now().toString("ddMMyyyy");
string fileName = "C:''test''" 
                    + currDate + "_0"
                    + fileNumber + ".xml";
....
else
{
    sw.Close();
    fileNumber++;
    fileName = "C:''test''" 
                +  currDate 
                + "_0" + fileNumber 
                + ".xml";
    sw = new StreamWriter(fileName);
    elementCount = 0;
    sw.WriteLine(ConvertCode.ToXml(v));
    elementCount++;
    // break;
    // that break is not neccessary
}

更重要的是,您使用了break,它打破了整个循环(打破了foreach),并导致再次迭代车辆(从一开始)。我想没有必要。

最后一件事——在do...while之外也没有必要,我看不出它有什么目的

BTW这是一个很好的并行算法:

var list = vehicles as IList<Vehicle> ?? vehicles.ToList();
if (!list.Any()) return;
var currDate = DateTime.Now().toString("ddMMyyyy");
var groups = list.Count / 1000;
Parallel.For(0, groups + 1, groupNo => {
  var fileName  = "C:''test''" 
                +  currDate 
                + "_0" + groupNo
                + ".xml";
  using (var sw = new StreamWriter(fileName))
  {
      var limit = Math.Min(groupNo * 1000 + 1000, list.Count);
      for (var i = groupNo * 1000, i < limit; i++)
      {
          var v = list[i];
          sw.WriteLine(ConvertCode.ToXml(v));
      }
  }
});

虽然我的代码看起来与您的完全不同,但您建议的重新创建fileName的事实修复了我的代码。下次会记住那些小事的。

foreach (Vehicle v in vehicles)
{
    if (elementCount < 1000)
    {
        writer.WriteLine(CreateVehicleXmlElement.BuildElement(v));
        elementCount++;
    }
    else if (elementCount == 1000)
    {
         writer.Close();
         fileNumber++;
         elementCount = 0;
         baseName = "c:''test''" + DateTime.Now.ToString("ddMMyyy") + "_0" + fileNumber + ".";
         writer = new StreamWriter(baseName + "xml");
         writer.WriteLine("This is the header that will be filled in later");
         writer.WriteLine(CreateVehicleXmlElement.BuildElement(v));
         elementCount++;
    }
}
writer.Close();