拆分列表<;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个项目。
我知道我的循环结构一定有问题,但我似乎不知道如何获得一个成功的结构。感谢
我想文件名是错误的。在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();