R Извлечь частично совпадающую строку - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть вопрос об извлечении части строки из нескольких файлов, которые имеют эти строки:

единиц = указано - имя 0 = prDM: Давление, Digiquartz [дБ] - имя 1 = t090 C: Температура [ITS-90, град. C] - название 2 = c0S / м: проводимость [См / м] - название 3 = t190 C: температура, 2 [ITS-90, град. C] - название 4 = c1S / м: проводимость, 2 [S / m] - название 5 = flSP: флуоресценция, Seapoint - имя 6 = sbeox0ML / L: кислород, SBE 43 [мл / л] - имя 7 = altM: альтиметр [м] - имя 8 = sal00: ​​соленость, практическая [PSU] - имя 9 = sal11: соленость, практическая, 2 [PSU] - диапазон 0 = 1.000, 42.000

Мне нужно извлечь только информацию из столбцов, начинающихся с " имя "и извлечь все между = и:. Например, в строке «name 0 = prDM: Pressure, Digiquartz [db]» желаемым результатом будет prDM. В некоторых файлах различное количество строк «name» (т.е. в этом примере 13 строк, а в других файлах 16, а количество варьируется), поэтому я хочу, чтобы оно было настолько общим, насколько это возможно, чтобы я всегда мог извлечь нужные строки независимо количество строк. Строки начинаются с # и пробела перед именем. Я пробовал этот код, но он извлекает только первую строку. Можете ли вы помочь мне с этим? Большое спасибо!

CNV<-NULL
for (i in 1:nro.files){
x <- readLines(all.files[i])
name.col<-grep("^\\# name", x) 
df <- data.table::fread(text = x[name.col])
CNV[[i]]<-df
}

Ответы [ 3 ]

0 голосов
/ 21 апреля 2020

Используйте str_extract из пакета stringr и положительный прогноз и внешний вид:

str <- "name 0 = prDM: Pressure, Digiquartz [db]"

str_extract(str, "(?<== ).*(?=:)")
[1] "prDM"

Объяснение:

(?<== ), если вы видите =, за которым следует пробел на left (lookbehind)

.* соответствует чему-либо до ...

(?=:) ... справа вы видите двоеточие (lookahead)

0 голосов
/ 21 апреля 2020

В базе R

test <- c("name 0 = prDM: Pressure, Digiquartz [db]","name 1 = t090C: Temperature [ITS-90, deg C]")

gsub("^name [0-9]+ = (.+):.+","\\1",test)

[1] "prDM"  "t090C"

объяснение

^name [0-9]+ Поиск начала строки ^ с именем, сопровождаемым любой длиной числа

= (.+): любой длины + любого символа ., найденного между = и :, сохраняются ( ) для последующего вызова \\1

0 голосов
/ 21 апреля 2020

с использованием stringr и шаблоном регулярных выражений "name \\d+ = (.*?):", что означает в словах "имя, за которым следуют одна или несколько цифр, за которыми следует знак равенства, за которым следует пробел, за которым следует захваченная группа, содержащая любой символ (точка), равный нулю или более раз (*) с последующим двоеточием ".

   library(stringr)
    strings <- c("name 0 = prDM: Pressure, Digiquartz [db]",
    "name 1 = t090C: Temperature [ITS-90, deg C]",
    "name 2 = c0S/m: Conductivity [S/m]",
    "name 3 = t190C:Temperature, 2 [ITS-90, deg C]",
    "name 4 = c1S/m: Conductivity, 2 [S/m]",
    "name 5 = flSP: Fluorescence, Seapoint",
    "name 6 = sbeox0ML/L: Oxygen, SBE 43 [ml/l]",
    "name 7 = altM: Altimeter [m]",
    "name 8 = sal00: Salinity, Practical [PSU]",
    "name 9 = sal11: Salinity, Practical, 2 [PSU]")

    result <- str_match(strings, "name \\d+ = (.*):")
    result[,2]
 [1] "prDM"       "t090C"      "c0S/m"      "t190C"      "c1S/m"      "flSP"       "sbeox0ML/L"
 [8] "altM"       "sal00"      "sal11"

или, если вы предпочитаете, base

pattern = "name \\d+ = (.*):"
result <- regmatches(strings, regexec(pattern, strings))
sapply(result, "[[", 2)

 [1] "prDM"       "t090C"      "c0S/m"      "t190C"      "c1S/m"      "flSP"       "sbeox0ML/L"
 [8] "altM"       "sal00"      "sal11" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...