Add enum Newline for Writer

This commit is contained in:
Yasuhiro Hatta 2017-06-19 02:42:35 +09:00
parent 015caedd64
commit 3639a75c33
5 changed files with 48 additions and 34 deletions

View File

@ -19,7 +19,6 @@ internal let defaultHasHeaderRow = false
internal let defaultTrimFields = false
internal let defaultDelimiter: UnicodeScalar = ","
internal let defaultWhitespaces = CharacterSet.whitespaces
internal let defaultNewline: UnicodeScalar = LF
/// No overview available.
public class CSVReader {
@ -353,22 +352,22 @@ extension CSVReader {
}
extension CSVReader {
public func enumerateRows(_ block: (([String], [String]?, inout Bool) throws -> Void)) throws {
var stop = false
while let row = readRow() {
try block(row, headerRow, &stop)
if stop {
break
}
}
if let error = error {
throw error
}
}
}
//extension CSVReader {
//
// public func enumerateRows(_ block: (([String], [String]?, inout Bool) throws -> Void)) throws {
// var stop = false
// while let row = readRow() {
// try block(row, headerRow, &stop)
// if stop {
// break
// }
// }
// if let error = error {
// throw error
// }
// }
//
//}
extension CSVReader: IteratorProtocol {

View File

@ -15,13 +15,26 @@ public class CSVWriter {
public var delimiter: String
public var newline: String
internal init(delimiter: String, newline: String) {
internal init(delimiter: String, newline: Newline) {
self.delimiter = delimiter
self.newline = newline
switch newline {
case .lf: self.newline = String(LF)
case .crlf: self.newline = String(CR) + String(LF)
}
}
}
public enum Newline {
/// "\n"
case lf
/// "\r\n"
case crlf
}
public let stream: OutputStream
public let configuration: Configuration
fileprivate let writeScalar: ((UnicodeScalar) throws -> Void)
@ -59,7 +72,7 @@ extension CSVWriter {
public convenience init(
stream: OutputStream,
delimiter: String = String(defaultDelimiter),
newline: String = String(defaultNewline)
newline: Newline = .lf
) throws {
try self.init(stream: stream, codecType: UTF8.self, delimiter: delimiter, newline: newline)
@ -69,7 +82,7 @@ extension CSVWriter {
stream: OutputStream,
codecType: T.Type,
delimiter: String = String(defaultDelimiter),
newline: String = String(defaultNewline)
newline: Newline = .lf
) throws where T.CodeUnit == UInt8 {
let config = Configuration(delimiter: delimiter, newline: newline)
@ -93,7 +106,7 @@ extension CSVWriter {
codecType: T.Type,
endian: Endian = .big,
delimiter: String = String(defaultDelimiter),
newline: String = String(defaultNewline)
newline: Newline = .lf
) throws where T.CodeUnit == UInt16 {
let config = Configuration(delimiter: delimiter, newline: newline)
@ -120,7 +133,7 @@ extension CSVWriter {
codecType: T.Type,
endian: Endian = .big,
delimiter: String = String(defaultDelimiter),
newline: String = String(defaultNewline)
newline: Newline = .lf
) throws where T.CodeUnit == UInt32 {
let config = Configuration(delimiter: delimiter, newline: newline)

View File

@ -188,7 +188,7 @@ class CSVWriterTests: XCTestCase {
let stream = OutputStream(toMemory: ())
stream.open()
let csv = try! CSVWriter.init(stream: stream, newline: "\r\n")
let csv = try! CSVWriter.init(stream: stream, newline: .crlf)
csv.beginNewRow()
try! csv.write(field: str + "-1")
csv.beginNewRow()

View File

@ -125,11 +125,12 @@ class LineBreakTests: XCTestCase {
private func parse(csv: String) -> [[String]] {
let reader = try! CSVReader(string: csv)
var records = [[String]]()
try! reader.enumerateRows { (row, _, _) in
records.append(row)
}
return records
return reader.map { $0 }
// var records = [[String]]()
// try! reader.enumerateRows { (row, _, _) in
// records.append(row)
// }
// return records
}
}

View File

@ -112,11 +112,12 @@ class UnicodeTests: XCTestCase {
}
private func getRecords(csv: CSVReader) -> [[String]] {
var records = [[String]]()
try! csv.enumerateRows { (record, _, _) in
records.append(record)
}
return records
return csv.map { $0 }
// var records = [[String]]()
// try! csv.enumerateRows { (record, _, _) in
// records.append(record)
// }
// return records
}
}