diff --git a/Sources/table/Table.swift b/Sources/table/Table.swift index f923c0f..1b09f4c 100644 --- a/Sources/table/Table.swift +++ b/Sources/table/Table.swift @@ -55,14 +55,20 @@ class ParsedTable: Table { } } + func skipTechnicalParts(row: inout String?) -> Bool { + let skip = ParsedTable.technicalPart(type: conf.type, str: row) + for _ in 0.. 0 + } + func next() throws -> Row? { line += 1 var row = nextLine() - while ParsedTable.technicalRow(row) { - row = reader.readLine() - } + while skipTechnicalParts(row: &row) {} return try! row.map { row in let components = try ParsedTable.readRowComponents(row, type: conf.type, delimeter: conf.delimeter, trim: conf.trim) @@ -214,8 +220,17 @@ class ParsedTable: Table { return components } - // matches rows that has to be skipped, usually horizontal delimeters + // matches rows that has to be skipped, usually horizontal delimeters private static func technicalRow(_ str: String?) -> Bool { - return str?.matches(ParsedTable.technicalRowPattern) ?? false + return str?.trimmingCharacters(in: .whitespaces).isEmpty ?? false || str?.matches(ParsedTable.technicalRowPattern) ?? false + } + + // extended version that can skip multiple technical rows based on file type, used inside of the file parsing loop + private static func technicalPart(type: FileType, str: String?) -> Int { + if (type == .cassandraSql && "---MORE---" == str) { + // more + header + a line + return 3; + } + return technicalRow(str) ? 1 : 0; } } \ No newline at end of file diff --git a/Tests/table-Tests/TableParserTests.swift b/Tests/table-Tests/TableParserTests.swift index 3eed174..8eda0ad 100644 --- a/Tests/table-Tests/TableParserTests.swift +++ b/Tests/table-Tests/TableParserTests.swift @@ -85,6 +85,37 @@ class TableParserTests: XCTestCase { XCTAssertEqual(row.components[2].value, "3") } + func testParseCassandraMoreCursor() throws { + + let table = try ParsedTable.parse(reader: ArrayLineReader(lines: [ + " id | name", + "----+------", + " 1 | name1", + " 2 | name2", + " 3 | name3", + " 4 | name4", + " 5 | name5", + "", + "---MORE---", + " id | name", + "----+-------", + " 6 | name6", + " 7 | name7", + " 8 | name8", + " 9 | name9", + " 10 | name10" + ]), hasHeader: nil, headerOverride: nil, delimeter: "|") + + XCTAssertEqual(table.header.components()[0], "id") + XCTAssertEqual(table.header.components()[1], "name") + + for i in 1...10 { + let row = try table.next()! + XCTAssertEqual(row.components[0].value, "\(i)") + XCTAssertEqual(row.components[1].value, "name\(i)") + } + } + func testQuotedFieldsWithCommas() throws { let table = try ParsedTable.parse(reader: ArrayLineReader(lines: [ "\"Name,Full\",Age,City", diff --git a/test-data/cassandra_more.out b/test-data/cassandra_more.out new file mode 100644 index 0000000..6b3fc76 --- /dev/null +++ b/test-data/cassandra_more.out @@ -0,0 +1,16 @@ + id | name +----+------ + 1 | name1 + 2 | name2 + 3 | name3 + 4 | name4 + 5 | name5 + +---MORE--- + id | name +----+------- + 6 | name6 + 7 | name7 + 8 | name8 + 9 | name9 + 10 | name10