2014-10-28 1 views
0

4000 개가 넘는 항목이있는 목록이 있습니다. 이러한 항목은 XML 블록을 문자열 형식으로 반환하는 메서드를 통해 전달됩니다. 그런 다음이 문자열을 XML 파일에 쓰려면 StreamWriter를 사용해야합니다. 파일 당 1000 개의 "문자열"만 허용됩니다.리스트에 <t>을 n 개의 파일로 나누십시오.

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 개의 파일이있을 것으로 예상하고 있습니다. 1000 개의 항목이있는 4 개의 파일과 나머지 항목이있는 1 개의 다른 파일. 그 순간 나는 처음 500 개의 항목과 마지막 500 개의 항목을 가진 것으로 보이는 파일 하나만을 가져옵니다.

내 루프 구조에 문제가 있음을 알고 있지만 성공적인 구조를 얻는 방법을 찾지 못하는 것 같습니다. 감사합니다

답변

0

파일 이름이 잘못되었다고 생각합니다. else 블록에서 당신은 : 당신이 볼 수 있듯이

sw = new StreamWriter(fileName); 

, 당신은 (새 번호) 새에 파일 이름을 변경하지 않고 새 파일을 만듭니다. 나는 그것이해야한다고 가정

무엇보다
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 
} 

, 당신은 전체 루프 (휴식의 foreach 문을) 중단하고, (처음부터) 다시 차량을 반복하는 원인이 break을 사용했다. 그것은 내가 가정하는 필연적 인 것이 아니다.

외부 - 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)); 
     } 
    } 

}); 
+0

"fileName"을 1000 줄 후에 다시 작성하는 것에 대한 조언을 얻었으며 마술처럼 작동했습니다. – Blair

0

동안. 다음 번에 그렇게 작은 것들을 기억할 것입니다.

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(); 
관련 문제