Parsing CSV sederhana untuk macOS, iOS, TVOS, dan WatchOS.
Konten CSV dapat dimuat menggunakan kelas CSV :
import SwiftCSV
do {
// As a string, guessing the delimiter
let csv : CSV = try CSV < Named > ( string : " id,name,age n 1,Alice,18 " )
// Specifying a custom delimiter
let tsv : CSV = try CSV < Enumerated > ( string : " id t name t age n 1 t Alice t 18 " , delimiter : . tab )
// From a file (propagating error during file loading)
let csvFile : CSV = try CSV < Named > ( url : URL ( fileURLWithPath : " path/to/users.csv " ) )
// From a file inside the app bundle, with a custom delimiter, errors, and custom encoding.
// Note the result is an optional.
let resource : CSV ? = try CSV < Named > (
name : " users " ,
extension : " tsv " ,
bundle : . main ,
delimiter : . character ( " ? " ) , // Any character works!
encoding : . utf8 )
} catch parseError as CSVParseError {
// Catch errors from parsing invalid CSV
} catch {
// Catch errors from trying to load files
} Kelas CSV dilengkapi dengan inisialisasi yang cocok untuk memuat file dari URL.
extension CSV {
/// Load a CSV file from `url`.
///
/// - Parameters:
/// - url: URL of the file (will be passed to `String(contentsOfURL:encoding:)` to load)
/// - delimiter: Character used to separate separate cells from one another in rows.
/// - encoding: Character encoding to read file (default is `.utf8`)
/// - loadColumns: Whether to populate the columns dictionary (default is `true`)
/// - Throws: `CSVParseError` when parsing the contents of `url` fails, or file loading errors.
public convenience init ( url : URL ,
delimiter : CSVDelimiter ,
encoding : String . Encoding = . utf8 ,
loadColumns : Bool = true ) throws
/// Load a CSV file from `url` and guess its delimiter from `CSV.recognizedDelimiters`, falling back to `.comma`.
///
/// - Parameters:
/// - url: URL of the file (will be passed to `String(contentsOfURL:encoding:)` to load)
/// - encoding: Character encoding to read file (default is `.utf8`)
/// - loadColumns: Whether to populate the columns dictionary (default is `true`)
/// - Throws: `CSVParseError` when parsing the contents of `url` fails, or file loading errors.
public convenience init ( url : URL ,
encoding : String . Encoding = . utf8 ,
loadColumns : Bool = true )
} Pembatas sangat diketik. Kasus CSVDelimiter yang diakui adalah: .comma , .semicolon , dan .tab .
Anda dapat menggunakan inisialisasi kenyamanan yang menebak pembatas dari daftar yang diakui untuk Anda. Inisialisasi ini tersedia untuk memuat CSV dari URL dan string.
Anda juga dapat menggunakan pembatas karakter tunggal lain saat memuat data CSV. Karakter literal seperti "x" akan menghasilkan CSV.Delimiter.character("x") , jadi Anda tidak perlu mengetik seluruh nama kasus .character(_) . Ada inisialisasi untuk setiap varian yang menerima pengaturan pembatas eksplisit.
// Recognized the comma delimiter automatically:
let csv = CSV < Named > ( string : " id,name,age n 1,Alice,18 n 2,Bob,19 " )
csv . header //=> ["id", "name", "age"]
csv . rows //=> [["id": "1", "name": "Alice", "age": "18"], ["id": "2", "name": "Bob", "age": "19"]]
csv . columns //=> ["id": ["1", "2"], "name": ["Alice", "Bob"], "age": ["18", "19"]]Baris -baris juga dapat diuraikan dan diteruskan ke blok dengan cepat, mengurangi memori yang diperlukan untuk menyimpan seluruh lot dalam array:
// Access each row as an array (inner array not guaranteed to always be equal length to the header)
csv . enumerateAsArray { array in
print ( array . first )
}
// Access them as a dictionary
csv . enumerateAsDict { dict in
print ( dict [ " name " ] )
} Gunakan CSV<Named> alias NamedCSV untuk mengakses data CSV secara kolom-demi-kolom dengan kolom bernama. Pikirkan ini seperti penampang:
let csv = NamedCSV ( string : " id,name,age n 1,Alice,18 n 2,Bob,19 " )
csv . rows [ 0 ] [ " name " ] //=> "Alice"
csv . columns [ " name " ] //=> ["Alice", "Bob"] Jika Anda hanya ingin mengakses data-demi-baris data Anda, dan bukan pada kolom, maka Anda dapat menggunakan CSV<Enumerated> atau EnumeratedCSV :
let csv = EnumeratedCSV ( string : " id,name,age n 1,Alice,18 n 2,Bob,19 " )
csv . rows [ 0 ] [ 1 ] //=> "Alice"
csv . columns ? [ 0 ] . header //=> "name"
csv . columns ? [ 0 ] . rows //=> ["Alice", "Bob"] Untuk mempercepat, lewati pengumpulan akses-kolom sepenuhnya dengan melewati loadColumns: false . Ini akan mencegah data kolom dari populasi. Untuk set data besar, ini menghemat banyak iterasi (pada runtime kuadratik).
let csv = EnumeratedCSV ( string : " id,name,age n 1,Alice,18 n 2,Bob,19 " , loadColumns : false )
csv . rows [ 0 ] [ 1 ] //=> "Alice"
csv . columns //=> nil pod "SwiftCSV" github "swiftcsv/SwiftCSV"
.package(url: "https://github.com/swiftcsv/SwiftCSV.git", from: "0.8.0")
Paket dikirimkan dengan privasi yang kosong karena tidak mengakses atau melacak data sensitif apa pun.