Simple CSV parsing, for OSX and iOS.
- Efficient state-machine based design
- Rows can be used as they are parsed to reduce memory overhead
- Compliant with the CSV specification
CSV content can be loaded using the CSV
class:
import SwifterCSV
// As a string
let csv = CSV(string: "id,name,age\n1,Alice,18")
// With a custom delimiter character
let tsv = CSV(string: "id\tname\tage\n1\tAlice\t18", delimiter: "\t")
// From a file (with errors)
do {
let csv = try CSV(name: "users.csv")
} catch {
// Catch errors or something
}
// With a custom delimiter, errors, and custom encoding
do {
let tsv = try CSV(name: "users.tsv", delimiter: tab, encoding: NSUTF8StringEncoding)
} catch {
// Error handling
}
If you don't care about the columns, you can set the loadColumns
argument to false
and the columns Dictionary will not be populated.
let csv = CSV(string: "id,name,age\n1,Alice,18\n2,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"]]
The rows can also parsed and passed to a block on the fly, reducing the memory needed to store the whole lot in an array:
// Access each row as an array (array not guaranteed to 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"])
}
Not on CocoaPods yet - clone the repo and use it as a local Pod:
pod 'SwifterCSV', path: 'path/to/SwifterCSV'
This is a fork of SwiftCSV by JavaNut13. In addition to the performance and conformance considerations, I wanted to have Swift 3 compliance.