gpt4 book ai didi

regex - 使用 R 读取文本字段中包含未引号换行符的文件

转载 作者:行者123 更新时间:2023-12-02 01:54:31 25 4
gpt4 key购买 nike

我正在尝试将一个大表读入 R,但其中一个文本字段偶尔包含一个或多个未加引号、未转义的换行符 ( \n ),因此 read.table()功能无法轻松导入此文件。该文件是竖线分隔的,文本字段未被引用。

如果我传递参数 fill=T,我可以读入它与 read.table()但是,当然,文本字段中带有换行符的行会因此而损坏。

我已经成功使用f <- readChar(fname, nchars=file.info(fname)["size"], TRUE)读取文件的子段,然后使用 gsub()搜索并销毁有问题的换行符。 (见下面的代码)但是,完整的文件 > 100mb,所以 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 的正则表达式中得到了利用)。

非常感谢任何建议。

最佳答案

好像没有办法用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)

它会起作用。

关于性能,您可以尝试通过循环中的较小块readChargsub 它们并将它们写回文件,然后read.table 它。只是一个想法。

关于regex - 使用 R 读取文本字段中包含未引号换行符的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20962103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com