Сходство между текстом и именем файла. нужно быть более неточным - PullRequest
0 голосов
/ 24 октября 2019

Я создаю программное обеспечение, которое позволит мне автоматически сортировать музыку по первым 100 диаграммам, выбирая первые 100 на веб-сайте, а также извлекать заголовки из базы данных путей с моего компьютера.

Iуже удалось получить имя исполнителя и названия из топ-100 в моем datagridview. (https://prnt.sc/pnndw1)

Мне также удалось восстановить большинство локальных локализаций музыки на моем ПК, но не все, потому что чувствительный случай блокирует меня ...

Я хотел бы знать, будет ли кто-нибудьу меня есть решение, которое сравнивает значение, данное веб-сайтом, и значение, которое у меня есть на моем компьютере, без использования специальных символов, которые могут помешать, например: ",. | ()" и т. д.

Я бынравится сравнивать только символы и / или, если возможно, сравнивать, если строка содержит все слова заголовка.

Самая большая проблема, которую я хотел бы решить, заключается в том, что: "спасибо, следующая" запятаяэтот заголовок не берется в сравнительном примере

, если мое местоположение файла содержит: "Ramenez la coupe à la maison", но все равно не в том же порядке.

wordResponse = song name.

string wordResponse = item_text.Replace("'", "’").Replace("&", "&");

using (StreamReader myFile = File.OpenText(@"C:\MUSIQUE.txt"))
{
    int count = 0; //counts the number of times wordResponse is found.
    int lineNumber = 0;

    while (!myFile.EndOfStream)
    {
        string line = myFile.ReadLine();
        lineNumber++;
        int position = line.IndexOf(wordResponse, StringComparison.CurrentCultureIgnoreCase);
        if (position != -1)
        {
            count++;
            (dataGridView1.Rows[i].Cells[2] as DataGridViewComboBoxCell).Items.Add(line);
        }
    }

    if (count == 0)
    {
        Console.WriteLine("your word was not found!");
    }
    else
    {
        (dataGridView1.Rows[i].Cells[2] as DataGridViewComboBoxCell).Value = (dataGridView1.Rows[i].Cells[2] as DataGridViewComboBoxCell).Items[0];
    }
    Console.ReadLine();
}

1 Ответ

0 голосов
/ 24 октября 2019

Если я правильно вас понимаю, этот вопрос сводится к следующему:

"Как определить, содержит ли одно предложение все слова другого предложения, игнорируя определенные символы"

Самый простой способ, которым я могу придумать, это сделать:

  1. Удалить специальные символы как из исходной строки, так и из строки поиска
  2. Получить все "слова" изкаждый (разбить их на пробел)
  3. Проверить, содержатся ли все слова в строке поиска в списке слов из исходной строки

Если это так, тоВот несколько вспомогательных методов, которые могут сделать это:

public static bool ContainsWords(string source, string search, 
    List<char> charsToIgnore = null, bool ignoreCase = true)
{
    var comparer = ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal;
    var sourceWords = GetWords(RemoveChars(source, charsToIgnore));
    var searchWords = GetWords(RemoveChars(search, charsToIgnore));

    return searchWords.All(searchWord => sourceWords.Contains(searchWord, comparer));
}

public static string RemoveChars(string input, List<char> charsToRemove)
{
    // If input or charsToIgnore are null or empty, return input
    if (string.IsNullOrEmpty(input) || charsToRemove?.Any() != true) return input;

    return string.Concat(input.Where(chr => !charsToRemove.Contains(chr)));
}

public static List<string> GetWords(string input)
{
    return input?.Split(' ').ToList() ?? new List<string>();
}

При использовании это может выглядеть следующим образом:

public static void Main(string[] args)
{
    var tracks = new List<string>
    {
        "Thank You, Next.",
        "Sweet But Psycho (One of Six Hardstyle Remix)",
    };

    // Note that this prevents someone from searching
    // for all titles that have a comma in the name
    var charsToIgnore = new List<char>
    {
        ',', '.', '!', ';', ':', '(', ')'
    };

    while (true)
    {
        Console.Write("Enter a parital title to search for: ");
        var search = Console.ReadLine();

        var matches = tracks.Where(track => ContainsWords(track, search, charsToIgnore));

        Console.WriteLine($"Matches found: {0}",
            matches.Any() ? string.Join(", ", matches) : "[None]");
    }

    GetKeyFromUser("\nDone! Press any key to exit...");
}

Вывод

enter image description here

Обратите внимание, что это не позволит пользователям искать все заголовки, содержащие один из символов в нашем списке игнорирования, например запятую или скобку:

enter image description here

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