2013-08-20 4 views
2

У меня есть строка, хранящаяся в R. Какой код можно использовать для извлечения текста между двумя значениями? Например:R - Выберите текст строки между двумя значениями

sql <- "SELECT field1, field2, field3 FROM tbl WHERE x=y" 

Я хочу извлечь field1, field2, field3 в виде отдельной строки. Я могу использовать substring, но я не знаю, как определить целочисленные значения, относящиеся к концу «SELECT» и началу «FROM».

ответ

5

Вот один вариант использования gsub:

gsub("^.*SELECT *(.*?) +FROM.*$", "\\1", sql) 
+0

Ницца! Я все еще изучаю регулярные выражения. Однако это оставляет пробел в конце строки. – Mayou

+1

Я думаю, что вам лучше делать: 'gsub (" ^. * SELECT * (. *) * FROM. * $ "," \\ 1 ", sql) '. ** Обратите внимание на пробел перед 'FROM' **. – Mayou

+0

Это мило, спасибо! –

1

Вы можете сделать это:

split_sql = strsplit(sql, split = " ") 
result = paste(split_sql[1][[2]], split_sql[1][[3]], split_sql[1][[4]], sep = " ") 

Это даст вам:

#[1] "field1, field2, field3" 
+0

Извините, я не был абсолютно точным. Это всего лишь строка символов, а не истинный объект SQL. –

+0

Получил это. Проверьте мой обновленный ответ. Это то, что вы ищете? – Mayou

0

Мое предпочтение было бы:

# Pull out strings between SELECT and FROM 
Fields = gsub("SELECT (.*) FROM.*","\\1",sql) 
# Remove spaces 
CleanFields = (gsub("\\s+", "", Fields)) 
# Split into items 
Items = unlist(strsplit(CleanFields,",")) 

Тогда можно индексировать каждый field1 как товары [1]

(Конечно, это можно было бы поместить в функцию или объединены в одну строку ...)

0

1) Один подход, чтобы удалить все не хотел:

gsub("^SELECT *| FROM .*", "", sql) 

2) Другой подход, если мы кадр данных с необходимыми полями, чтобы выполнить запрос с использованием sqldf, а затем взять свои имена:

library(sqldf) 
tbl <- data.frame(field1 = 1, field2 = 2, field3 = 3, x = 4, y = 5) 
toString(names(sqldf(sql))) 
Смежные вопросы