英文:
julia writedlm adding extra quotes when there are quotes within a string
问题
我正在将文件读入字符串列表,使用换行符作为分隔符。我更改了其中一些行,然后将该列表写回文件。这会在某些行上添加额外的引号。
这可能是`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"";"
<details>
<summary>英文:</summary>
I'm reading a file into a list of strings using new-lines as separators. I'm changing a few of the lines, then writing that list back to the file. This adds in extra quotation marks only on certain lines.
This might be a bug in `writedlm`. Most of the file is written with the expected behavior. It appears to mess up when there are quotes within the string. Any idea why this is happening, how to fix it, or where to report this if it's a bug?
Code:
file = "og_file.F"
new_file = "new_file.F"
f = read(file, String)
meta = split(f, "\n")
writedlm(new_file, meta)
Original file:
#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"
output file:
"#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"""
</details>
# 答案1
**得分**: 1
以下是您要的内容的翻译:
这是有意的。原因是`writedlm`旨在写入表格数据(每行具有多个字段)。在这种情况下,标准行为是使用双引号`"`来包装包含它们的字段,请参考https://en.wikipedia.org/wiki/Comma-separated_values:
>更复杂的CSV实现允许它们,通常需要在包含保留字符(如逗号、双引号或较不常见的换行符)的值周围使用"(双引号)字符。然后,嵌入的双引号字符可以由一对连续的双引号表示。
对于您的用例,最好使用如下方式:
``` file = "og_file.F"
new_file = "new_file.F"
meta = readlines(file)
open(new_file, "w") do io
foreach(line -> println(io, line), meta)
end
英文:
This is intended. The reason is that writedlm
is intended to write tabular data (having multiple fields per one line). In this case a standard behavior is to use double quotes "
to wrap fields that contain them, see https://en.wikipedia.org/wiki/Comma-separated_values:
> More sophisticated CSV implementations permit them, often by requiring " (double quote) characters around values that contain reserved characters (such as commas, double quotes, or less commonly, newlines). Embedded double quote characters may then be represented by a pair of consecutive double quotes
For your use case instead it is better to use e.g.:
file = "og_file.F"
new_file = "new_file.F"
meta = readlines(file)
open(new_file, "w") do io
foreach(line -> println(io, line), meta)
end
答案2
得分: 0
I solved it by adding in the keyword arg for quotes (based off of this answer from julia hub). There is no easily accessible documentation about it, had to look at the source code for writedlm
.
writedlm(new_file, meta, quotes=false)
英文:
Thanks for explaining why this is the expected behavior!
I solved it by adding in the keyword arg for quotes (based off of this answer from julia hub). There is no easily accessible documentation about it, had to look at the source code for writedlm
.
writedlm(new_file, meta, quotes=false)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论