使用csv库和最新的Rust版本1.31.0,我希望能够像读取UTF-8编码文件一样轻松地读取ANSI(Windows 1252)编码的CSV文件。
在将整个文件读入Vec<u8>
后,我尝试过以下方法(但都没有成功):
事实上,在我们公司中,有许多ANSI编码的CSV文件。
如果可能的话,我也希望不要将整个文件加载到Vec<u8>
中,而是逐行读取(以CRLF
结尾),因为许多文件都很大(50 MB或更多...)。
在文件Cargo.toml中,我有这个依赖项:
[dependencies]
csv = "1"
"
test.csv包含以下内容,保存为Windows-1252编码:
"Café;au;lait
Café;au;lait
main.rs文件中的代码:
extern crate csv;
use std::error::Error;
use std::fs::File;
use std::io::BufReader;
use std::path::Path;
use std::process;
fn example() -> Result<(), Box<Error>> {
let file_name = r"test.csv";
let file_handle = File::open(Path::new(file_name))?;
let reader = BufReader::new(file_handle);
let mut rdr = csv::ReaderBuilder::new()
.delimiter(b';')
.from_reader(reader);
// println!("ANSI");
// for result in rdr.byte_records() {
// let record = result?;
// println!("{:?}", record);
// }
println!("UTF-8");
for result in rdr.records() {
let record = result?;
println!("{:?}", record);
}
Ok(())
}
fn main() {
if let Err(err) = example() {
println!("error running example: {}", err);
process::exit(1);
}
}
输出为:
UTF-8
error running example: CSV parse error: record 0 (line 1, field: 0, byte: 0): invalid utf-8: invalid UTF-8 in field 0 near byte index 3
error: process didn't exit successfully: `target\debug\test-csv.exe` (exit code: 1)
当使用
rdr.byte_records()
(取消代码的相关部分注释)时,输出如下:ANSI
ByteRecord(["Caf\\xe9", "au", "lait"])