Julia writedlm遇字符串含引号时添加多余引号问题求助
关于Julia writedlm导出含引号行时添加多余引号的问题
问题描述
将文件按换行分割为字符串列表,修改部分行后用writedlm写回时,发现包含引号的行被自动添加了外层引号,内部引号也被转义成双引号。示例代码、原文件及输出文件如下:
示例代码
file = "og_file.F" new_file = "new_file.F" f = read(file, String) meta = split(f, "\n") writedlm(new_file, meta)
原文件内容
#include "DARWIN_OPTIONS.h" CBOP C !ROUTINE: DARWIN_PLANKTON C !INTERFACE: ========================================================== SUBROUTINE DARWIN_PLANKTON( I Ptr, U gTr, O chlout, diags, I PAR, photoTempFunc, hetTempFunc, grazTempFunc, reminTempFunc, I mortTempFunc, mort2TempFunc, uptakeTempFunc, #ifdef DARWIN_DEBUG I iG, jG, k, dT, #endif I myTime,myIter,myThid) C !DESCRIPTION: C !USES: =============================================================== IMPLICIT NONE #ifdef ALLOW_RADTRANS #include "RADTRANS_SIZE.h" #endif #include "DARWIN_SIZE.h" #include "DARWIN_INDICES.h" #include "DARWIN_DIAGS.h" #include "DARWIN_RADTRANS.h" #include "DARWIN_PARAMS.h" #include "DARWIN_TRAITS.h"
输出文件内容
"#include ""DARWIN_OPTIONS.h""" CBOP C !ROUTINE: DARWIN_PLANKTON C !INTERFACE: ========================================================== SUBROUTINE DARWIN_PLANKTON( I Ptr, U gTr, O chlout, diags, I PAR, photoTempFunc, hetTempFunc, grazTempFunc, reminTempFunc, I mortTempFunc, mort2TempFunc, uptakeTempFunc, #ifdef DARWIN_DEBUG I iG, jG, k, dT, #endif I myTime,myIter,myThid) C !DESCRIPTION: C !USES: =============================================================== IMPLICIT NONE #ifdef ALLOW_RADTRANS "#include ""RADTRANS_SIZE.h""" #endif "#include ""DARWIN_SIZE.h""" "#include ""DARWIN_INDICES.h""" "#include ""DARWIN_DIAGS.h""" "#include ""DARWIN_RADTRANS.h""" "#include ""DARWIN_PARAMS.h""" "#include ""DARWIN_TRAITS.h"""
问题原因
这不是writedlm的bug,而是它的预期设计行为。writedlm的定位是处理表格/分隔符分隔的数据,默认会对包含特殊字符(如引号、分隔符)的字符串添加外层引号包裹,并将内部引号转义为双引号,以此避免数据解析时出现歧义。而你的场景是单纯的文本文件读写,并不需要表格格式的转义逻辑。
解决办法
针对纯文本读写场景,有两种更合适的处理方式:
方法1:直接使用文本写入函数
跳过writedlm,用write或open+println直接写入文本,完全保留原格式:
file = "og_file.F" new_file = "new_file.F" f = read(file, String) meta = split(f, "\n") # 方式A:拼接字符串后写入 write(new_file, join(meta, "\n")) # 方式B:逐行写入(更适合处理大文件) open(new_file, "w") do io for line in meta println(io, line) end end
方法2:修改writedlm参数
如果一定要使用writedlm,可以通过quotemark=nothing参数禁用引号包裹逻辑:
writedlm(new_file, meta, quotemark=nothing)
反馈说明
由于这是writedlm的预期行为,不属于bug。如果后续遇到不符合官方文档描述的异常问题,可前往Julia官方GitHub仓库的Issue板块提交反馈。
内容的提问来源于stack exchange,提问作者bbbddd
相关产品推荐
相关产品推荐

