0

このような文字列の行を入力として取得します。入力は、から来る文字列です

theObjects.Runstate;

各 @VAR;****;@ENDVAR; ループ内の 1 つの Line と 1 つのステップを表します。

@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

各行に 1 つのキーと値のペアを含む別のテキスト ファイルに出力する場合:

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

コメントの質問に従って編集します。

「出力がこのようになるには、何を変更/追加する必要がありますか。AttributeValuePairs が必要です。たとえば、Speed = Fast、または Fabricator = Freescale ?」

これでロジックがわかりました。キーと値のペアがありますが、値のみに関心があります。したがって、2 つの Key-Value はすべて一緒に属し、ペアの最初の値は属性を指定し、2 番目の値はその属性の値を指定します (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 に答える