Чтение файлов, содержащих символы новой строки без кавычек в текстовых полях, с помощью R

Я пытаюсь прочитать большую таблицу в R, но одно из текстовых полей иногда содержит один или несколько символов новой строки без кавычек и без экранирования (\n), поэтому функция read.table() не может легко импортировать этот файл. Файл разделен вертикальной чертой, а текстовые поля не заключены в кавычки.

Я могу прочитать его, если передам аргумент fill=T с read.table(), но, конечно, строки с символами новой строки в текстовом поле будут повреждены этим.

Я успешно смог использовать f <- readChar(fname, nchars=file.info(fname)["size"], TRUE) для чтения подсегментов файла, а затем использовать gsub() для поиска и уничтожения оскорбительных символов новой строки. (см. код ниже) Однако размер полного файла > 100 МБ, поэтому gsub() делает немного больше, чем превращает мой ноутбук в грелку для рук (он все еще пытается использовать gsub для всех символов новой строки, когда я пишу это).

У кого-нибудь есть какие-либо предложения о том, как эффективно читать в таком файле?

Кажется, что должен быть какой-то способ сказать R ожидать определенное количество разделителей, прежде чем ожидать новой строки, но я не смог найти способ сделать это в документации.

Извините, кажется, что это должно быть легко, но это действительно поставило меня в тупик, и я не смог найти ничего в stackoverflow или Google, предлагающих решение.

Вот код, который я пробовал до сих пор:

попытка 1:

fdat = read.table(file=fname, 
            allowEscapes=F,
            stringsAsFactors=F,
            quote="", 
            fill=T,
            strip.white=T,
            comment.char="",
            header=T, 
            sep="|")

попытка 2:

f <- readChar(fname, nchars=file.info(fname)["size"], TRUE)
f2 = gsub(pattern="\n(?!NCT)",replacement=" ",x=f, perl=T)
fdat = read.table(text=f2,
            allowEscapes=F,
            stringsAsFactors=F,
            quote="", 
            fill=F,
            strip.white=T,
            comment.char="",
            header=T, 
            sep="|")

Вот несколько строк из файла:

NCT_ID|DOWNLOAD_DATE|DOWNLOAD_DATE_DT|ORG_STUDY_ID|BRIEF_TITLE|OFFICIAL_TITLE|ACRONYM|SOURCE|HAS_DMC|OVERALL_STATUS|START_DATE|COMPLETION_DATE|COMPLETION_DATE_TYPE|PRIMARY_COMPLETION_DATE|PRIMARY_COMPLETION_DATE_TYPE|PHASE|STUDY_TYPE|STUDY_DESIGN|NUMBER_OF_ARMS|NUMBER_OF_GROUPS|ENROLLMENT_TYPE|ENROLLMENT|BIOSPEC_RETENTION|BIOSPEC_DESCR|GENDER|MINIMUM_AGE|MAXIMUM_AGE|HEALTHY_VOLUNTEERS|SAMPLING_METHOD|STUDY_POP|VERIFICATION_DATE|LASTCHANGED_DATE|FIRSTRECEIVED_DATE|IS_SECTION_801|IS_FDA_REGULATED|WHY_STOPPED|HAS_EXPANDED_ACCESS|FIRSTRECEIVED_RESULTS_DATE|URL|TARGET_DURATION|STUDY_RANK
NCT00000105|Information obtained from ClinicalTrials.gov on September 25, 2012|9/25/2012|2002LS032|Vaccination With Tetanus and KLH to Assess Immune Responses.|Vaccination With Tetanus Toxoid and Keyhole Limpet Hemocyanin (KLH) to Assess Antigen-Specific Immune Responses||Masonic Cancer Center, University of Minnesota|Yes|Terminated|July 2002|March 2012|Actual|March 2012|Actual|N/A|Observational|Observational Model:  Case Control, Time Perspective:  Prospective||3|Actual|112|Samples With DNA|analysis of blood samples before and 4 weeks postvaccination|Both|18 Years|N/A|Accepts Healthy Volunteers|Probability Sample|-  Normal volunteers

          -  Patients with Cancer (breast, melanoma, hematologic)

          -  Transplant patients (umbilical cord blood transplant, autologous transplant)

          -  Patients receiving other cancer vaccines|March 2012|March 26, 2012|November 3, 1999|Yes|Yes|Replaced by another study.|No||http://clinicaltrials.gov/show/NCT00000105||6670
NCT00000106|Information obtained from ClinicalTrials.gov on September 25, 2012|9/25/2012|NCRR-M01RR03186-9943|41.8 Degree Centigrade Whole Body Hyperthermia for the Treatment of Rheumatoid Diseases|||National Center for Research Resources (NCRR)||Active, not recruiting||||||N/A|Interventional|Allocation:  Randomized, Intervention Model:  Parallel Assignment, Primary Purpose:  Treatment|||||||Both|18 Years|65 Years|No|||November 2000|June 23, 2005|January 18, 2000||||No||http://clinicaltrials.gov/show/NCT00000106||7998

Как видно, эти образцы строк из моего проблемного файла включают заголовок (строка № 1), проблемную строку (строка № 2) и непроблемную строку (строка № 3). Каждая строка без заголовка начинается с NCT и заканчивается на \n (это было использовано в регулярном выражении gsub).

Любые предложения очень ценятся.


person samhiggins2001    schedule 07.01.2014    source источник


Ответы (1)


Кажется, нет способа решить это с помощью read.table. К сожалению, он не позволяет изменить «разделитель записей», как, например, awk.

Ваша попытка 2 не удалась, поскольку новая строка формата DOS имеет вид \r\n (0x0d 0x0a) и только \n соответствует gsub. Скажем, у вас есть следующий файл:

NCTa|b|c
NCT1|how
are
you?|well
NCT2|are
you
sure?|yes

Затем посмотрите на вывод вашей второй команды:

f2 <- gsub(pattern="\n(?!NCT)",replacement=" ",x=f, perl=TRUE)
f2
# [1] "NCTa|b|c\r\nNCT1|how\r are\r you?|well\r\nNCT2|are\r you\r sure?|yes\r "

Таким образом, вы должны удалить \r тоже. Просто исправьте это:

f2 <- gsub(pattern="\r?\n(?!NCT)",replacement=" ",x=f, perl=TRUE)

И это сработает.

Что касается производительности, вы можете попытаться readChar сделать ее меньшими фрагментами в цикле, gsub их и записать обратно в файл, а затем read.table. Просто идея.

person Tomas    schedule 07.01.2014
comment
Интересно знать, что шаблон регулярного выражения не будет корректно работать с dos; он отлично работал на моем Mac, за исключением времени выполнения. - person samhiggins2001; 07.01.2014