读取带有 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,例如
我是 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,例如