如何在 Firebird 中创建外部表并将其与 CSV 文件关联?

问题描述 投票:0回答:1

我使用逗号分隔字段创建了一个 CSV 文件。每行有两个字段值,以逗号分隔。我使用两个字段并引用 CSV 文件的文件规范创建了一个外部表。当我使用以下命令时:

insert into realtable (field1, field2) select from externaltable (field1, field2);

csv 文件中的所有数据都插入到 field1 中。使用 create table 命令时似乎无法识别逗号。创建外部表时如何指定分隔符值?

firebird external-tables
1个回答
0
投票

Firebird 外部表使用binary 格式。它与 Firebird 在内存中保存行时使用的格式基本相同(当在普通表中将行写入磁盘时,它会对该行应用 RLE 压缩,但不适用于外部表)。

换句话说,你无法直接使用外部表读取CSV文件。

有一个技巧可以让 Firebird 外部表作为固定宽度文本格式工作(即每列具有相同的宽度,并且需要使用空格将值填充到列的声明长度) )。为此,您只需使用

CHAR
列,并为换行符添加一个额外的列(如果仅使用 LF,则为
CHAR(1)
;如果使用 CR/LF,则为
CHAR(2)
)。建议明确指定列的字符集。请注意,对于此技巧,不建议使用像 UTF-8 这样的多字节字符集(与 UTF-8 一样,它将不再是固定宽度文本(仅以字节为单位的固定宽度),并且以字节为单位的长度将是字符长度的 4 倍)。

或者,您可以使用工具将 CSV 文件转换为 Firebird 外部表。我编写了这样一个工具,Firebird 外部表生成器,或 ext-table-gen(它是免费且开源的)。当前版本仅支持如上所述的

CHAR
列,下一版本还将支持数据类型
SMALLINT
INTEGER
BIGINT
INT128
DATE
TIME
TIMESTAMP
NUMERIC
DECIMAL

它附带了一个手册更详细地描述了其使用,但是解释一下手册中的示例,您可以从CSV文件中导出外部表的定义:

CSV 文件:

ID,Lastname,Firstname,Email
1,Doe,John,[email protected]
2,Doe,Jane,[email protected]
3,Deer,Jason,[email protected]
4,Deer,Jillian,[email protected]

生成外部表文件的命令:

ext-table-gen --csv-file=C:\path\to\persons.csv --table-file=C:\path\to\persons.dat --config-out=C:\path\to\persons.xml

这会生成一个外部表文件,

persons.dat
,还会生成一个 XML 配置文件,
persons.xml
。您可以进一步修改该文件。例如,如果您想重用配置来重复导入 CSV 的新版本,则定义比从初始文件派生的列更宽的列可能是有意义的。

配置文件还显示了定义外部表所需的 DDL。注意:如果您更改列定义,那么还要确保修改 DDL,或者重新生成配置文件,当然还要重新生成 person.dat,以便它符合更广泛的格式。

对于示例,它为外部表生成以下 DDL:

create table "DEFAULT_EXTERNAL_TABLE_NAME" external file 'C:\path\to\persons.dat' (
  "ID" char(1) character set ISO8859_1,
  "Lastname" char(4) character set ISO8859_1,
  "Firstname" char(7) character set ISO8859_1,
  "Email" char(19) character set ISO8859_1,
  "LF" char(1) character set ASCII default _ASCII x'0a'
);

执行DDL,然后就可以从

ext-table-gen
创建的persons.dat文件中进行选择。

select * from DEFAULT_EXTERNAL_TABLE_NAME
© www.soinside.com 2019 - 2024. All rights reserved.