You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入分号分隔的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:57:05