العمل مع CSV في Kotlin: المكتبات وأمثلة الكود
CSV (قيم مفصولة بفواصل) — أحد أكثر التنسيقات شيوعًا لتبادل البيانات الجدولية. في Kotlin، كما في Java، توجد عدة مكتبات فعالة للعمل مع ملفات CSV. في هذه المقالة، سنحلل بالتفصيل ثلاثة مناهج رئيسية: المكتبة الأصلية kotlin-csv، والمكتبة المجربة OpenCSV، والمكتبة القوية Apache Commons CSV. ستتعلم كيفية تحليل وكتابة ومعالجة بيانات CSV مع أمثلة الكود.
1. مكتبة kotlin-csv (Kotlinx.serialization)
kotlin-csv — هي مكتبة حديثة مكتوبة بلغة Kotlin النقية. تتكامل بشكل مثالي مع kotlinx.serialization، مما يسمح بربط أسطر CSV تلقائيًا بفئات البيانات. هذا هو الخيار الأفضل للمشاريع الجديدة في Kotlin.
التثبيت
أضف التبعية في build.gradle.kts:
dependencies { implementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.9.3") implementation("org.jetbrains.kotlinx:kotlinx-serialization-csv:1.6.3")}مثال لقراءة CSV
import com.github.doyaaaaaken.kotlincsv.dsl.csvReaderimport kotlinx.serialization.Serializableimport kotlinx.serialization.csv.Csv
@Serializabledata class User(val name: String, val age: Int, val email: String)
fun readCsvWithKotlinCsv() { val csvData = """ name,age,email Alice,30,alice@example.com Bob,25,bob@test.org """.trimIndent()
// الخيار 1: التحليل اليدوي val rows: List<List<String>> = csvReader().readAll(csvData) rows.forEach { row -> println("Name: ${row[0]}, Age: ${row[1]}, Email: ${row[2]}") }
// الخيار 2: مع التسلسل val csv = Csv { ignoreUnknownColumns = true } val users: List<User> = csv.decodeFromString(csvData) users.forEach { println(it) }}مثال لكتابة CSV
import com.github.doyaaaaaken.kotlincsv.dsl.csvWriter
fun writeCsvWithKotlinCsv() { val data = listOf( listOf("Name", "Age", "City"), listOf("John", "28", "New York"), listOf("Jane", "32", "London") ) csvWriter().open("output.csv") { writeRows(data) } println("تم كتابة ملف CSV بنجاح.")}2. مكتبة OpenCSV
OpenCSV — مكتبة Java كلاسيكية تعمل بشكل ممتاز في Kotlin. توفر إمكانيات مرنة للتحليل، بما في ذلك معالجة علامات الاقتباس، والهروب، ودعم الفواصل المختلفة.
التثبيت
dependencies { implementation("com.opencsv:opencsv:5.9")}مثال للقراءة مع الربط بالكائنات
import com.opencsv.CSVReaderBuilderimport com.opencsv.bean.CsvToBeanBuilderimport com.opencsv.bean.HeaderColumnNameMappingStrategyimport java.io.StringReader
data class Product(val id: Int, val name: String, val price: Double)
fun readCsvWithOpenCsv() { val csvContent = """ id,name,price 1,Laptop,999.99 2,Mouse,25.50 """.trimIndent()
// التحليل اليدوي val reader = CSVReaderBuilder(StringReader(csvContent)).build() reader.forEach { line -> println("ID: ${line[0]}, Name: ${line[1]}, Price: ${line[2]}") }
// الربط بفئة البيانات val strategy = HeaderColumnNameMappingStrategy<Product>() strategy.type = Product::class.java val beans = CsvToBeanBuilder<Product>(StringReader(csvContent)) .withMappingStrategy(strategy) .build() .parse() beans.forEach { println(it) }}مثال لكتابة CSV
import com.opencsv.CSVWriterimport java.io.StringWriter
fun writeCsvWithOpenCsv() { val stringWriter = StringWriter() val writer = CSVWriter(stringWriter) val