C # определяет, существует ли строка в файле, прежде чем пытаться прочитать подстроку - PullRequest
0 голосов
/ 13 октября 2018

Я хочу прочитать настройки из текстового файла.

string MySettingsFile = "Settings.txt";

Обычно файл имеет 4 строки.

SettingA:Alpha1
SettingB:Bravo2
SettingC:Charlie1
SettingD:Delta6

Я хочу получить каждую строку в своей переменнойПримерно так:

string MyAlpa = "Alpha1";
string MyBravo = "Bravo2";
string MyCharlie = "Charlie1";
string MyDelta = "Delta6";

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

MyDelta = MyDeltaSubstring(MyDelta.LastIndexOf(':') + 1);

Есть ли способ«проверить наличие определенной строки» перед тем, как я попытаюсь получить SubString (чтобы она не получала ошибку), как в отдельной функции, которая имеет try, catch, наконец, с возвратом либо нужной мне строки, либослово "отсутствует", если эта строка отсутствует (а затем прекратить, поскольку больше нет строк)?

function DoesLineExist(int X, string myFile)
{
    string MyString;

    try ()
    {
        // read line X from file myFile
        // get everything AFTER the ":" and put it in MyString
        // ??? //
    }
    catch (ArgumentException null)
    {
        MyString = "Missing";
    }
    catch (ArgumentException e)
    {
        MyString = "Missing";
    }

    finally
    {
        MyString = ? // whatever we got From Line X (after ":")
    }
    return MyString; // only if line is missing
}

Есть ли лучший способ сделать это?ReadAllLines или что-то может быть?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

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

Здесь я создаю консольное приложение для демонстрационных целей.

class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, string> dictSettings = new Dictionary<string, string>();

        string MyAlpa = "";
        string MyBravo = "";
        string MyCharlie = "";
        string MyDelta = "";

        var lines = File.ReadAllLines(@"C:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4\Files\Sample.txt");
        for (var i = 0; i < lines.Length; i += 1)
        {
            var line = lines[i];
            //DoesLineExist(line);

            if (!string.IsNullOrEmpty(line) && line.Contains(":"))
            {
                string settingKey = line.Split(':')[0];
                string settingValue = line.Split(':')[1];
                dictSettings.Add(settingKey, settingValue);
            }
        }


        MyAlpa = dictSettings.ContainsKey("SettingA") ? dictSettings["SettingA"] : "";
        MyBravo = dictSettings.ContainsKey("SettingB") ? dictSettings["SettingB"] : "";
        MyCharlie = dictSettings.ContainsKey("SettingC") ? dictSettings["SettingC"] : "";
        MyDelta = dictSettings.ContainsKey("SettingD") ? dictSettings["SettingD"] : "";

        Console.WriteLine(MyAlpa);
        Console.WriteLine(MyBravo);
        Console.WriteLine(MyCharlie);
        Console.WriteLine(MyDelta);

        Console.ReadLine();
    }

    //private static void DoesLineExist(string line)
    //{
    //    if (!string.IsNullOrEmpty(line) && line.Contains(":"))
    //    {
    //        string settingKey = line.Split(':')[0];
    //        string settingValue = line.Split(':')[1];
    //        dictSettings.Add(settingKey, settingValue);
    //    }
    //}
}

Ввод:

SettingA:Alpha1
SettingB:Bravo2
SettingC:Charlie1

Вывод:

enter image description here

Ввод:

SettingA:Alpha1
SettingC:Charlie1
SettingD:

Выход:

enter image description here

0 голосов
/ 13 октября 2018

Вот несколько разных способов построения словаря или списка объектов, которые мы будем использовать позже.Выбор прост, являются ли эти ключи уникальными или у вас есть несколько значений для некоторых SettingB.Если отношение одно-одно, Словарь может быть решением.Предоставление вам доступа к методу, например ContainsKey

var regexDictionary = Regex.Matches(    File.ReadAllText(path)
                                , "(?<key>.+):(?<value>.+)")
                      .OfType<Match>()
                      .Where(m => m.Success)
                      .ToDictionary(m => m.Groups["key"].Value.Trim(),
                                    m => m.Groups["value"].Value.Trim());

var ObjList = File.ReadAllLines(path)
                     .Select(line => line.Split(':'))
                     .Select(x => new MyObject { 
                        prop1 = x[0],
                        prop2 = x[1]
                        // etc 
                      })

var linQDictionary = File.ReadAllLines(path)
                         .Select(line => line.Split(':'))
                         .ToDictionary(
                             c => x[0],
                             c => x[1]
                         );

Существует ли ключ в словаре?

if (!dictionary .ContainsKey("SettingB"))
{
    Console.WriteLine("For key = \"SettingB\", value = {0}.", dictionary["SettingB"]);
}

В списке объектов:

if (ObjList .Any(x=> x.prop1 == "SettingZ" ))
{
    // Select the object. 
}
...