当前位置: 首页 > news >正文

DeepSeek辅助编写的利用quick_xml把xml转为csv的rust程序

提示词

请用rust quickxml库实现读取xml的row和c标签信息,并输出到csv格式,要求是:数值型c,输出标签的内容,字符串型c(t = “inlineStr”),输出的内容,row的r属性表是行号,c的r属性是字母列号行号,如果不连续,就在中间补空列,用逗号分隔各列,一行完全输出后换行,如果1行全为空,不输出该行,为便于查对,每行开头输出row的r属性行号,利用内存映射文件实现。只输出代码,不干别的。

use quick_xml::events::Event;
use quick_xml::Reader;
use memmap2::Mmap;
use std::fs::File;
use std::io::{self, Write};
use std::path::Path;fn main() -> io::Result<()> {let file_path = "input.xml";let file = File::open(file_path)?;let mmap = unsafe { Mmap::map(&file)? };let mut reader = Reader::from_reader(&mmap[..]);reader.trim_text(true);let mut buf = Vec::new();let mut current_row: Option<u32> = None;let mut current_cells: Vec<Option<String>> = Vec::new();let mut output = io::stdout();loop {match reader.read_event_into(&mut buf) {Ok(Event::Start(ref e)) => {match e.name().as_ref() {b"row" => {if let Some(attrs) = e.attributes().filter_map(Result::ok).find(|a| a.key.as_ref() == b"r") {if let Ok(r_val) = String::from_utf8(attrs.value.to_vec()) {current_row = r_val.parse().ok();}}current_cells.clear();}b"c" => {let mut cell_type = None;let mut cell_ref = None;for attr in e.attributes().filter_map(Result::ok) {match attr.key.as_ref() {b"t" => {cell_type = String::from_utf8(attr.value.to_vec()).ok();}b"r" => {cell_ref = String::from_utf8(attr.value.to_vec()).ok();}_ => {}}}let mut cell_value = None;let mut in_v = false;let mut in_t = false;loop {match reader.read_event_into(&mut buf) {Ok(Event::Start(ref e)) => {match e.name().as_ref() {b"v" => in_v = true,b"t" => in_t = true,_ => {}}}Ok(Event::Text(e)) => {if in_v || in_t {if let Ok(text) = e.unescape() {cell_value = Some(text.to_string());}}}Ok(Event::End(ref e)) => {if e.name().as_ref() == b"c" {break;}if e.name().as_ref() == b"v" {in_v = false;}if e.name().as_ref() == b"t" {in_t = false;}}Ok(Event::Eof) => break,_ => {}}}if let Some(c_ref) = cell_ref {if let Some(col) = parse_column(&c_ref) {while current_cells.len() <= col {current_cells.push(None);}current_cells[col] = cell_value;}}}_ => {}}}Ok(Event::End(ref e)) => {if e.name().as_ref() == b"row" {if let Some(row_num) = current_row {if current_cells.iter().any(Option::is_some) {write!(output, "{}", row_num)?;for cell in &current_cells {write!(output, ",")?;if let Some(val) = cell {write!(output, "\"{}\"", val)?;}}writeln!(output)?;}}current_row = None;current_cells.clear();}}Ok(Event::Eof) => break,Err(e) => {eprintln!("Error reading XML: {}", e);break;}_ => {}}buf.clear();}Ok(())
}fn parse_column(ref_str: &str) -> Option<usize> {let mut col_str = String::new();for c in ref_str.chars() {if c.is_ascii_alphabetic() {col_str.push(c);} else {break;}}if col_str.is_empty() {return None;}let mut col = 0;for c in col_str.chars() {col = col * 26 + (c.to_ascii_uppercase() as usize - 'A' as usize + 1);}Some(col - 1)
}

相应Cargo.toml

[package]
name = "xml-to-csv"
version = "0.1.0"
edition = "2024"[dependencies]
quick-xml = "0.31.0"
memmap2 = "0.9.0"

编译执行

