@@ -107,31 +107,39 @@ extension CSVReader {
107107 case . failed( let e) : throw e
108108 }
109109
110- let result : [ String ] ?
111- do {
112- result = try self . _parseLine ( rowIndex: self . count. rows)
113- } catch let error {
114- self . status = . failed( error as! CSVError < CSVReader > )
115- throw error
116- }
117-
118- guard let numFields = result? . count else {
119- self . status = . finished
120- return nil
121- }
122-
123- if self . count. rows > 0 {
124- guard self . count. fields == numFields else {
125- let error = Error . _invalidFieldCount ( rowIndex: self . count. rows+ 1 , parsed: numFields, expected: self . count. fields)
126- self . status = . failed( error)
110+ loop: while true {
111+ let result : [ String ] ?
112+ do {
113+ result = try self . _parseLine ( rowIndex: self . count. rows)
114+ } catch let error {
115+ self . status = . failed( error as! CSVError < CSVReader > )
127116 throw error
128117 }
129- } else {
130- self . count. fields = numFields
118+ // If no fields were parsed, the EOF has been reached.
119+ guard let fields = result else {
120+ self . status = . finished
121+ return nil
122+ }
123+
124+ let numFields = fields. count
125+ // If a single empty field is received, a white line has been parsed. Ignore empty lines for CSV files were several fields are expected.
126+ if numFields == 1 , fields. first!. isEmpty, self . count. rows != 1 {
127+ continue loop
128+ }
129+
130+ if self . count. rows > 0 {
131+ guard self . count. fields == numFields else {
132+ let error = Error . _invalidFieldCount ( rowIndex: self . count. rows+ 1 , parsed: numFields, expected: self . count. fields)
133+ self . status = . failed( error)
134+ throw error
135+ }
136+ } else {
137+ self . count. fields = numFields
138+ }
139+
140+ self . count. rows += 1
141+ return result
131142 }
132-
133- self . count. rows += 1
134- return result
135143 }
136144}
137145
0 commit comments