1

基本的に、その中のキーと値のペアの束をリストするコマンドの出力があります。出力は明確な形式ではないため、正規表現が最善のアプローチになると思います。

出力: http: //pastebin.com/Hfu4nP3M

基本的に、21〜30行目からキーと値のペア(カンマで区切って)を保存し、それらをマップに保存する必要があります。

正規表現を使用してこれを行うことは可能ですか?

ありがとう。

4

3 に答える 3

1

それがあなたが望むものであるかどうかはわかりませんが、21〜30行目からキー/値ペア(カンマ区切り)を格納する必要があるとあなたが言ったので、

 {memory,
     [{total,38751504},
      {processes,13711212},
      {processes_used,13711198},
      {system,25040292},
      {atom,662409},
      {atom_used,653371},
      {binary,287088},
      {code,18209655},
      {ets,1358504}]},

memoryに格納された後の値を読み取りたいと仮定しました[...]

これを行うには、次のようなものを使用できます

//creating reader to get data from file
BufferedReader in = new BufferedReader(new InputStreamReader(
        new FileInputStream("data.txt")));// file with your data

StringBuilder sb = new StringBuilder();
String line = null;
while ((line = in.readLine()) != null) {
    sb.append(line.trim());// also remove unnecessary tabulators and
                            // spaces
}
in.close();

String data = sb.toString();

Pattern pattern = Pattern.compile("\\{memory,\\[(.*?)\\]");
Matcher m = pattern.matcher(data);
if (m.find()) {
    Pattern keyValuePattern = Pattern.compile("\\{(\\w*?),(\\d*?)\\}");
    Matcher matcher = keyValuePattern.matcher(m.group(1));
    while (matcher.find())
        System.out.println(matcher.group(1) + "->" + matcher.group(2));
} else
    System.out.println("not found");

出力

total->38751504
processes->13711212
...
于 2012-08-08T14:32:36.850 に答える
0

これには、ある程度のクリーンアップが必要になる場合があります。正規表現を頻繁に使用することはなく、Javaでは使用しません。

正規表現を使用してみてください:

[{,][^",}]*?[,}]

つまり、「{」または「、」に等しい文字を検索し、「}」または「、」に等しい文字が見つかるまで、「」、「}」、または「、」ではない無限文字を検索します。

まだ引用符でマークされていないものをすべて見つけるには、それを一致させます。

String s = p.match();
s = s.charAt(0) + '"' + s.substring(1, s.length() - 1) + '"' + s.charAt(s.length() - 1;

次に、それをログの適切な位置に戻します。それらをすべて完了したら、JSONを使用してログを読み取ることができます。

また、おそらくログインをメモリに入れておきたいので、操作が簡単になります。

于 2012-08-08T13:38:50.597 に答える
0

String.equals()を使用して'{memory'が問題ないことがわかるまで、出力を1行ずつ読み取ることができます。次に、次のすべての行で実行できます

    String[] result = line.replaceAll("[\\[\\]}{ \t]|},", "").split(",");
    System.out.println(result[0] + "," + result[1]);
    if(line.contains("]"))
        break;
于 2012-08-08T13:46:42.130 に答える