export CARGO_INCREMENTAL=1
export PATH=/par:/par/mold240/bin:$PATH
cargo build --release/par/xmlcsv/target/release# ./xml-to-csv
1,"1","15519","785","1","17.00","24386.67","0.04","0.02","N","O","35137.0","35107.0","35146.0","DELIVER IN PERSON","TRUCK","to beans x-ray carefull"
2,"1","6731","732","2","36.00","58958.28","0.09","0.06","N","O","35167.0","35123.0","35175.0","TAKE BACK RETURN","MAIL","according to the final foxes. qui"/par# time xmlcsv/target/release/xml-to-csv >quickxml.csvreal    1m28.133s
user    0m5.104s
sys     0m5.273s

文章转载自:

http://cR4x4aUH.rnytd.cn
http://K0aZxxza.rnytd.cn
http://W24yb2Au.rnytd.cn
http://3CwImjxo.rnytd.cn
http://evaqz1nS.rnytd.cn
http://6hdf5zXx.rnytd.cn
http://vu5aTSFB.rnytd.cn
http://PWCadEvo.rnytd.cn
http://4Yqkexgn.rnytd.cn
http://7UrT9Vir.rnytd.cn
http://0eCupsic.rnytd.cn
http://83kL8Tyi.rnytd.cn
http://4XkCZ5DP.rnytd.cn
http://JHsx6Vth.rnytd.cn
http://cEHktEgC.rnytd.cn
http://Q5DmHI8i.rnytd.cn
http://gdHRYI6E.rnytd.cn
http://QjZLQG2U.rnytd.cn
http://O8NWH46H.rnytd.cn
http://W6oc85Ka.rnytd.cn
http://ofW8wUUW.rnytd.cn
http://6SSv6idS.rnytd.cn
http://lAxpCn1B.rnytd.cn
http://oe338mEF.rnytd.cn
http://VeqEndpT.rnytd.cn
http://bjpONBt8.rnytd.cn
http://pSVOLQhL.rnytd.cn
http://dPiAUYTT.rnytd.cn
http://yh8aZVuK.rnytd.cn
http://VVfMSbQQ.rnytd.cn
http://www.dtcms.com/a/378298.html

相关文章:

  • Rider中的Run/Debug配置对应的本地文件
  • 综合项目实践:基于基础语法核心的Python项目
  • 开始 ComfyUI 的 AI 绘图之旅-Flux.1图生图(八)
  • 供应商管理系统包含哪些模块?
  • MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
  • Apache服务——搭建实验
  • “一半是火焰,一半是海水”,金融大模型的爆发与困局
  • 开源 C++ QT Widget 开发(十六)程序发布
  • MPC控制器C语言实现:基于一阶RL系统
  • C++版单例模式-现代化简洁写法
  • 强大的开源文档问答工具-Kotaemon
  • 音视频学习(六十三):AVCC和HVCC
  • 深度解析强化学习(RL):原理、算法与金融应用
  • 独立显卡和集成显卡切换电脑卡住了怎么办?
  • 加固笔记本是什么意思?加固笔记本图片
  • 光子精密3D线激光轮廓测量仪:赋能手机生产全流程质量与效率升级
  • springboot excel 表格入门与实战
  • react实现无缝轮播组件
  • DbGate数据库管理新方案:cpolar打造跨平台远程访问通道
  • Spark+Hive中间件
  • 【案例分享】TeeChart 助力 Softdrill 提升油气钻井数据可视化能力
  • 在图形 / 游戏开发中,为何 Pixels Per Unit(PPU)数值越小,物体在屏幕上显示的尺寸越大?
  • new和mallo的区别
  • mysql中%前置模糊查询怎么优化
  • 单串口服务器-工业级串口联网解决方案
  • 使用 Tkinter + Requests 实现地理信息安全系统学习时长助手
  • 多语言共享贩卖机投资理财共享售卖机投资理财系统
  • 京东JDS 测评图形规律题答题技巧
  • 打工人日报#20250911
  • 一、WPF入门介绍+Grid和StackPanel布局介绍+实战模拟Notepad++页面布局