Swift:
การทำงานกับ CSV

วิธีการ:

ใน Swift, ไม่มีการสนับสนุนเนื้อเดิมสำหรับการแยกไฟล์ CSV โดยตรง แต่คุณสามารถจัดการข้อมูล CSV โดยใช้เมธอด String เพื่อแยกเนื้อหา หรือโดยใช้ไลบรารีของบุคคลที่สามเช่น SwiftCSV เพื่อการเข้าถึงที่มีประสิทธิภาพมากขึ้น นี่คือวิธีทั้งสอง:

การแยกวิเคราะห์ด้วยตัวเองโดยไม่ใช้ไลบรารี่ภายนอก

// พิจารณาสตริง CSV ที่เรียบง่าย
let csvString = """
name,age,city
John Doe,29,New York
Jane Smith,34,Los Angeles
"""

// แยกสตริง CSV เป็นบรรทัด
let rows = csvString.components(separatedBy: "\n")

// สกัดคีย์จากบรรทัดแรก
let keys = rows.first?.components(separatedBy: ",")

// วนซ้ำผ่านบรรทัด เริ่มจากบรรทัดที่สอง
var result: [[String: String]] = []
for row in rows.dropFirst() {
    let values = row.components(separatedBy: ",")
    let dict = Dictionary(uniqueKeysWithValues: zip(keys!, values))
    result.append(dict)
}

// ผลลัพธ์ตัวอย่าง
print(result)
// แสดงผล: [{"city": "New York", "age": "29", "name": "John Doe"}, {"city": "Los Angeles", "age": "34", "name": "Jane Smith"}]

วิธีนี้ตรงไปตรงมาแต่ขาดความเข้มแข็ง โดยเฉพาะกับไฟล์ CSV ที่มีคดีพิเศษ เช่น จุลภาคในค่า, การขึ้นบรรทัดใหม่ภายในฟิลด์ ฯลฯ

การใช้งานไลบรารี SwiftCSV

ขั้นต้น, เพิ่ม SwiftCSV เข้าไปในโปรเจคของคุณโดยการรวมไฟล์ใน Package.swift dependencies:

.package(url: "https://github.com/swiftcsv/SwiftCSV.git", from: "0.5.6")

จากนั้น, นำเข้าและใช้งานดังนี้:

import SwiftCSV

// ถือว่า `csvString` ถูกกำหนดไว้ตามที่กล่าวไว้ข้างต้น

// สร้างอ็อบเจกต์ CSV
if let csv = try? CSV(string: csvString) {
    // เข้าถึงแถวเป็นดิกชันนารี
    let rows = csv.namedRows
    
    // ผลลัพธ์ตัวอย่าง
    print(rows)
    // แสดงผล: [{"city": "New York", "age": "29", "name": "John Doe"}, {"city": "Los Angeles", "age": "34", "name": "Jane Smith"}]
}

SwiftCSV ทำให้การแยกวิเคราะห์ง่ายขึ้นโดยการจัดการกับเฉดสีเช่น จุลภาคที่ถูกครอบคลุม, การขึ้นบรรทัดใหม่ในฟิลด์, และการเข้ารหัสตัวละครโดยอัตโนมัติ อย่างไรก็ตาม จำไว้ว่าต้องจัดการกับข้อผิดพลาดที่เป็นไปได้ในแอพพลิเคชั่นจริงๆ โดยเฉพาะเมื่อต้องจัดการกับแหล่งข้อมูลภายนอก