如何在R中用write_excel_csv生成兼容pxjob的无引号UTF-8-BOM CSV
解决pxjob兼容的CSV生成问题
问题分析
你需要生成满足以下要求的CSV文件:
- UTF-8-BOM编码(用于识别斯堪的纳维亚字符)
- 分号作为分隔符
- 无引号包裹内容
但使用write_excel_csv2设置quote="none"后出现首条变量名首字符丢失的问题,这是该函数在特定参数组合下的编码输出逻辑偏移导致的。
解决方案:用base R函数手动控制编码与格式
通过手动添加UTF-8 BOM并使用write.table精确控制输出格式,可直接生成符合pxjob要求的CSV文件,代码如下:
1. 示例数据
df <- structure(list(Län = c("10 Blekinge län", "10 Blekinge län", "20 Dalarnas län", "20 Dalarnas län", "09 Gotlands län", "09 Gotlands län" ), Enhet = c("Totalt antal kommuner i län", "Antal deltagande kommuner", "Totalt antal kommuner i län", "Antal deltagande kommuner", "Totalt antal kommuner i län", "Antal deltagande kommuner"), År = c(2015, 2015, 2015, 2015, 2015, 2015), value = c(5, 4, 15, 4, 1, 0)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
2. 生成兼容CSV的代码
# 替换为你的目标文件路径 output_path <- paste0("G:\\Data\\Folkhälsodata\\_3b px-filer (arbetsmaterial2023)\\Filer för Pxjob\\In_headers\\", fillista[i]) # 创建带UTF-8 BOM的文件连接 con <- file(output_path, encoding = "UTF-8") writeChar("\ufeff", con, eos = NULL) # 写入UTF-8 BOM标识 # 写入数据:分号分隔、无引号、无行名、按需控制列名 write.table( as.data.frame(df), con, sep = ";", quote = FALSE, row.names = FALSE, col.names = FALSE, # 与你原代码保持一致,不需要列名则设为FALSE na = "", fileEncoding = "UTF-8" ) close(con)
方案说明
- 手动写入
\ufeff(UTF-8 BOM)确保pxjob正确识别斯堪的纳维亚字符编码。 - 使用
write.table的quote=FALSE完全禁用引号,避免pxjob读取异常。 - 直接控制文件编码为UTF-8,规避
write_excel_csv2在quote="none"参数下的编码偏移问题,解决首字符丢失的bug。
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

