如何将Excel或CSV文件加载到Firebird中?

4
我正在使用Firebird数据库,需要将Excel文件加载到数据库表中。我需要一个能够很好地完成这项任务的工具。我尝试了一些在Google上找到的工具,但它们都有一些错误。
由于Excel数据不是由我创建的,所以如果它可以扫描文件并发现其中包含哪种类型的数据,并建议在数据库中创建一个表格,那就太好了。
此外,如果我可以将文件与已经存在于数据库表中的数据进行比较,并且我可以选择要加载哪些数据和哪些不加载,那就更好了。
加载CSV文件的工具也可以,我可以在加载之前从Excel中“另存为”CSV格式。
8个回答

4
如果您能使用CSV格式,那么我想XMLWizard是适合您的工具。它可以加载CSV文件并与数据库数据进行比较。您可以选择要对表格进行的更改。
不要被名称所迷惑,它确实可以处理XML,但也非常适用于CSV文件。它还可以估计列数据类型并为您的文件提供CREATE TABLE语句。

2
它不是免费的(我本来希望找到一些免费软件工具),但似乎工作得非常好。看起来正是我想要的,谢谢。 - codeguru

1

您尝试过FSQL吗?

它是一款免费软件,与Firebird的标准ISQL非常相似,但具有一些额外的功能,例如从CSV文件导入数据。

我已经将其用于DBF文件,并且效果很好。


0
我写了一个工具,Firebird External Table Generator,它可以将CSV文件转换为Firebird的外部表文件格式。它是免费且开源的。
在基本用法中,这个工具将把CSV文件转换为CHAR列,使您能够按原样导入数据。它还允许您修改配置,如更改列长度和不同的列类型。
以下是一个简单的示例(摘自我编写的用户手册):
使用以下persons.csv文件:
ID,Lastname,Firstname,Email
1,Doe,John,john@example.org
2,Doe,Jane,jane@example.org
3,Deer,Jason,jason@example.org
4,Deer,Jillian,jillian@example.org

要转换文件,请使用命令行(注意:我正在使用Windows命令提示符行连续性,对于Linux,请将^替换为\)。
ext-table-gen --csv-file=C:\FirebirdData\csv\persons.csv ^
  --table-file=C:\FirebirdData\exttables\persons.dat ^
  --config-out=C:\FirebirdData\csv\persons.xml

C:\FirebirdData\ 替换为实际路径(或使用相对路径,尽管我不建议这样做,原因在用户手册中有解释)。
文件 persons.dat 包含外部表数据。以这种形式,它是一个固定宽度的文本格式,但如果您修改配置以使用其他数据类型,它实际上是一个固定宽度的二进制格式。 persons.xml 包含用于生成 persons.dat 的配置,以及生成外部表以实际读取它所需的 DDL。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<extTableGenConfig xmlns="https://www.lawinegevaar.nl/xsd/ext-table-gen-1.0.xsd" schemaVersion="2.0">
    <externalTable name="DEFAULT_EXTERNAL_TABLE_NAME" byteOrder="LITTLE_ENDIAN">
        <columns>
            <column name="ID">
                <char length="1" encoding="ISO8859_1"/>
            </column>
            <column name="Lastname">
                <char length="4" encoding="ISO8859_1"/>
            </column>
            <column name="Firstname">
                <char length="7" encoding="ISO8859_1"/>
            </column>
            <column name="Email">
                <char length="19" encoding="ISO8859_1"/>
            </column>
            <endColumn type="LF"/>
        </columns>
        <tableFile path="C:\FirebirdData\exttables\persons.dat" overwrite="false"/>
    </externalTable>
    <tableDerivation columnEncoding="ISO8859_1" endColumnType="LF"/>
    <csvFile path="C:\FirebirdData\csv\persons.csv" charset="UTF-8" headerRow="true">
        <rfc4180CsvParser/>
    </csvFile>
    <informational>
        <ddl>create table "DEFAULT_EXTERNAL_TABLE_NAME" external file 'C:\FirebirdData\exttables\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>
    </informational>
</extTableGenConfig>

你可以在Firebird数据库中执行DDL来创建外部表,然后查询它(在读取文件之前,您需要修改ExternalFileAccess设置,请参阅Firebird配置部分了解详细信息)。

用户手册还描述了如何通过更改列长度使配置文件更具可重用性,以及如何使用不同的数据类型。修改配置文件后,您需要重新运行工具以使用新格式导出文件(并重新生成DDL)。

默认情况下,使用RFC 4180 CSV格式,但您可以更改配置以支持其他CSV文件格式


0
我将Excel文件加载到Lazarus电子表格中,然后导出到Firebird数据库。一切都很好,唯一的问题是fpspreadsheet会将仅包含数字的字符串字段视为数字字段。我可以检查第一行中的标题以查看Excel文件是否有效。

您的回复现在似乎有些简略。也许添加一些步骤或图片会更好。 - user7364588

0

BULK INSERT

另一种方法是在Excel中创建公式,将要导出的数据放入新单元格中。该公式包括字符串格式和长度,根据Firebird中字段的长度进行设置。因此,您可以将所有这些单元格从Excel复制并粘贴到文本编辑器中,以便在Firebird中使用BULK INSERT策略。

更多详细信息请参见http://www.firebirdfaq.org/faq209/

问题是如果您有要导入的blob或null数据,请查看是否有此类值以及此方式是否适合您。 如果您在txt文件中有格式化数据,则BULK INSERT将是快速的方法。

提示:您还可以禁用与表相关联的触发器和索引以加快BULK INSERT的速度,然后再启用它们。

罗伯托·诺瓦科斯基


0

0

0
据我所见,到目前为止所有的回复都集中在工具上,这些工具基本上读取Excel(或CSV)文件,并使用SQL插入将记录插入到Firebird数据库中。虽然这种方法可行,但我始终觉得这种方法非常慢。
这就是为什么我创建了一个工具,它可以读取Excel文件并编写一个文件,该文件具有适合Firebird外部表格的(文本)格式(包括对UTF8字符列的支持),以及一个DDL文件,用于在Firebird中创建外部表格。
然后,我使用常规SQL从外部表格中选择,根据需要进行转换,并将其插入到任何我想要的普通Firebird表格中。根据我的经验,这种方法的性能比客户端应用程序中的SQL插入快得多。
我愿意发布这个工具。它是用C#编写的。如果有兴趣,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接