Strix is a parser combinator library written in Swift.
dependencies: [.package(url: "https://github.com/nearfri/Strix.git", from: "2.0.0")],
targets: [.target(name: "<Your Target Name>", dependencies: ["Strix"])]
Year | Make | Model | Description | Price |
---|---|---|---|---|
1997 | Ford | E350 | ac, abs, moon | 3000.00 |
1999 | Chevy | Venture "Extended Edition" | 4900.00 | |
1999 | Chevy | Venture "Extended Edition, Very Large" | 5000.00 | |
1996 | Jeep | Grand Cherokee | MUST SELL! air, moon roof, loaded |
4799.00 |
The above table of data may be represented in CSV format as follows:
Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799.00
It consists of data records represented by lines which are made of one or more fields separated by commas. Sophisticated CSV implementations permit special characters such as newline, comma and double quotes. They are allowed by requiring " (double quote) characters around the fields containing them. Embedded double quote are represented by a pair of consecutive double quotes.
Following is an example of a CSV parser:
import Strix
let doubleQuote: Parser<Character> = .character("\"")
let twoDoubleQuote: Parser<Character> = Parser.string("\"\"") *> .just("\"")
let escapedText: Parser<String> = Parser.many((.none(of: "\"") <|> twoDoubleQuote))
.map({ String($0) })
let escapedField: Parser<String> = doubleQuote *> escapedText <* doubleQuote
let nonSeparator: Parser<Character> = .satisfy("non-separator", { $0 != "," && !$0.isNewline })
let nonEscapedField: Parser<String> = .skipped(by: .many(nonSeparator))
let field: Parser<String> = escapedField <|> nonEscapedField
let record: Parser<[String]> = .many(field, separatedBy: .character(","))
let csvParser: Parser<[[String]]> = .many(record, separatedBy: .newline)
Passing the above CSV as csvString
to try csvParser.run(csvString)
will return:
[
["Year", "Make", "Model", "Description", "Price"],
["1997", "Ford", "E350", "ac, abs, moon", "3000.00"],
["1999", "Chevy", "Venture \"Extended Edition\"", "", "4900.00"],
["1999", "Chevy", "Venture \"Extended Edition, Very Large\"", "", "5000.00"],
["1996", "Jeep", "Grand Cherokee", "MUST SELL!\nair, moon roof, loaded", "4799.00"]
]
If you want more examples, see StrixParsers.
Strix is released under the MIT license. See LICENSE for more information.