2013-05-14 2 views
2

파일 이름의 날짜를 기반으로 디렉토리의 파일을 필터링해야합니다.파일 이름의 날짜에 따라 디렉토리의 파일 필터링

이름은 숫자의 네 그룹이 있습니다

9999.99999.201305021219.99999999.txt 

숫자의 두 번째 그룹에 하나 개 이상의 파일 내가 사용하려는이 반복되면 숫자의 세 번째 그룹의 날짜를 기준으로 한 새로운 (YYYYMMDDHHMM). 디렉토리에이 파일이있는 경우

:

1 1100.04037.201305090945.04542592.TXT 
2 1100.04041.201305091108.04542707.TXT 
3 1100.04041.201305091117.60563353.TXT 
4 1100.04047.201305080942.04541666.TXT 
5 1100.24084.201305021658.04539125.TXT 
6 1100.24084.201305061731.04540560.TXT 

나는 폐기 할 선이 5에서 사람들은 원한다. 난 당신이 폴더를 통해 반복로 값을 저장하기 위해 사전을 사용하는 것이 좋습니다하려는 디렉토리에있는 파일 수에 따라

public static void Main(string[] args) 
    { 
     string directory = @"\\some\net\path"; 
     string[] arquivos = Directory.GetFiles(directory, "1100.*.txt", SearchOption.TopDirectoryOnly); 
     foreach (string arquivo in arquivos) 
     { 
      Console.WriteLine(arquivo.Substring(directory.Length + 1)); 
     } 
     Console.ReadLine(); 
    } 
+0

DateTime.ParseExact 익명 객체는 여기에 당신의 친구입니다. –

답변

3
var files = arquivos 
      .Select(f => new{OrgName = f, Parts = new FileInfo(f).Name.Split('.')}) 
      .GroupBy(x=>x.Parts[1]) 
      .Select(g=>g.OrderByDescending(x=>x.Parts[2]).First().OrgName); 

foreach (string arquivo in files) 
{ 
    ..... 
} 
2

: 이것은 내가 디렉토리의 파일을 반복하는 관리 방법이다. 두 번째 숫자 그룹을 키로 사용하고 키가 이미 사전에 있는지 확인하십시오. 그것이 맞다면 비교할 수있는 것을 수행하여 어느 것을 유지할지 결정할 수 있습니다.

1
var ci = CultureInfo.InvariantCulture; 

// first, parse your input files: 
var parsed = 
from f in arquivos 
let c = Path.GetFileName(f).Split('.') 
select new 
{ 
    Key = c[1], 
    Name = f, 
    Date = DateTime.ParseExact(c[2], "yyyyMMddHHmm", ci) 
}; 

// now, group by file id, and order by file date, 
// picking record by latest date: 
var result = 
parsed.GroupBy(g => g.Key) 
.Select(t => t.OrderByDescending(z => z.Date) 
.Select(z => z.Name).First()).ToList();