العمل مع CSV في Rust: مكتبة csv ومعالجة البيانات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع CSV في Rust: مكتبة csv وأمثلة عملية



يظل تنسيق CSV (قيم مفصولة بفواصل) أحد أكثر الطرق شيوعًا لتخزين البيانات الجدولية. في Rust، توجد مكتبة ناضجة وعالية الأداء csv للعمل مع CSV، والتي توفر واجهة برمجة تطبيقات مريحة لقراءة البيانات وكتابتها ومعالجتها. في هذه المقالة، سنشرح بالتفصيل كيفية العمل بكفاءة مع CSV في Rust.



تثبيت المكتبة وتضمينها



للبدء، أضف التبعية إلى ملف Cargo.toml:



[dependencies]csv = "1.3"


تدعم مكتبة csv العمل مع الترميزات، والمحددات القابلة للتخصيص، وعلامات الاقتباس، كما توفر إمكانية تسلسل/إلغاء تسلسل البيانات من خلال خصائص serde.



قراءة ملف CSV



أبسط طريقة لقراءة CSV هي استخدام csv::Reader. لنلقِ نظرة على مثال مع ملف users.csv:



use std::error::Error;use csv::ReaderBuilder;

fn main() -> Result<(), Box<dyn Error>> { // إنشاء قارئ مع إعدادات let mut rdr = ReaderBuilder::new() .has_headers(true) // السطر الأول هو الرؤوس .delimiter(b',') // المحدد هو الفاصلة .from_path("users.csv")?;

// طباعة الرؤوس let headers = rdr.headers()?; println!("الرؤوس: {:?}", headers);

// التكرار عبر السجلات for result in rdr.records() { let record = result?; println!("{:?}", record); } Ok(())}


معالجة السجلات باستخدام إلغاء التسلسل



للعمل مع البيانات المنظمة، من المناسب استخدام إلغاء التسلسل إلى هياكل مخصصة. قم بتضمين serde و serde_derive:



[dependencies]csv = "1.3"serde = { version = "1.0", features = ["derive"] }


الآن يمكنك تعريف الهيكل وقراءة البيانات مباشرة:



use serde::Deserialize;

#[derive(Debug, Deserialize)]struct User { name: String, age: u8, email: String,}

fn main() -> Result<(), Box<dyn std::error::Error>> { let mut rdr = csv::Reader::from_path("users.csv")?;

for result in rdr.deserialize() { let user: User = result?; println!("المستخدم: {} ({} سنة) - {}", user.name, user.age, user.email); } Ok(())}


كتابة البيانات إلى CSV



للكتابة، يُستخدم csv::Writer. مثال على كتابة بيانات منظمة:



use csv::Writer;use serde::Serialize;

#[derive(Debug, Serialize)]struct Product { id: u32, name: String, price: f64, in_stock: bool,}

fn main() -> Result<(), Box<dyn std::error::Error>> { let mut wtr = Writer::from_path("products.csv")?;

// كتابة الرؤوس wtr.write_record(&["id", "name", "price", "in_stock"])?;

// كتابة البيانات عبر التسلسل let products = vec![ Product { id: 1, name: "لابتوب".into(), price: 75000.50, in_stock: true }, Product { id: 2, name: "فأرة".into(), price: 1500.00, in_stock: false }, ];

for product in &products { wtr.serialize(product)?; }

wtr.flush()?; println!("تمت كتابة البيانات إلى products.csv"); Ok(())}


تخصيص المحددات وعلامات الاقتباس



تسمح المكتبة بتخصيص التنسيق بمرونة. على سبيل المثال، لـ TSV (علامة التبويب كمحدد):



let mut rdr = csv::ReaderBuilder::new()    .delimiter(b'\\t')    .flexible(true) // السماح بعدد مختلف من الحقول    .quoting(false) // تعطيل علامات الاقتباس    .from_reader(io::stdin());


معالجة الأخطاء والملفات الكبيرة



عند العمل مع ملفات CSV كبيرة، من المهم مراعاة الأداء. تستخدم csv قراءة مخزنة ولا تقوم بتحميل

توصيات