C # Текстовый файл и регулярные выражения - PullRequest
0 голосов
/ 15 марта 2011

У меня, похоже, проблема со следующим файлом:

*User Type  0:        Database Administrator
Users of this Type:
                     Database Administrator          DBA         Can Authorise:Y     Administrator:Y
                     DM3 Admin Account               DM3         Can Authorise:Y     Administrator:Y
Permissions for these users:
Data - Currencies                                  Parameters - Database                                Add FRA Deal                                     Reports - Confirmation Production
  Add Currency                                       Amend Database Parameters                          Cancel FRA Deal                                  Reports - System Printer Definitions
  Delete Currency                                  Parameters - Data Retention                          Amend FRA Deal                                     Save System Printers
  Amend Currency                                     Amend Data Retention Parameters                    Amend Settlements Only                           Custom Confs/Tickets
  Amend Currency Rates                             Data - Rate References                               Verify FRA Deal                                    Add Custom Confs/Tickets
  Amend Currency Holidays                            Add Rate Reference                                 Add FRA Deal (Restricted)                          Delete Custom Confs/Tickets
  Add Nostro                                         Delete Rate Reference                              Release FRA Deal                                   Amend Custom Confs/Tickets
  Amend Nostro                                       Amend Rate Reference                             Deal - IRS                                         Reports - System Report Batches
  Delete Nostro                                    Deal - Call Accounts                                 Add IRS Deal                                       Save System Batches
Data - Currency Pairs                                Open Call Account                                  Cancel IRS Deal                                  Reports - View Reports Spooled
  Add Currency Pair                                  Amend Call Account                                 Amend IRS Deal                                   View - Audits
  Delete Currency Pair                               Close Call Account                                 Amend Settlements Only                             Print Audit
  Amend Currency Pair                                Amend Settlements Only                             Verify IRS Deal                                    Print Audit Detail
Data - Books                                       Data - Sales Relationship Mgrs                       Add IRS Deal (Restricted)                          Filter Audit*

Я использую регулярное выражение для проверки каждой строки на наличие шаблона.Всего есть три модели, которые должны соответствовать.Если вы посмотрите на первые три строки, это вся информация, которая должна быть взята из файла.У меня проблема в том, что мое регулярное выражение не соответствует.Кроме того, что нужно сделать, это информация должна быть взята между двух строк .... Как я могу это сделать?

Это код, который у меня есть на данный момент:

        string path = @"C:/User Permissions.txt";
        string t = File.ReadAllText(path);

        //Uses regular expression check to match the specified string pattern
        string pattern1 = @"User Type ";
        string pattern2 = @"Users of this Type:";
        string pattern3 = @"Permissions for these users:";
        Regex rgx1 = new Regex(pattern1);
        Regex rgx2 = new Regex(pattern2);
        Regex rgx3 = new Regex(pattern3);

        MatchCollection matches = rgx1.Matches(t);
        List<string[]> test = new List<string[]>();

        foreach (var match in matches)
        {
            string[] newString = match.ToString().Split(new string[] { @"User Type ", }, StringSplitOptions.RemoveEmptyEntries);

            for (int i = 3; i <= newString.Length; i++)
            {
                test.Add(new string[] { newString[0], newString[1], newString[i - 1] });
            }

        }

        MatchCollection matches2 = rgx2.Matches(t);
        List<string[]> test2 = new List<string[]>();

        foreach (var match2 in matches2)
        {
            string[] newString = match2.ToString().Split(new string[] { @"Permissions for these users: ", }, StringSplitOptions.RemoveEmptyEntries);

            for (int i = 3; i <= newString.Length; i++)
            {
                test2.Add(new string[] { newString[0], newString[1], newString[i - 1] });
            }

        }

        MatchCollection matches3 = rgx3.Matches(t);
        List<string[]> test3 = new List<string[]>();

        foreach (var match3 in matches3)
        {
            string[] newString = match3.ToString().Split(new string[] { @"Users of this Type: ", }, StringSplitOptions.RemoveEmptyEntries);

            for (int i = 3; i <= newString.Length; i++)
            {
                test3.Add(new string[] { newString[0], newString[1], newString[i - 1] });
            }

        }
        foreach (var line in test)
        {
            Console.WriteLine(line[0]);
            Console.ReadLine();
        }
        Console.ReadLine();

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

Ответы [ 2 ]

0 голосов
/ 15 марта 2011

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

Если я правильно понимаю, каждая строка состоит из ключа и значения, поэтому на самом деле нет смысла использовать для этого регулярные выражения.Просто переберите строки и сравните строки.

Вот начало:

string[] lines = @"C:/User Permissions.txt"; string t = File.ReadAllLines(path);
foreach (string line in lines) {
  if (line.StartsWith("User Type ") {
    Console.WriteLine("User type:" + line.Substring(10));
  } else if (line.StartsWith("Users of this Type:") {
    Console.WriteLine("Users:" + line.Substring(19));
  } else if (line.StartsWith("Permissions for these users:") {
    Console.WriteLine("Permissions:" + line.Substring(28));
  }
}

Правка:

Вот как использовать обычный цикл вместо foreach,так что вы можете использовать внутренний цикл, который читает строки:

string[] lines = @"C:/User Permissions.txt"; string t = File.ReadAllLines(path);
int line = 0;
while (line < lines.Length) {
  if (lines[line].StartsWith("User Type ") {
    Console.WriteLine("User type:" + lines[line].Substring(10));
  } else if (lines[line].StartsWith("Users of this Type:") {
    line++;
    while (line < lines.Length && !lines[line].StartsWith("Permissions for these users:")) {
      Console.WriteLine("User: " + lines[line]);
      line++;
    }
  } else if (lines[line].StartsWith("Permissions for these users:") {
    Console.WriteLine("Permissions:" + lines[line].Substring(28));
  }
  line++;
}
0 голосов
/ 15 марта 2011

Вам не удастся извлечь нужные данные из этого txt-дампа, используя reg-exp (и вряд ли используя любую другую технику, не вкладывая слишком много усилий).

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

Проблема лучше всего иллюстрируется тем, что категория Data - Sales Relationship Mgrs находится в одном столбце, тогда как все разрешения для этой категории находятся в следующем столбце.

Пожалуйста, выясните, можно ли получить эту информацию другим способом.

Тем не менее, вот грубая алгоритмическая стратегия для работы с файлом как есть:

  1. Читать файл построчно,
  2. Посмотрите на предопределенные смещения в строке для интересующей вас информации.
  3. Когда вы получаете информацию, размещенную в столбцах, вы можете временно добавлять каждый столбец в отдельные коллекции при разборе каждой строки
  4. Наконец, попытайтесь извлечь привилегии из конкатенации всех временных столбцов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...