Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:循环文本文件,拆分它并打印一个新的文本文件_C#_Arrays_Split_Text Files - Fatal编程技术网

C#:循环文本文件,拆分它并打印一个新的文本文件

C#:循环文本文件,拆分它并打印一个新的文本文件,c#,arrays,split,text-files,C#,Arrays,Split,Text Files,我得到许多行字符串作为输入,如下所示。输入是来自的字符串 theObjects.Runstate; 每个@VAR;**@ENDVAR;表示循环中的一行和一步 @VAR;Variable=Speed;Value=Fast;Op==;@ENDVAR;@VAR;Variable=Fabricator;Value=Freescale;Op==;@ENDVAR; 我将其拆分,以删除不需要的字段,如@VAR、@ENDVAR和Op==。 最佳输出为: Speed = Fast; Fabricator =

我得到许多行字符串作为输入,如下所示。输入是来自的字符串

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和the@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);
            }
        }
    }
}

此linq查询提供导出的结果:

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);
如果要将其输出到另一个文本文件,每行有一个键值对:

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

根据评论中的问题编辑

“我需要更改/添加什么,以使输出如下所示。我 需要属性值对,例如:速度=快速;或制造商= 飞思卡尔?”

现在我理解了逻辑,你有键值对,但你只对值感兴趣。因此,每两个键值都属于一个,一对键值的第一个值指定attibute,第二个值指定该属性的值(f.e.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;制造商=飞思卡尔;它是否与新的KeyvaluePair有关???@Alika87:编辑了我的答案。然而,你真的应该尝试改变你的文件格式,甚至使用数据库来代替。不幸的是,这是我从外部工具中得到的文件格式,所以我不得不接受它。非常感谢,您所做的超出了我的要求,但在您的代码中,显示kv.Key和kv.Value是相等的,因此输出是Speed=Speed,而不是Speed=Fast,但您正确理解了我的意图。@Alika87:Whoops,copy-paste-typo。看看编辑过的版本。您必须使用
nextToken.Split
,而不是
tokens[i].Split
。因此,搜索
nextToken.Split
并在代码中替换这一行。这是最好的选择。非常感谢你,你真的救了我的命
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