2011-09-26 82 views
0

我需要从ASP .NET中的文本文件中提取数据。编辑并从文本文件中提取数据(ASP .NET)

实施例的数据:

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

我将要创建的每个是不是一个注释行的GUI控制。 什么是提取每一行并确定它是字符串还是布尔值的最佳方式。 性能是必须的,因为该文件可能相当大。

编辑:在某些时候,我将需要更新网页中更新的值。

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

你尝试过什么?你能发布你的代码并解释你在哪里遇到困难吗? – Oded

+1

这是我们的作业,或者你做了什么? – sikender

+0

数据=值属于哪个类别?或者到底要做什么..不清楚 – V4Vendetta

回答

2

这样的事情呢?但是,我认为对这种模式进行任何形式的认真的类型识别都可能是容易出错的。为什么不首先使用更好的序列化?在序列化数据中捕获类型信息的东西?

var [email protected]" ; 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

也许你应该为每一行运行这段代码,因为源文件可能“非常大” –

0
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 
     } 
    } 
}