2014-02-16 2 views
0

다른 버전의 모든 파일을 사용할 수있는 디렉토리가 있습니다. 처럼,파일 일괄 처리 알고리즘

ABC.pdf ABC_1.pdf .......

XYZ.tif ..... XYZ_25.tif

MNO.tiff

사용 된 요구 사항에 따라 m 개의 파일을 n 번 배치하고 싶습니다.

폴더에 ABC.pdf가 ABC_24.pdf & XYZ.tif ~ XYZ_24.tif 파일로 있다고 가정합니다. 총 50 개의 파일. 각각 25 개의 파일로 이루어진 두 개의 일괄 처리를 만들고 싶습니다. 그래서, 먼저 목록에있는 모든 파일이 정렬되어 있는지 확인한 다음 목록을 두 개의 적절한 일괄 처리로 나눌 논리를 수행 할 수 있어야합니다.

ABC_24.pdf

2) XYZ.tif XYZ_24.tif

하지만 (26 개 파일이있는 경우 시작에 설명 된대로) 다음은 같은 것까지

1) ABC.pdf

ABC_24.pdf

1) ABC.pdf

2) XYZ.tif XYZ_24.tif에

3) ABC_2 5.pdf 및 XYZ_25.tif

그래서 여기에 적절한/의미있는 일괄 파일 할당을 원합니다. 가능한 한 적은 수의 라인으로 수행하는 것을 선호합니다. 그래서, 나는 다음과 같이 람다 식 시도 :

List<string> strIPFiles = Directory.GetFiles(folderPath, "*.*"). 
Where(file => file.ToLower().EndsWith("tiff") || file.ToLower().EndsWith("tif") || file.ToLower().EndsWith("pdf")).ToList(); 

int batches = 2, filesPerBatch = 25; //for example 

내가 사용해야합니까 - strIPFiles.Sort를(); 어쨌든 유용 할 것인가 아니면 항상 정렬 된 파일 목록을 얻을 것인가?

목록에서 배치를 만드는 방법 - 위에서 람다 식을 사용하여 람다 식을 사용합니까?

도움 주셔서 감사합니다.

+1

당신은 항상 정렬 된 순서로 파일을받지 않습니다. 'OrderBy' 확장 메소드를 사용하여 정렬하거나'List.Sort'를 호출 할 수 있습니다. –

+0

"적절"하고 "의미있는"배치 할당을 정의 할 수 있습니까? –

+0

@ zespri, 두 가지 일괄 생성 예제를 확인하십시오. 첫 번째는 25-25이고 두 번째는 25-25-2입니다. 첫 번째 예에서는 총 50 개의 파일이 있습니다. 여기서 ABC & ABC_n (1 <= n <= 24)은 첫 번째 예제 첫 번째 배치에 있습니다. 두 번째 배치에서 XYZ & XYZ_n (1 <= n <= 24)에 대해서도 마찬가지입니다. 두 번째 예 (no. 파일의 52, ABC_25 & XYZ_25 세 번째 배치됩니다. 뜻 깊은 의미는 가능한 경우 서로 다른 버전의 파일을 동일한 배치에 배치하고 가능한 한 많이 그룹화하는 것을 의미합니다 (두 번째 예와 같이). 그것이 지금 이해 될 것이기를 바란다. 감사. – sapatelbaps

답변

3

내가 귀하의 질문을 완전히 이해하고 있는지 확실하지 않습니다. 나는 당신이 (파일의 #에서와 같이) 지정된 크기의 배치로 파일을 나눌 방법을 찾고 있다고 가정하고 파일 이름에 따라 그룹화하기를 원한다고 가정합니다.

이 도움이됩니다 알려줘 :

public static void CreateBatch(int batchSize) 
    { 
     string sourcePath = @"C:\Users\hari\Desktop\test"; 

     var pdfs = Directory.EnumerateFiles(sourcePath, "*.pdf", SearchOption.TopDirectoryOnly); 
     var tiffs = Directory.EnumerateFiles(sourcePath, "*.tiff", SearchOption.TopDirectoryOnly); 

     var images = pdfs.Union(tiffs); 

     var imageGroups = from image in images 
          group image by Regex.Replace(Path.GetFileNameWithoutExtension(image), @"_\d+$", "") into g 
          select new { GroupName = g.Key, Files = g.OrderBy(s => s) }; 

     List<List<string>> batches = new List<List<string>>(); 
     List<string> batch = new List<string>(); 

     foreach (var group in imageGroups) 
     { 
      batch = batch.Union(group.Files).ToList<string>(); 

      if (batch.Count >= batchSize) 
      { 
       batches.Add(batch); 
       batch = new List<string>(); 
      } 
     }    
    } 
관련 문제