العمل مع CSV في Swift (iOS/macOS) — المكتبات وأمثلة الكود

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

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

ابدأ الدورة

العمل مع CSV في Swift (iOS/macOS): المكتبات، التحليل والأمثلة



CSV (Comma-Separated Values) — أحد أكثر التنسيقات شيوعًا لتبادل البيانات الجدولية. في نظام Apple البيئي (iOS, macOS, watchOS)، غالبًا ما تكون هناك حاجة للعمل مع CSV لاستيراد/تصدير البيانات، تحميل التكوينات أو معالجة السجلات. في هذه المقالة، سنستعرض الأساليب الرئيسية للعمل مع CSV في Swift: التحليل اليدوي، المكتبات الشائعة (SwiftCSV و CodableCSV) وأمثلة الكود مع الشروحات.



1. لماذا يجب استخدام المكتبات لـ CSV؟



مكتبة Foundation القياسية لا توفر أدوات جاهزة للعمل مع CSV. التحليل اليدوي (الفصل بفواصل، معالجة علامات الاقتباس، هروب الأحرف) يصبح سريعًا معقدًا وعرضة للأخطاء. المكتبات تحل المهام التالية:

  • معالجة صحيحة لعلامات الاقتباس والأحرف المهربة.
  • دعم فواصل مختلفة (فاصلة، علامة تبويب، فاصلة منقوطة).
  • قراءة الملفات الكبيرة بشكل تدفقي (بدون تحميلها بالكامل في الذاكرة).
  • التكامل مع Codable لإلغاء التسلسل تلقائيًا.


2. مكتبة SwiftCSV



SwiftCSV — مكتبة خفيفة لقراءة وكتابة CSV. تدعم السلاسل النصية والقواميس والمصفوفات المتداخلة. التثبيت عبر Swift Package Manager:

// Package.swiftdependencies: [    .package(url: "https://github.com/swiftcsv/SwiftCSV.git", from: "0.9.0")]


مثال لقراءة CSV من ملف:

import SwiftCSV

guard let path = Bundle.main.path(forResource: "data", ofType: "csv") else { fatalError("CSV file not found")}let csv = try CSV(url: URL(fileURLWithPath: path))

// الوصول إلى الصفوف حسب العناوينfor row in csv.rows { let name = row["name"] ?? "" let age = row["age"] ?? "" print("\\(name) is \\(age) years old")}

// الوصول إلى الأعمدةlet allNames = csv.columns["name"] ?? []print(allNames)


كتابة CSV: المكتبة لا توفر طريقة كتابة مدمجة، ولكن يمكنك تكوين سلسلة نصية يدويًا:

func writeCSV(rows: [[String: String]], headers: [String]) -> String {    var csvString = headers.joined(separator: ",") + ""    for row in rows {        let values = headers.map { row[$0] ?? "" }        csvString += values.joined(separator: ",") + ""    }    return csvString}

let csvData = writeCSV(rows: data, headers: ["name", "age"])try csvData.write(to: url, atomically: true, encoding: .utf8)


3. مكتبة CodableCSV



CodableCSV — مكتبة قوية تدعم Codable، والفواصل المخصصة، والقراءة التدفقية، والتشفير القابل للتخصيص. مثالية للمشاريع المعقدة.



التثبيت:

// Package.swiftdependencies: [    .package(url: "https://github.com/dehesa/CodableCSV.git", from: "0.9.0")]


مثال للقراءة مع إلغاء التسلسل تلقائيًا إلى نموذج:

import CodableCSV

struct Person: Codable { let name: String let age: Int let email: String?}

let data = try Data(contentsOf: url)let decoder = CSVDecoder { config in config.headerStrategy = .firstLine // السطر الأول هو العناوين config.delimiter = .comma}let people = try decoder.decode([Person].self, from: data)

for person in people { print(person.name, person.age)}


كتابة CSV باستخدام CodableCSV:

let encoder = CSVEncoder { config in    config.headerStrategy = .firstLine    config.delimiter = .comma}let data = try encoder.encode(people, into: Data.self)try data.write(to: url, options: .atomic)


4. التحليل اليدوي (بدون مكتبات)



إذا كان المشروع صغيرًا وتريد تجنب التبعيات، يمكنك تنفيذ محلل بسيط.

توصيات