场景 CSV 源文件类似于: 最后使用 2/3 列数据导出 JSON 代码实现 use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; const VALID_ROW_START: u32 = 2; const CSV_SOURCE: &'static str = include_str!("/Users/aqrun/Documents/11.csv"); const DEFAULT_VALUE: &'static str = ""; const JSON_FILE: &'static str = "target/links.json"; fn main() { let links: Vec<ChannelLink> = handle_csv(); println!("{:?}", &links); export_to_json(&links[..]); } pub fn export_to_json(links: &[ChannelLink]) { let mut results: BTreeMap<String, String> = BTreeMap::new(); links.iter().for_each(|item| { results.insert( String::from(item.new_key.as_str()), String::from(item.value.as_str()), ); }); let content = serde_json::to_string_pretty(&results).unwrap(); std::fs::write(JSON_FILE, &content).unwrap(); } pub fn handle_csv() -> Vec<ChannelLink> { let mut links: Vec<ChannelLink> = Vec::new(); let mut row_index = 0u32; CSV_SOURCE.split("\n") .for_each(|row| { if is_valid_row(row, row_index) { let items = row.split(",").collect::<Vec<&str>>(); links.push(ChannelLink { app_name: get_column(&items[..], 0), key: get_column(&items[..], 1), new_key: get_column(&items[..], 2), value: get_column(&items[..], 3), }); } row_index += 1; }); links } fn get_column(items: &[&str], column: usize) -> String { let data = *items.get(column).unwrap_or(&DEFAULT_VALUE); String::from(data) } pub fn is_valid_row(row: &str, row_index: u32) -> bool { if row_index < VALID_ROW_START { return false; } if row.is_empty() { return false; } if row.starts_with("表格 1") { return false; } return true; } #[derive(Debug, Serialize, Deserialize)] pub struct ChannelLink { pub app_name: String, pub key: String, pub new_key: String, pub value: String, }