我有一段文字
str <- '"foo\\dar embedded \\\"quote\\\""'
# cat(str, '\n') # gives
# "foo\dar embedded \"quote\""
# i.e. as if the above had been written to a CSV with quoting turned on.
我想结束字符串:
str <- 'foo\\dar embedded "quote"'
# cat(str, '\n') # gives
# foo\dar embedded "quote"
基本上删除一个引用的“层”。 我该怎么做?
(初始尝试 - eval(parse(text=str))
,除非你有类似\\dar
之类的内容,否则会在<{1}}中出现错误“\d
是一个无法识别的转义字符串......“)。
我的字符串被引用了一次太多次的原因是我对一些数据处理进行了处理 - 我写了str
(好吧,我的情况下是一个数据帧)到一个启用了引用的表,但是忘记了很多我的数据框中的列已嵌入带嵌入式引号的换行符(即忘记转义/删除它们)。
事实证明,当我read.table
一个文件在同一行中有多列已嵌入换行符和嵌入式引号(或类似内容)时,该函数失败(足够公平)。
我已经关闭了我的R会话,所以我唯一访问我的数据是通过我的munged CSV。所以我写了一些意大利面条代码来简单地readLines
我的CSV并将所有内容拆分以重新构建我的数据帧。但是,由于我的所有字符列都在CSV中引用,因此我在已恢复的数据框中有几列仍然引用,我想要取消引用。
凌乱,我知道。我会记得下次保存原始版本的数据(save
,saveRDS
)。
对于那些感兴趣的人,我的CSV标题行和三行如下所示(所有字符都是ASCII)
"quote";"id";"date";"author";"context"
"< mwk> I tried to fix the bug I mentioned, but I accidentally ascended the character I started for testing... hoped she'd die soon and I could get to coding, but alas I was wrong";"< mwk> I tried to fix the bug I mentioned, but I accidentally ascended the character I started for testing... hoped she'd die soon and I could get to coding, but alas I was wrong";"February 28, 2013";"nhqdb";"nhqdb"
"< intx14> \"A gush of water hits the air elemental on the central core!\"
< intx14> What is this, a weather forecast?";"< intx14> \"A gush of water hits the air elemental on the central core!\"
< intx14> What is this, a weather forecast?";"February 28, 2013";"nhqdb";"nhqdb"
"< bcode> n - a spherical amulet. You are lucky! Full moon tonight.
< bcode> That must be a sign - I'll put it on! What could possibly go wrong...
< oracle\devnull> DIED : bcode2 (Wiz-Elf-Mal-Cha) 0 points, killed by strangulation on pcs1.nethack.devnull.net";"< bcode> n - a spherical amulet. You are lucky! Full moon tonight.
< bcode> That must be a sign - I'll put it on! What could possibly go wrong...
< oracle\devnull> DIED : bcode2 (Wiz-Elf-Mal-Cha) 0 points, killed by strangulation on pcs1.nethack.devnull.net";"February 28, 2013";"nhqdb";"nhqdb"
每行的前两列是相同的,是引号(第一行在引用中没有嵌入的换行符;第二行和第三行都没有。)分隔符是';'。
> read.table('test.csv', sep=';', header=T)
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line 1 did not have 5 elements
# same for with ,allowEscape=T
答案 0 :(得分:1)
使用正则表达式:
str <- gsub('^"|"$', '', gsub('\\\"', '"', str, fixed = TRUE))
答案 1 :(得分:-3)
[编辑3:OP发布了三个不同的版本 - 其中两个不可复制,穿插着抱怨。由于这种浪费时间的行为和几个人的贬低,我将原来的答案留给了问题的第2版。]
编辑1:我对OP问题第二版的解决方案是这样的:
txt <- read.csv('escaped.csv', header=T, allowEscapes=T, sep=';')
编辑2:我们现在获得第三个版本。最后一些可重复的代码在36分钟后询问和等待。由于OP和其他海报的行为,我不倾向于浪费更多时间。我会抱怨你在MSO上的两个行为。低声吟唱自己。
ORIGINAL:
gsub
是丑陋的方式。
使用read.csv(..., allowEscapes=TRUE, quote=..., encoding=...)
个参数。请参阅manpage, section on Encoding
如果您需要实际代码,则需要向我们提供一行或两行CSV文件。
另见SO: "How to detect the right encoding for read.csv?"
引用问题的相关部分:
我的字符串引用次数太多次的原因是我克制了一些 数据处理 - 我写了一个str(好吧,我的情况下是一个数据帧) 启用引号的表,但忘记了我的许多列 数据框在引号内嵌入了换行符(即忘记了 逃避/删除它们。)
事实证明,当我读取一个包含多列的文件时 在引号内嵌入换行符的同一行,该函数 失败(足够公平)。