0

Symantec アプリケーション (Altiris) のいくつかのログ ファイルの解析を手伝うように頼まれましたが、それらは疑似 HTML/XML 形式で提供されました。ログを適切な文字ベクトル形式に使用readLines()grepl()て取得し、ジャンクを一掃することはできましたが、データフレームに入れることはできません。

現時点では、エントリは次のようになります (実際のデータを投稿できないため)。すべて構造体の文字ベクトルchr[1:312]です。

[310] "<severity='4', hostname='computername125', source='PackageDownload', module='herpderp.dll', process='masterP.exe', pid='234' >"

私は XML の構文解析がうまくいかず、HTML のように見えます。試してみるhtmlTreeParse(x)と、膨大な数のタグのピラミッドになってしまいました。

4

1 に答える 1

1

疑似 XML を使用している場合は、解析規則を自分で定義するのがおそらく最善です。私はこのようstringrdplyrものが好きです。

これは2要素のベクトルです(あなたの場合は312ではありません):

vec <- c(
  "<severity='4', hostname='computername125', source='PackageDownload', module='herpderp.dll', process='masterP.exe', pid='234' >",
  "<severity='5', hostname='computername126', source='PackageDownload', module='herpderp.dll', process='masterP.exe', pid='235' >"
)

data.frameそれをオブジェクトに変換します。

df <- data.frame(vec, stringsAsFactors = FALSE)

そして、対象の変数の位置に対する文字インデックス位置に基づいてデータを選択します。

require(stringr)
require(dplyr)

df %>%
  mutate(
    severityStr = str_locate(vec, "severity")[, "start"],
    hostnameStr = str_locate(vec, "hostname")[, "start"],
    sourceStr = str_locate(vec, "source")[, "start"],
    moduleStr = str_locate(vec, "module")[, "start"],
    processStr = str_locate(vec, "process")[, "start"],
    pidStr = str_locate(vec, "pid")[, "start"],
    endStr = str_locate(vec, ">")[, "start"],
    severity = substr(vec, severityStr + 10, hostnameStr - 4),
    hostname = substr(vec, hostnameStr + 10, sourceStr - 4),
    source = substr(vec, sourceStr + 8, moduleStr - 4),
    module = substr(vec, moduleStr + 8, processStr - 4),
    process = substr(vec, processStr + 9, pidStr - 4),
    pid = substr(vec, pidStr + 5, endStr - 3)) %>%
  select(severity, hostname, source, module, process, pid)

結果のデータフレームは次のとおりです。

  severity        hostname          source       module     process pid
1        4 computername125 PackageDownload herpderp.dll masterP.exe 234
2        5 computername126 PackageDownload herpderp.dll masterP.exe 235

このソリューションは、さまざまな長さの文字列入力を処理するのに十分堅牢です。たとえば、(3 桁ではなく 2 桁pidの) 場合でも正しく読み取られます。95

于 2014-08-06T20:49:23.597 に答える