العمل مع CSV في C++: نظرة عامة على المكتبات وأمثلة عملية
CSV (قيم مفصولة بفواصل) — أحد أكثر التنسيقات شيوعًا لتخزين البيانات الجدولية. لا يحتوي C++ على دعم مدمج لـ CSV، ومع ذلك، توجد العديد من المكتبات والطرق لقراءة وكتابة ومعالجة هذه الملفات. في هذه المقالة، سنستعرض الطرق الرئيسية للعمل مع CSV في C++، بما في ذلك المكتبات الشائعة libcsv و rapidcsv، بالإضافة إلى تنفيذ محلل باستخدام الأدوات القياسية.
لماذا تعتبر CSV مهمة لـ C++؟
تُستخدم CSV لتبادل البيانات بين الأنظمة، والتصدير من قواعد البيانات، والتعلم الآلي، والحسابات العلمية. في C++، غالبًا ما تكون هناك حاجة للعمل مع CSV في التطبيقات لمعالجة السجلات، والتكوينات، أو استيراد البيانات من Excel. الاختيار الصحيح للمكتبة يسرع التطوير ويزيد من موثوقية الكود.
مكتبة libcsv
libcsv — مكتبة خفيفة الوزن بلغة C، وهي مناسبة تمامًا لمشاريع C++. تدعم تحليل CSV مع فواصل قابلة للتخصيص، وهروب الأحرف، ومعالجة الأخطاء.
- دعم فواصل مختلفة (فاصلة، فاصلة منقوطة، علامة تبويب).
- العمل مع السلاسل المهربة وعلامات الاقتباس.
- استهلاك ضئيل للذاكرة.
مثال لقراءة CSV باستخدام libcsv:
#include <csv.h>#include <iostream>#include <vector>#include <string>
struct csv_state { std::vector<std::vector<std::string>> rows;};
void cb1(void *s, size_t len, void *data) { auto *state = static_cast<csv_state*>(data); state->rows.back().push_back(std::string(static_cast<char*>(s), len));}
void cb2(int c, void *data) { auto *state = static_cast<csv_state*>(data); state->rows.emplace_back();}
int main() { struct csv_parser p; csv_init(&p, CSV_STRICT); csv_set_delim(&p, ',');
csv_state state; state.rows.emplace_back();
const char *input = "Name,Age,CityAlice,30,New YorkBob,25,London"; csv_parse(&p, input, strlen(input), cb1, cb2, &state); csv_fini(&p, cb1, cb2, &state);
for (auto &row : state.rows) { for (auto &col : row) { std::cout << col << " "; } std::cout << std::endl; }
csv_free(&p); return 0;}مكتبة rapidcsv
rapidcsv — مكتبة C++ حديثة بواجهة سهلة الاستخدام. تدعم قراءة وكتابة CSV، والتحديد التلقائي لأنواع البيانات، والعمل مع الرؤوس.
- API بسيط يعتمد على حاويات STL.
- تحويل تلقائي للسلاسل إلى أرقام.
- دعم الفواصل المخصصة وترميزات الأحرف.
مثال لكتابة وقراءة CSV باستخدام rapidcsv:
#include <rapidcsv.h>#include <iostream>
int main() { // كتابة CSV rapidcsv::Document doc("", rapidcsv::LabelParams(0, 0)); doc.SetCell<std::string>(0, 0, "Product"); doc.SetCell<int>(1, 0, 2023); doc.SetCell<double>(2, 0, 99.99); doc.Save("data.csv");
// قراءة CSV rapidcsv::Document docRead("data.csv"); std::string product = docRead.GetCell<std::string>(0, 0); int year = docRead.GetCell<int>(1, 0); double price = docRead.GetCell<double>(2, 0);
std::cout << "Product: " << product << ", Year: " << year << ", Price: " << price << std::endl; return 0;}العمل مع CSV عبر الأدوات القياسية لـ C++
إذا كنت لا ترغب في تضمين مكتبات خارجية، يمكنك تنفيذ محلل باستخدام std::stringstream و std::getline. هذا مناسب لملفات CSV البسيطة بدون هروب الأحرف.
#include <iostream>#include <fstream>#include <sstrea أيضاً في المكتبة
التخزين المؤقت في Go (Golang): Redis، التخزين المؤقت الجماعي والتخزين المؤقت في الذاكرة
العمل مع XML في Rust: مكتبات roxmltree و quick-xml و serde-xml-rs
دليل CoreML لـ Swift: أمثلة عملية وشاملة