导入分号分隔的Numbers导出CSV至DataFrame遇卡顿及格式问题求助
问题:Numbers导出的分号分隔CSV导入DataFrame异常
我尝试将Numbers导出的、以分号为分隔符的CSV文件导入至DataFrame。设置分号为分隔符时,应用无报错但卡顿;改为逗号分隔符时,应用不再卡顿,但所有行数据都挤在一列,无法正确拆分4列。
读取代码
let options = CSVReadingOptions(hasHeaderRow: true, delimiter: ";") do { let frame = try DataFrame(contentsOfCSVFile: url, options: options) print(frame) } catch let error { print("\(error)") }
逗号分隔时的错误输出
━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ Index;Age;Year;Name;;; ┃ ┃ ┃ <String> ┃ ┡━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩ │ 0 │ 1;44;1982;Jansen;;; │ │ 1 │ 2;66;1977;Piet;;; │ │ 2 │ 3;99;1952;Klaas;;; │ │ 3 │ 4;71;2020;Willem;;; │ └───┴────────────────────────┘ 4 rows, 1 column
线程追踪信息
Thread 1 Queue : com.apple.main-thread (serial) #0 0x00000001df418140 in ___lldb_unnamed_symbol1035 () #1 0x00000001df47ab00 in ___lldb_unnamed_symbol3177 () #2 0x00000001df47a760 in ___lldb_unnamed_symbol3176 () #3 0x00000001df47a16c in ___lldb_unnamed_symbol3174 () #4 0x0000000104b64454 in AppDelegate.application(_:open:options:) at /Users/kaasCoder/Documents/Documenten - MacBook Pro/Developer/ Dev-Apps/DataApp.4.1.9_1/DataApp/AppDelegate.swift:121 #5 0x0000000104b64dac in @objc AppDelegate.application(_:open:options:) ()
解决方案
检查并修正CSV文件的换行符与编码
Numbers导出的CSV可能使用非标准换行符(如\r)或特殊编码,先验证文件内容:if let content = try? String(contentsOf: url, encoding: .utf8) { print(content) }若发现换行符异常,可在读取选项中指定:
var options = CSVReadingOptions(hasHeaderRow: true, delimiter: ";") options.newline = .carriageReturn // 根据实际情况选择.carriageReturn或.lineFeed预处理文件,移除多余分号
输出显示每行末尾有多余的;;;,这可能是卡顿的诱因,先清理文件:guard let content = try? String(contentsOf: url, encoding: .utf8) else { return } let cleanedContent = content.components(separatedBy: .newlines) .map { $0.trimmingCharacters(in: CharacterSet(charactersIn: ";")) } .joined(separator: "\n") let cleanedURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("cleaned.csv") try? cleanedContent.write(to: cleanedURL, atomically: true, encoding: .utf8) // 使用清理后的文件导入 let frame = try DataFrame(contentsOfCSVFile: cleanedURL, options: options)后台线程执行解析操作
卡顿大概率是主线程执行耗时解析导致,将逻辑移到后台:DispatchQueue.global(qos: .background).async { let options = CSVReadingOptions(hasHeaderRow: true, delimiter: ";") do { let frame = try DataFrame(contentsOfCSVFile: url, options: options) DispatchQueue.main.async { print(frame) // 主线程处理结果或更新UI } } catch let error { DispatchQueue.main.async { print("\(error)") } } }手动验证CSV格式
用文本编辑器打开CSV文件,确认:- 表头与数据行的分号数量一致(表头为
Index;Age;Year;Name,数据行应仅包含4个字段) - 无隐藏特殊字符或格式混乱
- 表头与数据行的分号数量一致(表头为
内容的提问来源于stack exchange,提问作者KaasCoder
相关产品推荐
相关产品推荐

