读取带有 Rust 的 .dfb 文件会抛出无效字符错误

Reading .dfb file with rust throws invalid character error

我是 Rust 的新手,正在创建一个 POC 将 dbf 文件转换为 csv。我正在使用 rust 库 dbase 读取 .dbf 文件。

问题是,当我使用 dbfview 创建示例 .dbf 文件时,代码工作正常。但是当我使用 .dbf 文件时,我将实时使用它。我收到以下错误。

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: InvalidFieldType('M')', src/libcore/result.rs:999:5

这是我在给定 link.

中使用的代码
use dbase::FieldValue;
let records = dbase::read("tests/data/line.dbf").unwrap();
for record in records {
    for (name, value) in record {
        println!("{} -> {:?}", name, value);
        match value {
            FieldValue::Character(string) => println!("Got string: {}", string),
            FieldValue::Numeric(value) => println!("Got numeric value of  {}", value),
            _ => {}
        }
    }
}

我认为 ^M 显示了 windows 附加的字符。 我该怎么做才能处理此错误并成功读取文件。 任何帮助都感激不尽。

对您的问题的简短回答是否定的,您将无法使用 dbase-rs(或任何当前库)读取此文件,并且您很可能需要重新处理此文件以使其不包含备注字段。


深入了解 DBF 文件格式

InvalidFieldType 错误指向您的图书馆无法处理的文件结构特征 - 备注字段。我们将 deep-dive 进入文件以找出原因,以及我们是否可以采取任何措施来修复它。

这是header定义:

特别重要的是字节 28(偏移量 0000010,字节 0C),它是一个位掩码,指示 table 是否包含一堆可能的东西,最值得注意的是:

  • 0x01 如果文件带有关联的 .cdx 文件
  • 0x02 如果它包含备忘录
  • 0x04 如果文件实际上是一个 .dbc 文件(一个数据库)

0x03,您的文件附带一个关联的 .cdx 文件并包含一份备忘录。正如我们(提前)知道 dbase-rs 无法处理的那样,这种情况看起来越来越有可能。

让我们继续寻找。从这里开始,每个字段都是 32 字节长。

这是您的字段:

0-10字节是字段名,11字节是类型。由于您要使用的库只能解析某些字段,我们只真正关心字节 11。

按库可以解析的顺序排列:

  • [x] CALL_ID(整数)
  • [x] CONTACT_ID(整数)
  • [x] CALL_DATE(日期时间)
  • [x] 主题 (char[])
  • [ ] 注释(备忘录)

最后一个字段是有问题的。查看库本身,this field type is not supported,因此会产生一个 Error,而您正试图 unwrap()。这是您的错误来源。

两种三种方式:

  • "long" 方法是修补库以处理备注字段。这听起来很容易,但实际上并非如此。由于备忘录存储在另一个文件中(通常是同一文件夹中的 dbt 文件),您将不得不让该库读取这两个文件并引用这两个文件。备忘录类型本身的要点是在一个字段中存储超过 255 个字节的数据。您是唯一能够评估这项工作是否值得付出努力的人。
  • 如果您的数据小于 255 字节,您可以用 char 字段替换那个 memo 字段,dbfview 应该允许您这样做
  • 如果您的字段超过 255 个字节并且您可以使用 运行 sub-processes(即 Command::run),您可以 sneak-convert 使用可以 处理另一种语言的备注字段的库。 this nodeJS library can, but read-only,例如