c # String Query - Получение последней версии файла - PullRequest
0 голосов
/ 26 февраля 2019

Я пишу приложение для формы, в котором оно отображает все файлы PDF из каталога в Datagridview.Теперь формат имени файла обычно 12740-250-B-File Name (так в основном XXXXX-XXX-X-XXXXXXX).Таким образом, первое число - это номер проекта, второе число, за которым следует тире, - это номер серии, а буква - это версия файла.

Я бы хотел, чтобы при нажатии была кнопка, она найдет файлы с тем же номером серии (XXXXX-Series No - Revision - XXXXXX) и покажет мне последнюю версию, которая будет самой большой буквой,Поэтому между 12763-200-A-HelloWorld и 12763-200-B-HelloWorld я хочу, чтобы 12763-200-B-HelloWorld был результатом моего запроса.

Вот что я получил до сих пор:

private void button1_Click(object sender, EventArgs e)
{

}

private void button2_Click(object sender, EventArgs e)
{
    String[] files = Directory.GetFiles(@"M:\Folder Directory","*.pdf*", SearchOption.AllDirectories);
    DataTable table = new DataTable();
    table.Columns.Add("File Name");

    for (int i = 0; i < files.Length; i++)
    {
        FileInfo file = new FileInfo(files[i]);
        table.Rows.Add(file.Name);

    }
    dataGridView1.DataSource = table;
}

Заранее спасибо.

Примечание. В конце файлы с последней редакцией будут вставлены в таблицу Excel.

Ответы [ 4 ]

0 голосов
/ 26 февраля 2019

На мой взгляд, это хорошая ситуация для использования словаря!Вы можете попробовать следующее:

        String[] files = new string[5];

        //group of files with the same series number
        files[0] = "12763-200-A-HelloWorld";
        files[1] = "12763-200-X-HelloWorld";
        files[2] = "12763-200-C-HelloWorld";

        //another group of files with the same series number
        files[3] = "12763-203-C-HelloWorld";
        files[4] = "12763-203-Z-HelloWorld";

        //all the discting series numbers, since split will the de second position of every string after the '-'
        var distinctSeriesNumbers = files.Select(f => f.Split('-')[1]).Distinct();
        Dictionary<String, List<String>> filesDictionary = new Dictionary<string, List<String>>();

         //for each series number, we will try to get all the files and add them to dictionary
        foreach (var serieNumber in distinctSeriesNumbers)
        {
            var filesWithSerieNumber = files.Where(f => f.Split('-')[1] == serieNumber).ToList();
            filesDictionary.Add(serieNumber, filesWithSerieNumber);
        }

        List<String> listOfLatestSeries = new List<string>();

        //here we will go through de dictionary and get the latest file of each series number
        foreach (KeyValuePair<String, List<String>> entry in filesDictionary)
        {
            listOfLatestSeries.Add(entry.Value.OrderByDescending(d => d.Split('-')[2]).First());
        }

        //now we have the file with the last series number in the list 
        MessageBox.Show(listOfLatestSeries[0]); //result : "12763-200-X-HelloWorld"
        MessageBox.Show(listOfLatestSeries[1]); //result : "12763-203-Z-HelloWorld";
0 голосов
/ 26 февраля 2019

Предполагается, что ваша коллекция представляет собой список имен файлов, который является результатом Directory.GetFiles ("");Ниже linq будет работать.Для работы нижеприведенного кода вы должны быть уверены в формате файла, поскольку разбиение очень чувствительно к конкретному формату файла.

var seriesNumber = "200";
var files = new List<string> { "12763-200-A-HelloWorld", "12763-200-B-HelloWorld" };

var matching = files.Where(x => x.Split('-')[1] == seriesNumber)
                    .OrderByDescending(x => x.Split('-')[2])
                    .FirstOrDefault();

Результат :

Соответствие: "12763-200-B-HelloWorld"

0 голосов
/ 26 февраля 2019

Вы можете попробовать следующее:

string dirPath = @"M:\Folder Directory";
string filePattern = "*.pdf";

DirectoryInfo di = new DirectoryInfo(dirPath);
FileInfo[] files = di.GetFiles(filePattern, SearchOption.AllDirectories);

Dictionary<string, FileInfo> matchedFiles = new Dictionary<string, FileInfo>();

foreach (FileInfo file in files)
{
    string filename = file.Name;
    string[] seperatedFilename = filename.Split('-');

    // We are assuming that filenames are consistent
    // As such,
    // the value at seperatedFilename[1] will always be Series No
    // the value at seperatedFilename[2] will always be Revision
    // If this is not the case in every scenario, the following code should expanded to allow other cases
    string seriesNo = seperatedFilename[1];
    string revision = seperatedFilename[2];

    if (matchedFiles.ContainsKey(seriesNo))
    {
        FileInfo matchedFile = matchedFiles[seriesNo];
        string matchedRevision = matchedFile.Name.Split('-')[2];

        // Compare on the char values - https://docs.microsoft.com/en-us/dotnet/api/system.string.compareordinal?view=netframework-4.7.2
        // If the value is int, then it can be cast to integer for comparison
        if (String.CompareOrdinal(matchedRevision, seriesNo) > 0)
        {
            // This file is higher than the previous
            matchedFiles[seriesNo] = file;
        }
    } else
    {
        // Record does not exist - so its is added by default
        matchedFiles.Add(seriesNo, file);
    }
}

// We have a list of all files which match our criteria
foreach (FileInfo file in matchedFiles.Values)
{
    // TODO : Determine if the directory path is also required for the file
    Console.WriteLine(file.FullName);
}

Он разбивает имя файла на составные части и сравнивает редакцию, где совпадают имена серий;сохранение результата в словаре для дальнейшей обработки позже.

0 голосов
/ 26 февраля 2019

Этого можно добиться с помощью следующих шагов:

  1. Разделить имя файла по отношению к "-"

    string [] splittedFileName = fileName.Split ('-');

Когда имя файла 12763-200-A-HelloWorld , он выдает 4 значения как 12763, 200, A, HelloWorld .

При этом значение в индексе 2 является номером вашей ревизии.т.е. splittedFileName [2] .

Получите эквивалентное целочисленное значение для того же самого, используя TryParse , как показано ниже.

int value = Int32.TryParse (splittedFileName [2]);

Теперь сравните значение int и найдите большее значение , чтобы получитьпоследняя редакция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...