我正在R中工作。我正在尝试导入数据,有些使用制表符,有些使用列之间的空白。我的代码如下:
gsub("[[:blank:]]", ";",
readLines(paste(PathToRecipes,recipe.files[i],sep="/")))
我阅读了每个文件的行,然后gsub
用冒号替换所有空白。然后,将其放入write.table
中,并具有一组新文件,可以将其重新导入到数据框中。
问题是我得到了:
"1";6;"medium;(2-1/4\";to;3-1/4\";dia.)";"Potatoes,;boiled,;cooked;without;skin,;flesh,;without;salt";11367
我什么时候应该得到:
"1";6;"medium (2-1/4\" to 3-1/4\" dia.)";"Potatoes, boiled, cooked without skin, flesh, without salt";11367
在引号中有一些文本,其中的空格不应替换为“;”。我该如何避免使用引号?
答案 0 :(得分:0)
如果您不想用分号替换的文本中的空格不是“制表符”,那么您应该能够执行当前操作,而不必使用[[:blank:]]
,而是使用{{1} }仅替换制表符而不是所有空格。
\\t
答案 1 :(得分:0)
您可以将PCRE regex与SKIP-FAIL技术结合使用:
(*UCP)"[^"\\]*(?:\\.[^"\\]*)*"(*SKIP)(*F)|\s+
请参见regex demo。您的数据似乎只包含成对的双引号,因此上述模式就足够了。否则,再增加一点:
(*UCP)(?<!\\)(?:\\{2})*"[^"\\]*(?:\\.[^"\\]*)*"(*SKIP)(*F)|\s+
详细信息
(*UCP)
-使\s
可以识别Unicode (?<!\\)
-当前位置左侧不允许\
(?:\\{2})*
-0个以上的双反斜杠序列"
-一个"
字符[^"\\]*
-除"
和\
以外的零个或多个字符(?:\\.[^"\\]*)*
-任何转义序列的零个或多个序列,然后是"
和\
以外的零个或多个字符"
-一个"
字符(*SKIP)(*F)
-忽略并跳过当前匹配项,以从当前索引中查找下一个匹配项(跳过的匹配项在此结束)|
-或\s+
-在任何其他上下文中匹配1个或多个空格。rx <- '(*UCP)(?<!\\\\)(?:\\\\{2})*"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"(*SKIP)(*F)|\\s+'
x <- c('"1"; 6; "medium (2-1/4\\" to 3-1/4\\" dia.)"; "Potatoes, boiled, cooked without skin, flesh, without salt"; 11367')
cat(gsub(rx, '', x, perl=TRUE))
## => "1";6;"medium (2-1/4\" to 3-1/4\" dia.)";"Potatoes, boiled, cooked without skin, flesh, without salt";11367