в зависимости от того, что вы хотите извлечь из таблицы, вот как вы можете играть с данными
numLines <- R.utils::countLines("sportsdb_sample_mysql_20080303.sql")
# [1] 81266
linesInDB <- readLines("sportsdb_sample_mysql_20080303.sql",n=60)
. Затем вы можете сделать некоторое регулярное выражение для получения имен таблиц (после CREATE TABLE), имена столбцов (между первыми скобками) и VALUES (строки после CREATE TABLE и между вторыми скобками)
EDIT: в ответ на ответ OP, если я правильно интерпретирую скрипт python, он также читает строку за строкой, фильтрует строки INSERT INTO, анализирует как csv, затем пишите в файл. Это очень похоже на мое первоначальное предложение. Моя версия ниже в R. Если размер файла слишком велик, было бы лучше прочитать в файле куски, используя другой R-пакет
options(stringsAsFactors=F)
library(utils)
library(stringi)
library(plyr)
mysqldumpfile <- "sportsdb_sample_mysql_20080303.sql"
allLines <- readLines(mysqldumpfile)
insertLines <- allLines[which(stri_detect_fixed(allLines, "INSERT INTO"))]
allwords <- data.frame(stri_extract_all_words(insertLines, " "))
d_ply(allwords, .(X3), function(x) {
#x <- split(allwords, allwords$X3)[["baseball_offensive_stats"]]
print(x[1,3])
#find where the header/data columns start and end
valuesCol <- which(x[1,]=="VALUES")
lastCols <- which(apply(x, 2, function(y) all(is.na(y))))
datLastCol <- head(c(lastCols, ncol(x)+1), 1) - 1
#format and prepare for write to file
df <- data.frame(x[,(valuesCol+1):datLastCol])
df <- setNames(df, x[1,4:(valuesCol-1)])
#type convert before writing to file otherwise its all strings
df[] <- apply(df, 2, type.convert)
#write to file
write.csv(df, paste0(x[1,3],".csv"), row.names=F)
})
Спасибо за парней ответов мне наконец удалось заставлять это работать. С частью и Biri и ответов Kibbee. Я должен был добавить * к строке и разбить ее на пробелы для работы. Таким образом в конце я добрался
....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)
--Added this line
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*')
SET @SearchString = '"*'+@SearchString+'*"'
SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString)
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;
....
Существует больше полей, искавших на, я просто упростил его для вопроса, извините о котором, я не думал, что это произведет ответ. Это на самом деле ищет столбец, который имеет csv псевдонимов и столбца примечаний также.
Спасибо за справку.
Если Вы просто ищете имена людей, это могло бы быть в Ваших интересах даже не использовать полнотекстовый индекс. Полнотекстовый индекс имеет смысл, когда у Вас есть поля крупного текста, но если бы Вы главным образом имеете дело с одним словом на поле, я не уверен, насколько дополнительный Вы вышли бы из полнотекстовых индексов. Ожидание полнотекстового индекса для переиндексации себя, прежде чем можно будет искать новые записи, может быть одной из многих проблем.
Вы могли просто сделать запрос, такой как следующее. Разделите свой searchstring на пробелах и создайте список критериев поиска.
Select FirstName,MiddleName,LastName From person WHERE Firstname like @searchterm1 + '%' or MiddleName like @searchterm1 + '%' or LastName like @searchterm1 + '%' or Firstname like @searchterm2 + '%' etc....
FreeTextTable должен работать.
INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString)
@SearchString должен содержать значения как 'Жаркое Phillip' (одна длинная строка, содержащая все строки поиска, разделенные пробелами).
Если требуется искать франк или Phil, необходимо использовать звездочку: Phil* и франк*
'Phil' ищет точно слово 'Phil'. 'Phil*' ищет каждое слово, которое запускается с 'Phil'
Другой подход мог быть должен абстрагировать поиск далеко от отдельных полей.
Другими словами, создайте представление о своих данных, которые поворачивают все поля разделения как firstname lastname в связанные поля т.е. full_name
Затем поиск на представлении. Это, вероятно, сделало бы поисковый запрос более простым.
Вы могли бы хотеть проверить Lucene.net как альтернативу Полному тексту.