返回:SQLite—系列文章目录
上一篇:SQLite的DBSTAT 虚拟表(三十六)
下一篇:SQLite的扩展函数Carray()表值函数(三十八)
RFC4180格式是一种文本文件格式,被用于表格数据间的交互,也可将表格数据转化为纯文本文件进行存储。RFC是“请求评论”,是互联网标准化组织IETF用于记录技术规范、协议以及流程的标准文件的编号。
RFC4180规范定义了一种逗号分隔值(CSV)格式,具体描述了文本文件中的数据格式、分隔符、行尾符等,使得该格式成为一种普遍使用的标准格式。
该格式使用逗号分隔字段,每一行代表一个新的数据行,数据行通常使用回车换行来标识行的结束。列头通常在第一行表述并在数据行之前出现。如果某列出现引号字符,则整个列使用引号括起来。如果引号字符本身是列值,则需要用两个引号字符代替。这个规范还要求在文件的末尾必须有一个换行符。
RFC4180格式被广泛使用,在数据转换和传输等场景中成为了事实上的标准。由于其简单和易于实现,数据处理程序和工具通常都支持RFC4180格式的读取和导出。
CSV文件格式是一种将数据保存在简单文本文件中的方式,其中各项由逗号分隔,每行代表一个数据记录(record)。文件包含以下定义:详细请查询:RFC 4180 - Common Format and MIME Type for Comma-Separated Values (CSV) Files
1. 每个记录由一个换行符(CRLF)分隔。每个记录可以包含多个字段(field),逗号分隔。
例子:
aaa, bbb, ccc CRLF
zzz, yyy, xxx CRLF
2. 文件的最后一个记录可能具有不完整的结束符。例如:
aaa, bbb, ccc CRLF
zzz, yyy, xxx
3. 可以在文件的第一行中定义包含字段名称的标题行,以 "|" 表示字段间隔。该标题行应包含与该文件中记录中的字段对应的字段名称,且应与该文件中的记录具有相同数量的字段。
例如:
field_name, field_name, field_name CRLF
aaa, bbb, ccc CRLF
zzz, yyy, xxx CRLF
4. 在标题行和每个记录中,可以使用一个或多个逗号分隔符分隔各个字段。每行的字段数量应在整个文件中保持一致。任何空格都被视为字段的一部分,不能忽略。记录中的最后一个字段不得后跟逗号。
例如:
aaa, bbb, ccc
5. 每个字段可能或可能不用双引号括起来(但有些程序,如Microsoft Excel,根本不使用双引号)。如果字段未用双引号括起来,则字段中不应出现双引号。如果字段未用双引号括起来,则字段中不应出现双引号。例如:
"aaa", "bbb", "ccc" CRLF
zzz, yyy, xxx
6. 必须用双引号括起包含换行符(CRLF),双引号和逗号的字段。例如:
"aaa", "b CRLF
bb", "ccc" CRLF
zzz, yyy, xxx
7. 如果使用双引号括起字段,则必须在字段前面加上另一个双引号。例如
"aaa", "b""bb", "ccc"
该文档中给出了一个ABNF语法,用于进一步定义CSV文件的格式。
通过下述方法处理CSV虚拟表数据注意使用CSV虚拟表可以用两种方式进行处理:
使用方法如:
CSV 虚拟表读取 RFC 4180 格式的逗号分隔 值,并返回该内容,就好像它是 SQL 的行和列一样 桌子。
CSV 虚拟表对于需要大容量加载的应用程序非常有用 大量逗号分隔的值内容。 CSV 虚拟表也可用作模板源文件 实现其他虚拟表。
CSV 虚拟表未内置到 SQLite 合并中。 它可作为单独的源文件使用,可以编译成可加载的扩展名。 命令行 shell 中 CSV 虚拟表的典型用法如下所示:
.load ./csv
CREATE VIRTUAL TABLE temp.t1 USING csv(filename='thefile.csv');
SELECT * FROM t1;
上面脚本的第一行会导致命令行 shell 读取并激活 CSV 的运行时可加载扩展。对于一个 应用程序,等效的 C 语言 API 为 sqlite3_load_extension()。 请注意,文件扩展名(例如:“.dll”或“.so”或“.dylib”)是 从扩展名文件名中省略。省略文件扩展名是 不是必需的,但它有助于使脚本跨平台。SQLite的 将自动附加相应的扩展名。
上面的第二行创建一个名为“t1”的虚拟表,内容为 参数中命名的文件的内容。的数量和名称 列是通过读取第一行自动确定的 内容。CSV 虚拟表的其他选项提供了以下功能: 从字符串而不是单独的文件中获取 CSV 内容,并给出 程序员可以更好地控制列的数量和名称。 下面详细介绍了这些选项。CSV 虚拟表通常为 创建为 TEMP 表,以便它仅对当前数据库存在 连接,并且不会成为数据库架构的永久部分。 请注意,SQLite 中没有“CREATE TEMP VIRTUAL TABLE”命令。 相反,请在虚拟名称前面加上“temp.”架构前缀 桌子。
该示例的第三行显示了正在使用的虚拟表,要读取 CSV 文件的所有内容。这也许是最简单的用法 虚拟表。CSV 虚拟表可以在任何地方使用 可以使用虚拟表。可以在子查询中使用 CSV 虚拟表, 或常用表表达式或添加 WHERE、GROUP BY、HAVING、ORDER BY、 和 LIMIT 子句。
2. 参数说明
上面的示例显示了一个 filename='thefile.csv' 参数 用于 CSV 虚拟表。但其他论点也是可能的。
-
filename=文件名
filename= 参数指定一个外部文件,从中 读取 CSV 内容。每个 CSV 虚拟表都必须具有 filename= 参数或 data= 参数,而不能同时具有两者。
-
数据=文本
data= 参数指定 TEXT 是文本 CSV 文件的内容。
-
schema=架构
schema= 参数指定一个 CREATE TABLE 语句, CSV 虚拟表传递到 sqlite3_declare_vtab() 接口 order 定义虚拟表中列的名称。
-
列=N
columns=N 参数指定列数 在 CSV 文件中。 如果输入数据包含的列数多于此值, 然后忽略多余的列。如果输入数据包含较少的列, 然后用 NULL 填充额外的列。 如果省略 columns=N 参数,则 读取 CSV 文件以确定列数。
-
header=BOOLEAN
或只是
header如果 header 参数为 true,则 CSV 文件的第一行 被视为标头而不是数据。CSV 的第二行 file 成为内容的第一行。 如果省略 schema= 选项,则 CSV 的第一行 file 确定列的名称。
3. 列名
虚拟表的列名主要由 schema= 参数确定。 如果省略了 schema= 参数,但标头为 true,则 在 CSV 文件的第一行中找到的值将成为列名。 如果省略了 schema= 参数并且标头为 false,则 这些列被命名为“C0”、“C1”、“C2”等。