如何使用 data.table 的 fwrite 为 Excel 保留字符格式的数字

How to preserve numbers in a character format for Excel with data.table's fwrite

在下面的示例中,当我使用 data.tablefwrite 将数字以字符格式(即 .10)保存为 CSV 文件时,Excel 显示它作为数字而不是字符串。

有没有办法将数字保存为字符格式,Excel可以将其识别为字符串?

不是只是想删除小数点前的0或保留尾随的0。

我想保持字符串完整,与它们在 R 中的显示完全相同(例如,.10,但没有引号)。

dt <- data.table(a = ".10")
fwrite(dt, "example.csv")

# The saved CSV file opened in Excel shows the number 0.1, rather than the string .10

Excel 在想读什么就读什么方面基本上是脑残。这是一种解决方法:

dat <- data.frame(aschr = c("1", "2.0", "3.00"), asnum = 1:3, hascomma = "a,b", hasnewline = "a\nb", hasquote = 'a"b"')
notnumber <- sapply(dat, function(z) is.character(z) & all(is.na(z) | !grepl("[^-0-9.]", z)))
needsquotes <- sapply(dat, function(z) any(grepl('[,\n"]', z))) & !notnumber
dat[needsquotes] <- lapply(dat[needsquotes], function(z) dQuote(gsub('"', '""', z), FALSE))
dat[notnumber] <- lapply(dat[notnumber], function(z) paste0("=", dQuote(z, FALSE)))
fwrite(dat, "iris.csv", quote = FALSE)

在 Excel 中产生以下观点。

其中大部分是预防性的:如果您非常了解自己的数据并且知道 none 数据包含逗号、引号或换行符,那么您可以去掉 needsquotes 部分. notnumber 是感兴趣的列。

最重要的是,我们通过强制将其作为 excel 公式来“欺骗”excel 使其保持为字符串。这可能不适用于其他电子表格(例如 Calc),我还没有测试过。