从数组中获取具有相同/相似名称的文件

问题描述 投票:-1回答:2

我有一个数组中的多个对象格式:

id_name_date_filetype。

我需要使用所有对象,让我们说相同的id或相同的名称,并将它们插入一个新的数组。使用GetFiles方法我已经将所有对象放在一个数组中并且我有他们的名字,但我不知道如何区分它们。 我有一个foreach我将通过所有的对象,但我有点卡住了。关于我该怎么办的任何提示?

//Process the files
string[] filelist = Directory.GetFiles(SourceDirectory, "*.tsv*", SearchOption.TopDirectoryOnly).Select(filename => Path.GetFullPath(filename)).Distinct().ToArray();

foreach (string file in filelist)
{
    string[] fileNameSplit = file.Split('_');
    switch (fileNameSplit.Last().ToLower())
    {
        case "assets.tsv":
            assets = ReadDataFromCsv<Asset>(file);
            break;
        case "financialaccounts.tsv":
            financialAccounts = ReadDataFromCsv<FinancialAccount>(file);
            break;
        case "households.tsv":
            households = ReadDataFromCsv<Household>(file);
            break;
        case "registrations.tsv":
            registrations = ReadDataFromCsv<Registration>(file);
            break;
        case "representatives.tsv":
            representatives = ReadDataFromCsv<Representative>(file);
            break;
    }
}

// Find all files from one firm and insert them in a list
foreach (string file in filelist)
{

}
c# arrays
2个回答
0
投票

这是我在评论中提出的linq方法:

首先从您的文件列表中获取所有不同的ID

string [] allDistinctIDs = filelist.Select(x=>x.Split('_').First()).Distinct(). ToArray();

现在,您可以遍历ID列表并比较每个值

for (int i = 0; i < allDistinctIDs.Length; i++)
{
    string [] allSameIDStrings = filelist.Where(x=>x.Split('_').First() == allDistinctIDs[i]).ToArray();    
}

基本上你用'_'分割每个项目,并将字符串的第一个(id部分)与不同ID列表中的每个项目进行比较。

另一种方法是使用GroupBy

// example input
string[] filelist = {
    "123_Name1_xxx_Asset.tsv", 
    "456_Name2_xxx_Asset.tsv", 
    "123_Name3_xxx_HouseHold.tsv", 
    "456_Name4_xxx_HouseHold.tsv"};

IEnumerable<IGrouping<string, string>> ID_Groups = filelist.GroupBy(x=>x.Split('_').First());

这将为您提供按ID分组的所有文件名的集合:

enter image description here

ID_Groups的每个位置都是具有相同ID的项目列表。您可以按fileName过滤它们:

foreach (var id_group in ID_Groups)
{
    assets = ReadDataFromCsv<Asset>(id_group.FirstOrDefault(x=>x.ToLower().Contains("assets.tsv")));
    // and so on
    households = ReadDataFromCsv<Household>(id_group.FirstOrDefault(x=>x.ToLower().Contains("households.tsv")));
}

0
投票

你必须为你定义什么是“相似的”。它可能是文件名的首字母?一半吗?整个文件名?

如果不使用Linq或者比循环更复杂的东西,这个函数应该或多或少地做你想要的。

var IDOffileNameIWant = object.GetFiles()[0].id;
List<string> arrayThatContainsSimilar = new List<string>();

foreach(var file in object.GetFiles())
{

    if(file.Name.Split('_')[0].Contains(IDOffileNameIWant))
    {
        arrayThatContainsSimilar.Add(file.Name);
    }
}

这是非常基础的,可以进行改进,但你必须提供更多关于你想要获得的确切结果的细节。

既然你还在苦苦挣扎,这是一个有效的例子:

List<string> files = new List<string>() {
    "123_novica_file1", "123_novica_file3", "123_novica_file2", "456_myfilename_file1",
    "789_myfilename_file1", "101_novica_file2", "102_novica_file3"};

List<string> filesbyID = new List<string>();
List<string> filesbyName = new List<string>();

string theIDPattern = "123";
string theFileNamePattern = "myfilename";

foreach(var file in files)
{
    //splitting the filename and checking by ID
    if(file.Split('_')[0].Contains(theIDPattern))
    {
        filesbyID.Add(file);
    }

    //splitting the filename and checking by name
    if (file.Split('_')[1].Contains(theFileNamePattern))
    {
        filesbyName.Add(file);
    }
}

结果:

id的文件:

123_novica_file1

123_novica_file3

123_novica_file2

文件名称:

456_myfilename_file1

789_myfilename_file1

© www.soinside.com 2019 - 2024. All rights reserved.