Pasted CSV struct from other project
This commit is contained in:
parent
a738a5be40
commit
f02e30b1bc
|
@ -1,3 +1,54 @@
|
||||||
|
import Bits
|
||||||
|
|
||||||
struct CSV {
|
struct CSV {
|
||||||
var text = "Hello, World!"
|
struct Column {
|
||||||
|
let header: String
|
||||||
|
var fields: [String?]
|
||||||
|
}
|
||||||
|
|
||||||
|
static func parse(_ bytes: Bytes) -> [String: [String?]] {
|
||||||
|
let parsed: [Column] = parse(bytes)
|
||||||
|
var columns: [String: [String?]] = [:]
|
||||||
|
|
||||||
|
for column in parsed {
|
||||||
|
columns[column.header] = column.fields
|
||||||
|
}
|
||||||
|
|
||||||
|
return columns
|
||||||
|
}
|
||||||
|
|
||||||
|
static func parse(_ bytes: Bytes) -> [String: Column] {
|
||||||
|
let parsed: [Column] = parse(bytes)
|
||||||
|
var columns: [String: Column] = [:]
|
||||||
|
|
||||||
|
for column in parsed {
|
||||||
|
columns[column.header] = column
|
||||||
|
}
|
||||||
|
|
||||||
|
return columns
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static func parse(_ bytes: Bytes) -> [Column] {
|
||||||
|
var rows = bytes.split(separator: Byte.newLine)
|
||||||
|
guard let headers = rows.first?.split(separator: Byte.comma) else {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
rows.removeFirst()
|
||||||
|
|
||||||
|
var columns: [Column] = headers.map({ header in
|
||||||
|
let head = header.makeString()
|
||||||
|
let column = Column(header: head, fields: [])
|
||||||
|
return column
|
||||||
|
})
|
||||||
|
|
||||||
|
for row in rows {
|
||||||
|
for (cell, columnIndex) in zip(row.split(separator: Byte.comma, omittingEmptySubsequences: false), 0...columns.count-1) {
|
||||||
|
let text = cell == [] ? nil : cell.makeString()
|
||||||
|
columns[columnIndex].fields.append(text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return columns
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue