-1

同じ名前を含むドキュメントを連結するツールを作成しています。

例: C_BA_20000_1.pdf および C_BA_20000_2.pdf これらのファイルは、1 つのリストにグループ化する必要があります。そのツールはディレクトリで実行されます

//directory of pdf files
  DirectoryInfo dirInfo = new DirectoryInfo(@"C:\Users\derp\Desktop");

  FileInfo[] fileInfos = dirInfo.GetFiles("*.pdf");
  

foreach (fileInfos 内の FileInfo 情報)

同じ名前のファイル名を含む ArrayList を作成したい

ArrayList list = new ArrayList();
 list.Add(info.FullName);

次に、同様のドキュメントのすべての ArrayLists を含むリストを作成します。

 List<ArrayList> bigList = new List<ArrayList>();

私の質問は、同じ名前を含むファイルをグループ化して同じリストに入れるにはどうすればよいですか。

編集: ファイルの名前は AB_CDEFG_i と同じパターンで、i は 1 ~ n の数字です。同じ名前のファイルは、最後に異なる番号のみを付ける必要があります。

AB_CDEFG_1

AB_CDEFG_2

HI_JKLM_1

出力は次のようになります。

リスト 1: AB_CDEFG_1 と AB_CDEFG_2

リスト 2: HI_JKLM_1

4

4 に答える 4

5

ファイル名の「同じ」部分を抽出するメソッドを作成します。例えば

public string GetRawName(string fileName)
{
    int index = fileName.LastIndexOf("_");
    return fileName.Substring(0, index);
}

グループ化には次の方法を使用します。

var bigList = Directory.EnumerateFiles(@"C:\Users\derp\Desktop", "*.pdf")
                       .GroupBy(file => GetRawName(file))
                       .Select(g => g.ToList())
                       .ToList();

List<List<string>>これは(なしで)返されArrayListます。

更新ここに正規表現があります。これは、末尾に番号があるかどうかに関係なく、すべての種類のファイルで機能します

public string GetRawName(string file)
{
    string name = Path.GetFileNameWithoutExtension(file);
    return Regex.Replace(name, @"(_\d+)?$", "")
}

グループ化:

var bigList = Directory.EnumerateFiles(@"C:\Users\derp\Desktop", "*.pdf")
                       .GroupBy(GetRawName)
                       .Select(g => g.ToList())
                       .ToList();
于 2012-12-07T20:15:43.763 に答える
1

あなたの質問が「同じ名前」の意味を特定していないという事実は別として。これは典型的な解決策です。

fileInfos.GroupBy ( f => f.FullName )
         .Select( grp =>  grp.ToList()  ).ToList();
于 2012-12-07T20:14:21.113 に答える
1

どのファイルが同じかを判断するのが難しいようです。

static string KeyFromFileName(string file)
{
   // Convert from "C_BA_20000_2" to "C_BA_20000"
   return file.Substring(0, file.LastIndexOf("_"));

   // Note: This assumes there is an _ in the filename.
}

次に、この LINQ を使用して、fileSets のリストを作成できます。

using System.Linq; // Near top of file


var files = Directory.GetFiles(@"C:\Users\derp\Desktop", "*.pdf")

var fileSets = files
   .Select(file => file.FullName)
   .GroupBy(KeyFromFileName)
   .Select(g => new {g.Key, Files = g.ToList()}
   .ToList();
于 2012-12-07T20:26:26.537 に答える
0

これにより、リストのリストが表示されます...ファイルにアンダースコアなどが含まれていない場合も例外はスローされません。

private string GetKey(FileInfo fi)
{
    var index = fi.Name.LastIndexOf('_');
    return index == -1 ? Path.GetFileNameWithoutExtension(fi.Name) 
                       : fi.Name.Substring(0, index);
}

var bigList = fileInfos.GroupBy(GetKey)
             .Select(x => x.ToList())
             .ToList();
于 2012-12-07T20:47:14.713 に答える