У меня есть файл записей журнала, который я хочу проанализировать. Все строки выглядят так:Как написать регулярный синтаксис выражения в 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)
Каждая часть имеет специальное обозначение, которое я укажу ниже.
F - идентификатор линии
20160525 - дата (ггггммдд)
17: 52: 38,791 - метка времени (HH: MM: СС.ссс)
F798259D - передача идентификатор
156.145.15.85:46634 - IP-адрес и порт, связанный с
xqixh8sl - имя пользователя
AES - уровень шифрования (может быть - (тире))
"/pcgc...fastq.gz" - переданный файл (в «)
"" - дополнительная строка (должна быть пустой "")
2951144113 - переданы байты
(0,0) - ошибка
"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\\) (.*)$"
Это не сработало. Может ли кто-нибудь помочь в написании этого? Это сводило меня с ума. Благодаря!
Я предвижу целый комплекс проблем, если вы используете этот код. Начиная с: если x имеет 2 значения, unlist() будет сглаживать различные наблюдения до одного вектора, а t() даст вам матрицу из 1 строки, тогда как для преобразования ее в файл data.frame вам понадобится 2-строчная. И тот факт, что, например, скорость передачи данных содержит пробелы, что делает даже вашу первую строку недействительной. –
Это приемлемое решение, если вы используете код в приложении для каждого элемента вектора. И, как я уже сказал, это зависит от того, насколько структурированы данные. Если оставшиеся строки не будут следовать этой структуре очень близко, я бы согласился, что раскол не очень работоспособен. – Benjamin
Я запустил код, но похоже, что для этого потребуется какой-то цикл. Я хочу как можно больше избежать этого, поскольку целью этого задания было научиться использовать регулярные выражения. Спасибо за ваше предложение. – stargirl