【问题标题】:C#: Loop over Textfile, split it and Print a new TextfileC#:循环文本文件,将其拆分并打印一个新的文本文件
【发布时间】:2013-09-19 22:55:42
【问题描述】:

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

的字符串
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);
            }
        }
    }
}

【问题讨论】:

    标签: c# arrays split text-files


    【解决方案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;或制造商 = 飞思卡尔?”

    现在我理解了逻辑,您有键值对,但您只对值感兴趣。因此,每两个键值都属于一起,一对中的第一个值指定属性,第二个值指定该属性的值(例如 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
    

    【讨论】:

    • 嗨蒂姆,很抱歉再次打扰你,一个小问题。我必须更改/添加什么才能使输出像这样。我需要 AttributeValuePairs,例如:Speed = Fast;或制造商 = 飞思卡尔;是新的 KeyvaluePair 吗??
    • @Alika87:编辑了我的答案。但是,您确实应该尝试更改文件格式,甚至改用数据库。
    • 不幸的是,这是我从外部工具中得到的文件格式,所以我不得不忍受它。非常感谢,您所做的超出了我的要求,但是在您的代码中,似乎 kv.Key 和 kv.Value 是相等的,因此输出是 Speed = Speed 而不是 Speed = Fast,但您理解我的意图正确。
    • @Alika87:哎呀,复制粘贴错字。看看编辑后的版本。您必须使用nextToken.Split 而不是tokens[i].Split。所以搜索nextToken.Split 并在你的代码中替换这一行。
    • 发生在最好的情况下。非常感谢你,你真的救了我的命:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多