SQLite如何处理CSV 虚拟表(三十七)

news/2025/1/15 22:39:01/

返回: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”等。


http://www.ppmy.cn/news/1450731.html

相关文章

VS code 同步odata服务

在做UI5得开发过程中,经常会出现odata需要更新 那么已经加载过得项目如何去跟新odata服务呢 可以通过如下步骤 1.右键打开应用信息 2.找到manage service models 3.点击编辑 4.选中 刷新并保存

【Java EE】CAS原理和实现以及JUC中常见的类的使用

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

【数据结构】如何创建一棵红黑树(附动图讲解)

一、前言 二、红黑树的概念 三、红黑树的性质 四、红黑树节点的定义 五、红黑树的插入 5.1 节点的初始颜色 5.2 红黑树的调整 六、红黑树的验证 6.1 验证有序 6.2 验证红黑树性质 七、红黑树与AVL树的比较 一、前言 在前面AVL树的学习中,我们知道了如何…

服务器数据恢复—异常断电导致RAID模块故障的数据恢复案例

服务器数据恢复环境: 某品牌ProLiant DL380系列服务器,服务器中有一组由6块SAS硬盘组建的RAID5阵列,WINDOWS SERVER操作系统,作为企业内部文件服务器使用。 服务器故障: 机房供电几次意外中断,服务器出现故…

Axios 库相关

目录 一、含义 二、作用 三、使用 1. 安装 Axios 2. 引入 Axio 3. 发送 GET 请求 4. 发送 POST 请求 5. 设置请求头:通过 headers 选项设置请求头 6. 取消请求:Axios 允许取消请求,可以使用 CancelToken 来实现 一、含义 Axios是一个…

关于开源软件的影响力的探讨

开源软件的影响力 开源软件在软件开发领域中扮演着至关重要的角色,其影响力主要体现在以下几个方面: 开放源代码促进了全球开发者之间的协作和交流: 开源软件的源代码是公开可见的,这意味着任何人都可以查看、修改和分享代码。这…

力扣题目:查找共同字符

力扣题目:查找共同字符 开篇 题目链接: 1002.查找共同字符 题目描述 代码思路 使用哈希表,记录每一个字母出现的次数,每次更新最小值,寻找最小值不为0到字母,添加到list列表中 代码纯享版 class Solution {publi…

Netty 网络编程深入学习【一】:ByteBuffer 源码解析

ByteBuffer源码阅读 ByteBuffer是一个用于处理字节数据的缓冲区类。它是Java NIO 包的一部分,提供了一种高效的方式来处理原始字节数据。 ByteBuffer 可以用来读取、写入、修改和操作字节数据,它是一种直接操作字节的方式,比起传统的 InputSt…