2016-06-27 8 views
2

私は解析したいログエントリのファイルを持っています。すべての行は次のようになります。Rで正規表現の構文を書く方法

F 20160602 14:25:11.321 F7982D50 GET 156.145.15.85:37525 xqixh8sl AES "/pcgc/public/Other/exome/fastq/PCGC0077248_HS_EX__1-06808__v3_FCC49HJACXX_L7_p1of1_P1.fastq.gz" "" 3322771022 (0,0) "1499.61 seconds (17.7 megabits/sec) 

各部分の意味は次のとおりです。

  1. F - ラインの識別子

  2. 20160525 - 日付(YYYYMMDD)

  3. 17:52:38.791 - タイムスタンプ(HH:MM:SS.SSS)

  4. F798259D - 転送識別子

  5. 156.145.15.85:46634 - IPアドレスと関連するポート

  6. xqixh8sl - ユーザ名

  7. AES - 暗号化レベル(かもしれない - (ダッシュ))

  8. "/pcgc...fastq.gz" - 転送されたファイル(「中)

  9. "" - ( "追加の文字列が空でなければならない")

  10. 2951144113 - 転送されたバイト

  11. (0,0) - エラー

  12. "2289.47秒(10.3メガビット/秒)" - 私は、データファイルをインポートしたとread.patternを使用しています

転送に関するデータ()関数を使用して解析し、フィールドに分けます。私は、2,3,4,5,6,7,8,10、および12と相関関係がある情報だけを必要とします。しかし、私は正しいパターンを得ることができません。前に、私はこのパターンを使用して必要なフィールドのうちの2つを取得するために管理:

pattern <- "^F ([0-9]+) [^ ]* .* \\(0,0\\) (.*)$" 

これは私にこのように見えたデータフレームを与えた:

date  speed of data transfer 
1 20160525 "1.62 seconds (1.30 kilobits/sec)" 
2 20160525 "0.29 seconds (1.93 kilobits/sec)" 
3 20160525 "0.01 seconds (34.0 kilobits/sec)" 
4 20160525 "0.01 seconds (102 kilobits/sec)" 
5 20160525 "38.05 seconds (214 megabits/sec)" 

これらは2つだけのフィールドです私は必要ですが、それを追加しようとするたびに構文が乱れてしまいます。例:

pattern <- "^F\\s([0-9]+)\\s[0-9:.]+\\s([:alnum:])\\s[A-Z]\\s([0-9.:]+)\\s([:alnum:])\\s([•])\\s[:punct:][A-z][:punct:]\\s[:punct:]\\s.* \\(0,0\\) (.*)$" 

これは機能しませんでした。誰かがこれを書いて助けてくれますか?それは私を夢中にさせている。ありがとう!

答えて

0

はここに私のソリューションです:あなたはこのコードを使用する場合、私は問題のセット全体を予見

1 20160525 08:22:06.838 F798256B 10.199.194.38:57708 wei2dt - "" 264 "1.62 seconds (1.30 kilobits/sec)" 
2 20160525 08:28:26.920 F798256C 10.19.105.15:57708 wei2dt - "isi_audit_log.dmp-sv.tmp" 69 "0.29 seconds (1.93 kilobits/sec)" 
-1

すべての行が同じような構造をとっている場合は、スペース上の各行を単に分割するだけで済むかもしれません。

x <- "F 20160602 14:25:11.321 F7982D50 GET 156.145.15.85:37525 xqixh8sl AES \"/pcgc/public/Other/exome/fastq/PCGC0077248_HS_EX__1-06808__v3_FCC49HJACXX_L7_p1of1_P1.fastq.gz\" \"\" 3322771022 (0,0) \"1499.61 seconds (17.7 megabits/sec)" 

library(dplyr) 
library(magrittr) 
strsplit(x, " ") %>% 
    unlist() %>% 
    t() %>% 
    as.data.frame(stringsAsFactors = FALSE) %>% 
    setNames(c("id", "date", "timestamp", "transfer_id", 
      "curl_method", "ip_address", "username", "encryption", 
      "tranferred_file", "additional_string", 
      "transferred_bytes", "error", 
      "rate1", "rate2", "rate3", "rate4")) %>% 
    mutate(rate = paste(rate1, rate2, rate3, rate4)) %>% 
    select(-rate1:-rate4) 
+0

library(stringer) con <- readLines("dataSet.txt") pattern <- "^F (\\d+) ([:graph:]+) ([:graph:]+) [A-Z]+ ([:graph:]+) ([:graph:]+) ([:graph:]+) ([:graph:]+) [:graph:]+ (\\d+) [:graph:]+ (.+)$" matches <- str_match(con,pattern) df <- data.frame(na.omit(matches[,-1])) colnames(df) <- c("date", "timestamp", "transfer ID", "IP address", "username", "encryption level", "transferred file", "transferred bytes", "speed of data transfer") 

これは結果でした。で始まる:xに2つの値がある場合、unlist()は異なる観測値を1つのベクトルに平坦化し、t()は1行の行列を与えますが、data.frameに変換するには2行が必要です。そして、例えばデータ転送のスピードがスペースを含んでいるという事実は、あなたの最初の行でさえも無効にします。 –

+0

ベクトル内の各要素に対して適用範囲内のコードを使用すると、実行可能なソリューションです。私が言ったように、それはデータがどのように構造化されているかによって異なります。残りの行がこの構造に非常によく似ていない場合は、分割がうまく行かないことに同意します。 – Benjamin

+0

私はコードを実行しましたが、これを使用すると、ある種のループが必要になるようです。この課題の目的は正規表現の使い方を学ぶことだったので、できるだけ避けたい。しかし、あなたの提案をありがとう。 – stargirl