العمل مع CSV في Kotlin: المكتبات والأمثلة العملية
يظل تنسيق CSV (قيم مفصولة بفواصل) أحد أكثر الطرق شيوعًا لتبادل البيانات الجدولية. في لغة Kotlin، التي تُستخدم بنشاط لتطوير تطبيقات Android والخوادم الخلفية (Ktor, Spring Boot) والنصوص البرمجية، توجد عدة مكتبات مريحة للعمل مع CSV. في هذه المقالة، سنستعرض ثلاثة مناهج رئيسية: المكتبة الخفيفة kotlin-csv، والمكتبة القوية OpenCSV، والمكتبة الكلاسيكية Apache Commons CSV.
1. مكتبة kotlin-csv (موصى بها)
هذا حل Kotlin خالص لا يتطلب تبعيات إضافية على Java. إنه مثالي للمشاريع التي تكون فيها الإيجاز وأمان الأنواع مهمين.
التثبيت (Gradle)
// build.gradle.ktsimplementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.9.3")قراءة CSV
تدعم المكتبة الكشف التلقائي عن المحدد، وهروب علامات الاقتباس، والرؤوس.
import com.github.doyaaaaaken.kotlincsv.dsl.csvReader
fun readCsvExample() { val csvData = """ name,age,city Alice,30,New York Bob,25,London """.trimIndent()
val rows: List<List<String>> = csvReader().readAll(csvData)
rows.forEach { row -> println("Name: ${row[0]}, Age: ${row[1]}, City: ${row[2]}") }}
// قراءة مع الرؤوسfun readWithHeaders() { val data = csvReader().readAllWithHeader(csvData) data.forEach { row -> println("${row["name"]} is ${row["age"]} years old") }}كتابة CSV
import com.github.doyaaaaaken.kotlincsv.dsl.csvWriter
fun writeCsvExample() { val rows = listOf( listOf("Product", "Price", "Quantity"), listOf("Laptop", "1200", "5"), listOf("Mouse", "25", "50") )
csvWriter().writeAll(rows) // الإخراج إلى وحدة التحكم: // Product,Price,Quantity // Laptop,1200,5 // Mouse,25,50}2. OpenCSV (للسيناريوهات المعقدة)
OpenCSV هي مكتبة Java ناضجة تعمل بشكل ممتاز في Kotlin. وهي تدعم التعيين إلى فئات البيانات، والمحددات المخصصة، والمعالجة المتدفقة للملفات الكبيرة.
التثبيت
implementation("com.opencsv:opencsv:5.9")القراءة مع التعيين إلى فئة البيانات
import com.opencsv.bean.CsvToBeanBuilderimport java.io.StringReader
data class Person( @CsvBindByName(column = "name") val name: String, @CsvBindByName(column = "age") val age: Int, @CsvBindByName(column = "city") val city: String)
fun readWithOpenCsv() { val csv = """ name,age,city Alice,30,New York Bob,25,London """.trimIndent()
val beans: List<Person> = CsvToBeanBuilder<Person>(StringReader(csv)) .withType(Person::class.java) .build() .parse()
beans.forEach { println(it) } // Person(name=Alice, age=30, city=New York) // Person(name=Bob, age=25, city=London)}الكتابة مع الرؤوس
import com.opencsv.bean.StatefulBeanToCsvimport com.opencsv.bean.StatefulBeanToCsvBuilderimport java.io.StringWriter
fun writeWithOpenCsv() { val people = listOf( Person("Charlie", 35, "Paris"), Person("Diana", 28, "Tokyo") )
val writer = StringWriter() val beanToCsv: StatefulBeanToCsv<Person> = StatefulBeanToCsvBuilder<Person>(writer) .build() beanToCsv.write(people)
println(writer.toString()) // name,age,city // Charlie,35,Paris // Diana,28,Tokyo}3. Apache Commons CSV (للتوافق)
هذه المكتبة هي المعيار الفعلي لـ Java. توفر تحكمًا منخفض المستوى في التحليل وتدعم تنسيقات مختلفة (Excel, MySQL, TSV).