Редактирование и извлечение данных из текстового файла (ASP .NET) - PullRequest
0 голосов
/ 26 сентября 2011

Мне нужно извлечь данные из текстового файла в ASP .NET.

Пример данных:

    ; comment
    data = astringvalue
    ; comment
    ; string values
    person = bob
    animal = rabbit
    ; boolean values (yes / no)
    isValid = yes
    isAnimal = no

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

Редактировать: В какой-то момент мне нужно будет обновить значения с обновленными на веб-странице.

private void ShowConfig()
    {
    string configLine = String.Empty;
using (TextReader tr = File.OpenText(@"textfile"))
            {
            do
                {
                configLine = tr.ReadLine();
                if (!String.IsNullOrEmpty(configLine) && !configLine.Contains(Convert.ToChar(";")))
                    {
                    CreateControl(configLine);
                    }
                } while (configLine != null);
            }   

private void CreateControl(string configline)
    {
    string lineHeader = string.Empty;
    string lineValue = String.Empty;
    for (int i = 0; i < configline.Length; i++)
        {
        if (configline[i] == Convert.ToChar("="))
            {
            lineHeader = configline.Remove(i).TrimEnd();
            lineValue = configline.Remove(0, ++i).TrimStart();
            if (GetValueType(lineValue) is CheckBox)
                {
                this.Panel1.Controls.Add(CreateCheckBox(lineValue, lineHeader));
                }
            else
                {
                this.Panel1.Controls.Add(CreateLabel(lineHeader));
                this.Panel1.Controls.Add(CreateTextBox(lineValue, lineHeader));
                }
            this.Panel1.Controls.Add(CreateNewLine());
            break;
            }
        }
    }

private Control GetValueType(string Value)
    {
    switch (Value)
        {
        case "yes":
        case "no":
            return new CheckBox();
        default:
            return new TextBox();
        }
    }

В будущем мне нужно будет проверить больше типов значений, чем строка и логическое значение.

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Как насчет этого?Тем не менее, я думаю, что включение любого вида серьезного распознавания типов в эту схему, вероятно, будет подвержено ошибкам.Почему бы не использовать лучшую сериализацию в первую очередь?Что-то, что фиксирует информацию о типе в сериализованных данных?

var data=@" ; comment
    data = value
    ; comment
    ; string values
    person = Bob
    animal = Rabbit
    ; boolean values (yes / no)
    isValid = yes
    isAnimal = no";

var parsed = data
    .Split(new[]{"\r\n","\r","\n"}, StringSplitOptions.RemoveEmptyEntries)
    .Select(line => line.Trim())
    .Where(line => !line.StartsWith(";"))
    .Select(line => line.Split('=').Select(item => item.Trim()))
    .Where(kv => kv.Count() == 2)
    .Select(kv => new{key = kv.First(), value = kv.Last()})
    .Select(kv => 
        new{kv.key, kv.value, isBool = Regex.IsMatch(kv.value,"yes|no")});

Принимая комментарии @Rubens на борту, если источник данных слишком велик для одновременной загрузки, вы можете передавать данные с добавлениемвспомогательный метод:

static IEnumerable<string> Lines(string filename)
{
    using (var sr = new StreamReader(filename))
    {
        while (!sr.EndOfStream)
        {
            yield return sr.ReadLine();
        }
    }
}

затем:

Lines(@"c:\path\to\data")
    .Select(line => line.Trim())
    .Where(line => !line.StartsWith(";"))
    .Select(line => line.Split('=').Select(item => item.Trim()))
    .Where(kv => kv.Count() == 2)
    .Select(kv => new{key = kv.First(), value = kv.Last()})
    .Select(kv => 
        new{kv.key, kv.value, isBool = Regex.IsMatch(kv.value,"yes|no")});
0 голосов
/ 26 сентября 2011
StreamReader sr = null;
while(!sr.EndOfStream)
{
    string line = sr.ReadLine();
    if (string.IsNullOrEmpty(line) || line.StartsWith(";")) continue;

    string[] tokens = line.Split("= ".ToCharArray(), 
                                 StringSplitOptions.RemoveEmptyEntries);
    if(tokens.Length == 2)
    {
        if("Yes".Equals(tokens[1], StringComparison.CurrentCultureIgnoreCase) ||
            "No" .Equals(tokens[1], StringComparison.CurrentCultureIgnoreCase))
        {
            // boolean
        }
        else
        {
            // non boolean
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...