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