2

ファイル名の日付に基づいてディレクトリ内のファイルをフィルタリングする必要があります。

名前には 4 つの数字グループがあります。

9999.99999.201305021219.99999999.txt

2 番目のグループの数字が繰り返されるファイルが複数ある場合、3 番目のグループの数字 (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

2行目と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();
    }
4

3 に答える 3

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)
{
    .....
}
于 2013-05-14T19:41:59.563 に答える
2

ディレクトリ内のファイルの数に応じて、辞書を使用して、フォルダーを反復処理するときに値を保持することをお勧めします。数字の 2 番目のグループをキーとして使用し、そのキーが辞書に既に存在するかどうかを確認できます。そうである場合は、保持するものを決定するために、適合する比較を実行できます。

于 2013-05-14T19:34:06.960 に答える
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();
于 2013-05-14T19:39:23.437 に答える