我有一个 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 正在生成 .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')
。这会做两件事:
您的新输出文件将如下所示:
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
只要新的输出文件使用制表符,大多数电子表格程序都可以这样读取它。