Как мне разбить / сгруппировать текстовый файл? - PullRequest
1 голос
/ 16 июля 2011

Я хочу разделить / сгруппировать этот текст:

[Help]

Group0

[Help Op]

Group1

[Help Mod]

Group2

[Help Member]

Group3

[Help Default]

Group4

Как я могу это сделать?Так что

строка op будет равна Group1, или любой текст под тегом [Help OP]

такой же, как и у других «тегов», так как строка по умолчанию будет равна «group4»

или даже если есть лучший способ изложить это, например, xml или что-то еще.

Ответы [ 4 ]

2 голосов
/ 16 июля 2011

Если вы используете файл xml, вы можете воспользоваться LINQ-TO-XML для обработки операций разбора. Если вы идете с чем-то вроде INI-файла или пользовательской версии, как у вас, вам придется написать свой собственный код синтаксического анализа. Не очень сложно, но дополнительная работа тем не менее. Взгляните на LINQ-TO-XML, если вы не против работать с налогом на угловые скобки. Здесь - учебник, с которого можно начать.

ПРИМЕЧАНИЕ. Я предполагаю, что вы работаете с .Net 3.5 или выше. Если это не так, работа с XML - это немного больше.

UPDATE:

Если вы больше склоняетесь к подходу ini, ваши файлы будут выглядеть так:

[Помощь]
Op = Group1
Mod = Group2
Член = Group3
По умолчанию = Group4

[Некоторые другие разделы]
someKey = SomeValue

* * Тысяча двадцать-одина и т.д.

У меня есть простая библиотека, которую я написал, которая может анализировать INI-файл, читать ключи и значения, записывать ключи и значения и сохранять изменения INI-файла (либо в то же место, перезаписывая, либо сохраняя в новый файл). ). Код слишком велик, чтобы публиковать здесь, но я всегда могу где-нибудь его выбросить и поставить ссылку на него.

Чтобы посмотреть значение, это будет выглядеть примерно так:

var ini = new IniFile(fileName);

string myValue;

// look up section Help, key Op
if (ini.TryGetValue("Help", "Op", out myValue))
{
    // do something with myValue, which would contain "Group1"
}

// if the result was false, it means the section or the key did not exist.
0 голосов
/ 17 июля 2011
            string s = @"
[Help]

Group0

[Help Op]

Group1

[Help Mod]

Group2

[Help Member]

Group3

[Help Default]

Group4";

            MatchCollection matches = new Regex(@"\[Help ([a-zA-Z]+)\]\s+([^[]+)\s+", RegexOptions.Singleline).Matches(s);

            Dictionary<string, string> result = new Dictionary<string, string>();
            foreach (Match match in matches)
                result[match.Groups[1].Value] = match.Groups[2].Value;

            Console.WriteLine(result["Op"]);
0 голосов
/ 16 июля 2011

Похоже, что вы хотите прочитать файл ini с ключом и данными, существующими в предоставленном формате. Итак, если вы хотите прочитать данные из text file, вы можете сделать

const string HELP = "[Help]", HELP_OP = "[Help Op]", HELP_MOD = "[Help Mod]", HELP_MEMBER = "[Help Member]", HELP_DEFAULT = "[Help Default]";
          string [] strConfig = File.ReadAllLines("G:\\Test.txt");
          Dictionary<string, List<string>> myConfigConfig = new Dictionary<string, List<string>>();
          string curr = string.Empty;
          foreach (string str in strConfig)
          {
              if (str == string.Empty)
                  continue;
              if (str == HELP || str == HELP_OP || str == HELP_MOD || str == HELP_MEMBER || str == HELP_DEFAULT)
              {
                  myConfigConfig.Add(str, new List<string>());
                  curr = str;  
              }
              else
                  myConfigConfig[curr].Add(str);
          }
0 голосов
/ 16 июля 2011

В файле kernel32.dll определены две внешние функции Windows для чтения / записи файлов .ini. Вам необходимо импортировать их в свой код, а затем использовать их:

В VB6 я делал это:

Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

В C # вы делаете это так:

[DllImport("kernel32")]
internal static extern int WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);

[DllImport("kernel32")]
internal static extern int GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, string lpReturnedString, int nSize, string lpFileName);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...