本文主要介绍Rust读写CSV文件方法, Vec类型元素基本操作方法,Rust把一维Vec类型元素、二维Vec类型元素写入CSV文件方法。
实例测试:
要求读“log.csv”文件数据,把“时间”列数据和“次数”列数据写入日志处理结果1.csv文件,把“时间”列数据写入日志处理结果2.csv文件。
log.csv文件:
日志处理结果1.csv文件:
日志处理结果2.csv文件:
实例代码
Cargo.toml添加依赖
[dependencies]
csv = "1.3.0"
main.rc文件代码
#[macro_use]
pub mod macros;
use csv::ReaderBuilder;
use csv::WriterBuilder;
use std::fs::File;
use std::str;
fn main() -> Result<(), Box<dyn std::error::Error>> {
//创建一维Vec
let vec_headers = Vec::from([
"日期时间".to_string(),
"次数".to_string(),
]);
//创建一维Vec
let vec_headers_2 = Vec::from([
"日期时间".to_string(),
]);
// 创建二维Vec
let mut vec_matrix = Vec::new();
//创建一维Vec
let mut vec_date = Vec::new();
let input_path = "log.csv";
/* 读取csv日志文件,并提取主要数据 */
read_csv_file(&input_path, &mut vec_matrix, &mut vec_date).expect("Failed to read CSV file");
/* 处理结果写入csv文件 */
let out_path_1 = "日志处理结果1.csv";
let _z = write_csv_file(&out_path_1, &vec_headers, &vec_matrix);
let out_path_2 = "日志处理结果2.csv";
let _z = write_csv_file_2(&out_path_2, &vec_headers_2,&vec_date);
//打印等待用户按回车键,退出控制台
println!("温馨提示:请按回车键退出......");
// 等待用户按下回车键
let _ = std::io::stdin().read_line(&mut String::new()).expect("TODO:panic message");
Ok(())
}
/*读取csv文件,并提取主要数据 */
pub fn read_csv_file(
path: &str,
vec_matrix: &mut Vec<Vec<String>>,
vec_date: &mut Vec<String>,
) -> Result<(), Box<dyn std::error::Error>> {
let file = File::open(path)?;
let mut reader = ReaderBuilder::new().from_reader(file);
for result in reader.records() {
//创建一维Vec
let mut vec = Vec::new();
let record = result?;
// 处理每一行的数据
//println!("{:?}", record);
//println!("{:?}", record.get(0));
//println!("{}", record.get(0).unwrap());
vec_date.push(record.get(0).unwrap().to_string());
vec.push(record.get(0).unwrap().to_string());
vec.push(record.get(2).unwrap().to_string());
//打印
//println!("{:?}", vec);
//添加到二维Vec
vec_matrix.push(vec);
}
//打印
println!("vec_date:");
println!("{:?}", vec_date);
//打印
println!("vec_matrix包含记录{}条:", vec_matrix.len());
for vec_item in vec_matrix.iter() {
println!("{:?}", vec_item);
}
Ok(())
}
/*把二维Vec写入csv文件 */
pub fn write_csv_file(
path: &str,
headers: &Vec<String>,
records: &Vec<Vec<String>>,
) -> Result<(), Box<dyn std::error::Error>> {
let file = File::create(path)?;
let mut writer = WriterBuilder::new().from_writer(file);
writer.write_record(headers)?;
for record in records {
writer.write_record(record)?;
}
// 确保所有数据都被写入
writer.flush()?;
println!("已成功写入“{}”文件", path);
Ok(())
}
/*把一维Vec写入csv文件 */
pub fn write_csv_file_2(
path: &str,
headers: &Vec<String>,
record: &Vec<String>,
) -> Result<(), Box<dyn std::error::Error>> {
let file = File::create(path)?;
let mut writer = WriterBuilder::new().from_writer(file);
writer.write_record(headers)?;
// 遍历Vec,将每个元素作为一行写入CSV
for item in record {
// 将每个String元素作为单个记录写入CSV
writer.write_record(&[&item])?;
}
// 确保所有数据都被写入
writer.flush()?;
println!("已成功写入“{}”文件", path);
Ok(())
}
macros.rs文件代码
#[allow(unused_macros)]
#[macro_export]
macro_rules! hashmap {
($( $key: expr => $val: expr ),*) => {{
let mut map = ::std::collections::HashMap::new();
$( map.insert($key, $val); )*
map
}}
}
#[allow(unused_macros)]
#[macro_export]
macro_rules! hashmap_s {
($( $key: expr => $val: expr ),*) => {{
let mut map = ::std::collections::HashMap::new();
$( map.insert($key.to_string(), $val); )*
map
}}
}
#[macro_export]
macro_rules! vec_s {
($( $val: expr ),*) => {{
let mut vec = ::std::vec::Vec::new();
$( vec.push($val.to_string()); )*
vec
}}
}
#[macro_export]
macro_rules! hashset {
($( $val: expr ),*) => {{
let mut vec = ::std::collections::HashSet::new();
$( vec.insert($val); )*
vec
}}
}
#[macro_export]
macro_rules! hashset_s {
($( $val: expr ),*) => {{
let mut vec = ::std::collections::HashSet::new();
$( vec.insert($val.to_string()); )*
vec
}}
}