Klammerstrukturen erkennen



  • Hallo,

    ich habe eine textdatei etwa in der Form:

    object {
      top_item {
        item {
          id: "1"
          definition: ""
        }
        item {
          id: "1a"
          definition: ""
        }
        item {
          id: "2"
          border {
            min: 0
            max: 1
          }
          definition: ""
        }
        item {
          id: "3"
          border {
            min: 0
            max: 99999
          }
          definition: ""
        }
      }
    }
    

    Da mir das zu lästig ist, möchte ich diesen Text in etwa folgende Struktur bringen:

    object {
      top_item {
        item { id: "1" definition: ""}
        item { id: "1a" definition: ""} 
        item { id: "2" border {min: 0 max: 1} definition: ""}
        item { id: "3" border {min: 0 max: 99999} definition: ""}
      }
    }
    

    Tokenizer unterscheiden meines Wissens nicht zwischen öffnender und schliessender Klammer. Ich weiss nicht ob es dafür sonst schon fertige Bibliotheken gibt?

    Das was mir spontan einfällt, ist, den Text selber manuell zu parsen. Erste öffnende Klammer mit letzter schliessenden zu verbinden is ja murks, zB bei sowas:

    item { id: "1"} item { id: "2"}
    

    Jemand Hinweise? Ich danke schonmal allen Hinweisgebern.

    Vevorzugte IDE, Bibliotheken: Visual Studio 2012, Boost.

    Mfg Les Paul



  • Du könntest aus meiner Sicht zuerst alle Zeilenumbrüche entfernen und anschließend nach jeder schließenden geschweiften Klammer einen einfügen.

    Ausnahme wären dann jedoch wahrscheinlich "object {" und "top_item {", da du bei diesen ja weiterhin einen Zeilenumbruch willst.

    Ich hab mal eine Quick and Dirty Lösung in C# geschrieben. - Diese solltest du jedoch noch etwas optimieren, wenn du sie übernehmen möchtest. - Wie du sie in C++/Cli übernimmst, weist du sicherlich.

    private string ModifyText(string sText)
    {
    	string sNewText = string.Empty;
    	string[] sLines = sText.Split(new char[] { '\n' }, StringSplitOptions.None);
    
    	foreach (string sLine in sLines)
    	{
    		string sTempLine = sLine.Trim();
    		if (sTempLine.StartsWith("definition"))
    			sNewText = sNewText.Remove(sNewText.Length - Environment.NewLine.Length); 
    
    		if (sTempLine.Contains("{") || sTempLine.Contains("}"))
    			sNewText += sLine;
    		else
    			sNewText += String.Concat(" ", sTempLine);
    		if (((sTempLine.StartsWith("object") || sTempLine.StartsWith("top_item")) && sTempLine.EndsWith("{")) || sTempLine.EndsWith("}"))
    			sNewText += Environment.NewLine;
    	}
    
    	return sNewText;
    }
    

Log in to reply