2016-06-27 4 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 - дата (ггггммдд)

  3. 17: 52: 38,791 - метка времени (HH: MM: СС.ссс)

  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. Однако я не могу получить правильный шаблон. Перед тем, мне удалось получить два поля, которые мне нужны, используя этот шаблон:

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)" 

Это лишь два из полей Мне нужно, но всякий раз, когда я пытаюсь добавить больше, я использую синтаксис. Например:

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

Вот мое решение:

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") 

Это результат:

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

Я предвижу целый комплекс проблем, если вы используете этот код. Начиная с: если x имеет 2 значения, unlist() будет сглаживать различные наблюдения до одного вектора, а t() даст вам матрицу из 1 строки, тогда как для преобразования ее в файл data.frame вам понадобится 2-строчная. И тот факт, что, например, скорость передачи данных содержит пробелы, что делает даже вашу первую строку недействительной. –

+0

Это приемлемое решение, если вы используете код в приложении для каждого элемента вектора. И, как я уже сказал, это зависит от того, насколько структурированы данные. Если оставшиеся строки не будут следовать этой структуре очень близко, я бы согласился, что раскол не очень работоспособен. – Benjamin

+0

Я запустил код, но похоже, что для этого потребуется какой-то цикл. Я хочу как можно больше избежать этого, поскольку целью этого задания было научиться использовать регулярные выражения. Спасибо за ваше предложение. – stargirl