R中如何将\""替换为\"""?

问题描述 投票:0回答:1

我有一个 tsv,其中一些字段带有一些转义双引号 (DQM)。这些都很好,但是当 DQM 分隔符出现在其中一个分隔符之后,然后当打开 tsv 时,它无法识别最后一个 DQM,因此以下字段包含在前一个字段中时,问题就出现了。

例如,该行:

"9812" "tt0167609" "tvSeries" "L'homme du \"Picardie\"" "L'homme du \"Picardie\"" 0 "1968" "\N" "13" "Drama"

在 SS 中打开时,将前 3 个字段放置得很好。但是第四个字段一直包含到

1968
,而它应该做的只是将第一个
"L'homme du \"Picardie\"
放入,将第二个字段放入下一个字段中,依此类推。所以问题似乎是它无法识别
"
之后的
\"
。我尝试在 SS 程序中打开它时单击不同的选项,但没有任何解决办法。

现在我发现我可以在文本编辑器中将

\""
替换为
\"""
之前在 SS 程序中打开它来修复此问题,但我希望能够在文件打开时在 R 中执行此操作生成。

我尝试了几种字符串组合,但我就是无法弄清楚,我希望有人能指出我正确的方向。以下只是我尝试过的一些内容。

tv.Subset <- str_replace(tv.Subset, "\\\"\"", "\\\"\"\"")
- 我的第一次尝试之一,只需转义字符串中的每个字符

tv.Subset <- str_replace(tv.Subset, '\\\"\"', '\\\"\"\"')
- 我想知道分隔符的单引号是否可能是窍门

tv.Subset <- str_replace(tv.Subset, "\\\\\\"\\"", "\\\\\\"\\"\\"")
- 我读到你需要使用双反斜杠来尊重 R 和正则表达式

谢谢。

r escaping backslash
1个回答
0
投票

如果我正确理解你的问题,R 正在生成 .tsv 输出文件,由于 R 输出中的转义双引号,你无法在电子表格程序中打开该文件。

如果是这样,这是一个可重现的示例,其中第三行是您的原始数据:

df <- data.frame(f1=c(1,27,9812,9999),
                 f2=c('tt12345','tt54321','tt0167609','tt98765'),
                 f3=rep("tvSeries",4),
                 f4=c("Some string","Another string","L'homme du \"Picardie\"","Yet another string"),
                 f5=c("Here is another string","Another string again","L'homme du \"Picardie\"","Also a string"),
                 f6=c(0,0,0,0),
                 f7=c(1966,1967,1968,1969),
                 f8=rep("\\N",4),
                 f9=c(11,12,13,14),
                 f10=rep('Drama',4))
write.table(df,'outfile.tsv')

在 R 中查看,您的数据将如下所示:

> print(df,row.names=F)
   f1        f2       f3                    f4                     f5 f6   f7  f8 f9   f10
    1   tt12345 tvSeries           Some string Here is another string  0 1966 \\N 11 Drama
   27   tt54321 tvSeries        Another string   Another string again  0 1967 \\N 12 Drama
 9812 tt0167609 tvSeries L'homme du "Picardie"  L'homme du "Picardie"  0 1968 \\N 13 Drama
 9999   tt98765 tvSeries    Yet another string          Also a string  0 1969 \\N 14 Drama

命令

write.table(df,'outfile.tsv')
生成此输出文件,某些电子表格程序无法读取该文件:

"f1" "f2" "f3" "f4" "f5" "f6" "f7" "f8" "f9" "f10"
"1" 1 "tt12345" "tvSeries" "Some string" "Here is another string" 0 1966 "\N" 11 "Drama"
"2" 27 "tt54321" "tvSeries" "Another string" "Another string again" 0 1967 "\N" 12 "Drama"
"3" 9812 "tt0167609" "tvSeries" "L'homme du \"Picardie\"" "L'homme du \"Picardie\"" 0 1968 "\N" 13 "Drama"
"4" 9999 "tt98765" "tvSeries" "Yet another string" "Also a string" 0 1969 "\N" 14 "Drama"

解决方案不是像您一直在尝试的那样更改 R 中的 \" ,而是不要让 R 在输出中用引号包围字符串。这样,输出中的 only 引号就是属于其中一部分的引号标题,电子表格程序将能够相应地处理它们。

以下是可用于保存数据而不使用转义引号的命令:

write.table(df,'outfile.tsv',quote=F,sep='\t')
。这会做两件事:

  1. quote=F 将阻止 R 在输出中的字符串周围添加引号。由于这些引号不存在,因此它不会转义标题中的引号。
  2. sep=' ' 将使 R 使用制表符而不是空格字符分隔输出列(空格是默认值,您的示例看起来使用了空格)。当 quote=F 时,您需要 sep=' ',以便电子表格程序可以告诉字符串中的空格仍然是字符串的一部分,而不是分隔符。

您的新输出文件将如下所示:

f1  f2  f3  f4  f5  f6  f7  f8  f9  f10
1   1   tt12345 tvSeries    Some string Here is another string  0   1966    \N  11  Drama
2   27  tt54321 tvSeries    Another string  Another string again    0   1967    \N  12  Drama
3   9812    tt0167609   tvSeries    L'homme du "Picardie"   L'homme du "Picardie"   0   1968    \N  13  Drama
4   9999    tt98765 tvSeries    Yet another string  Also a string   0   1969    \N  14  Drama

只要新的输出文件使用制表符,大多数电子表格程序都可以这样读取它。

© www.soinside.com 2019 - 2024. All rights reserved.