1

我有一个包含喜欢这样写的文件:

[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE].

例如:

[Person]: [Age]-[21], [HairColor]-[Turqoise], [Gender]-[Other].

虽然我熟悉 Linq,但我在弄清楚如何使用 Linq 解析它时遇到了很多麻烦。

我希望能够遍历所有行:

[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE].
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE].
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE].
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE].
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE].
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE].
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE].
[NAME]: [PROPERTY]-[VALUE], [PROPERTY]-[VALUE], [PROPERTY]-[VALUE].

...并对每个检索到的人做一些事情。

有任何想法吗?任何帮助都将不胜感激。

4

3 回答 3

1

你不会用 LINQ 解析它。您将使用正则表达式或类似的东西对其进行解析,然后使用 LINQ 对其进行操作。

例如,使用如下正则表达式:

\[(.*)\]: \[(.*)\]-\[(.*)\], \[(.*)\]-\[(.*)\], \[(.*)\]-\[(.*)\]

并使用括号内的组。

于 2012-09-05T01:41:03.240 回答
1

这是一个例子,如果我有你需要的东西,当然:

        File.ReadAllLines("Utils.txt")
            .Select(s => new
            {
                Name = s.Substring(1, s.IndexOf("]:") - 1),
                Values = s.Substring(s.IndexOf(":") + 2)
                          .Split(new string[] { ", " }, StringSplitOptions.RemoveEmptyEntries)
                          .ToDictionary(l => l.Substring(1, l.IndexOf("]-") - 1),
                                        l => l.Substring(l.IndexOf("-[") + 2).Trim(']'))
            })
            .ToList()
            .ForEach(o =>
                {
                    Console.WriteLine(o.Name);
                    o.Values.ToList().ForEach(p => Console.WriteLine(string.Format("\t{0}:\t{1}", p.Key, p.Value)));
                });

所以,在这里你会得到一个具有两个属性的匿名对象列表:

  1. 只命名一个字符串
  2. 值 - 一对字典,其中键是您的属性,值是您的值

在我的示例中,我通过阅读的内容进行了一个简单的循环,将其打印到控制台中

测试文件(Utils.txt)的内容如下:

[NAME]: [PROPERTY1]-[VALUE1], [PROPERTY2]-[VALUE2], [PROPERTY3]-[VALUE3] 
[Person]: [Age]-[21], [HairColor]-[Turqoise], [Gender]-[Other]

输出:

NAME
    PROPERTY1:  VALUE1
    PROPERTY2:  VALUE2
    PROPERTY3:  VALUE3
Person
    Age:    21
    HairColor:  Turqoise
    Gender: Other
于 2012-09-05T01:53:49.167 回答
1

LINQ 解析:

string input = "[Person]: [Age]-[21], [HairColor]-[Turqoise], [Gender]-[Other].";
var output = input.Split(new[] {':', '-', ','}, StringSplitOptions.RemoveEmptyEntries)
    .Select(s => s.Trim('[', ']', ' ', '.')).ToList();

var name = output.First();
var properties = output.Skip(1).ToList();

var propertyDic = Enumerable.Range(0, properties.Count()/2)
                         .ToDictionary(i => properties.ElementAt(2*i),
                                       i => properties.ElementAt(2*i + 1));
于 2012-09-05T08:22:34.230 回答