0

我得到很多行字符串作为输入,看起来像这样。输入是一个字符串,来自

theObjects.Runstate;

每个@VAR;****;@ENDVAR;代表循环中的一条线和一步。

@VAR;Variable=Speed;Value=Fast;Op==;@ENDVAR;@VAR;Variable=Fabricator;Value=Freescale;Op==;@ENDVAR;

我拆分它,以删除不需要的字段,例如@VAR、@ENDVAR 和 Op==。最佳输出将是:

Speed = Fast; 
Fabricator = Freescale; and so on.

我可以删除@VAR 和@ENDVAR。删除“Op==”不会那么难,所以这不是问题的主要焦点。我现在最担心的是,我想将输出打印为文本文件。要打印一个数组,我必须循环它。但是在每次迭代中,当我得到一个新行时,我会用当前拆分的字符串覆盖数组。我认为 Inputfile 的最后一行是一个空字符串,所以我得到的输出只是一个空的文本文件。如果有人可以帮助我,那就太好了。

string[] w;
Textwriter tw2;
foreach (EA.Element theObjects in myPackageObject.Elements)
{
    theObjects.Type = "Object";
    foreach (EA.Element theElements in PackageHW.Elements)
    {
        if (theObjects.ClassfierID == theElements.ElementID)
        {
            t = theObjects.RunState;
            w = t.Replace("@ENDVAR;", "@VAR;").Replace("@VAR;", ";").Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string s in w)
            {
                tw2.WriteLine(s);
            }
        }
    }
}
4

1 回答 1

1

这个 linq-query 给出了预期的结果:

var keyValuePairLines = File.ReadLines(pathInputFile)
    .Select(l =>
    {
        l = l.Replace("@VAR;", "").Replace("@ENDVAR;", "").Replace("Op==;", "");
        IEnumerable<string[]> tokens = l.Split(new[]{';'}, StringSplitOptions.RemoveEmptyEntries)
            .Select(t => t.Split('='));
        return tokens.Select(t => {
            return new KeyValuePair<string, string>(t.First(), t.Last());
        });
    });

foreach(var keyValLine in keyValuePairLines)
    foreach(var keyVal in keyValLine) 
        Console.WriteLine("Key:{0} Value:{1}", keyVal.Key, keyVal.Value);

输出:

Key:Variable         Value:Speed
Key:Value            Value:Fast
Key:Variable         Value:Fabricator
Key:Value            Value:Freescale

如果要将其输出到另一个文本文件,每行有一个键值对:

File.WriteAllLines(pathOutputFile, keyValuePairLines.SelectMany(l => 
    l.Select(kv => string.Format("{0}:{1}", kv.Key, kv.Value))));

根据您在评论中的问题进行编辑:

“我需要更改/添加什么才能使输出变成这样。我需要 AttributeValuePairs,例如:Speed = Fast; 或 Fabricator = Freescale?”

现在我理解了逻辑,你有键值对,但你只对值感兴趣。所以每两个键值都属于一起,一对的第一个值指定属性,第二个值指定该属性的值(fe Speed=Fast)。

然后有点复杂:

var keyValuePairLines = File.ReadLines(pathInputFile)
    .Select(l =>
    {
        l = l.Replace("@VAR;", "").Replace("@ENDVAR;", "").Replace("Op==;", "");
        string[] tokens = l.Split(new[]{';'}, StringSplitOptions.RemoveEmptyEntries);
        var lineValues = new List<KeyValuePair<string, string>>();
        for(int i = 0; i < tokens.Length; i += 2)
        {
            // Value to a variable can be found on the next index, therefore i += 2
            string[] pair = tokens[i].Split('=');
            string key = pair.Last();
            string value = null;
            string nextToken = tokens.ElementAtOrDefault(i + 1);
            if (nextToken != null)
            { 
                pair = nextToken.Split('=');
                value = pair.Last();
            }
            var keyVal = new KeyValuePair<string, string>(key, value);
            lineValues.Add(keyVal);
        }
        return lineValues;
    });

File.WriteAllLines(pathOutputFile, keyValuePairLines.SelectMany(l => 
    l.Select(kv=>string.Format("{0} = {1}", kv.Key, kv.Value))));

使用单个示例行在文件中输出:

Speed = Fast
Fabricator = Freescale
于 2013-09-15T20:29:57.970 回答