我正在尝试在iOS上以编程方式创建xlsx文件.由于xlsx文件的内部数据基本上存储在单独的xml文件中,因此我尝试使用其所有文件和子目录重新创建xlsx结构,将它们压缩为zip文件并将其扩展名设置为xlsx.我使用GDataXML解析器/编写器来创建所有必需的xml文件.但是,我得到的文件无法作为xlsx文件打开.即使我从有效的xlsx文件中删除所有数据,也可以通过从原始xml文件复制数据并手动压缩来手动创建所有xml文件,但我无法重新创建有效的xlsx文件.
问题是:
这个问题的目的是提供一个规范的答案.
给定可能由Excel或其他具有嵌入换行符的工具生成的CSV,嵌入式双引号和空字段,如:
$ cat file.csv
"rec1, fld1",,"rec1"",""fld3.1
"",
fld3.2","rec1
fld4"
"rec2, fld1.1
fld1.2","rec2 fld2.1""fld2.2""fld2.3","",rec2 fld4
Run Code Online (Sandbox Code Playgroud)
使用awk识别单独记录和字段的最有效方法是什么:
Record 1:
$1=<rec1, fld1>
$2=<>
$3=<rec1","fld3.1
",
fld3.2>
$4=<rec1
fld4>
----
Record 2:
$1=<rec2, fld1.1
fld1.2>
$2=<rec2 fld2.1"fld2.2"fld2.3>
$3=<>
$4=<rec2 fld4>
----
Run Code Online (Sandbox Code Playgroud)
所以它可以在awk脚本的其余部分内部用作那些记录和字段.
有效的CSV将符合RFC 4180或可由MS-Excel生成.
解决方案必须允许记录结束只是LF(\n),这是UNIX文件的典型情况,而不是CRLF(\r\n),正如标准所要求的那样,Excel或其他Windows工具会生成.它还可以容忍与引用字段混合的未加引号的字段.它特别不需要容忍"使用前面的反斜杠转义s(即\"代替""),因为其他一些CSV格式允许 - 如果你有,那么添加一个gsub(/\\"/,"\"\"")前端将处理它并尝试在一个脚本中自动处理两个转义机制将使脚本不必要地脆弱和复杂.