Apple Numbers导出的TSV为何无法在Swift中通过制表符解析?
Swift中拆分Apple Numbers导出TSV文件的问题解决
我在搭建本地化流程时,需要将Apple Numbers表格导出为TSV格式。导出的文件在Numbers界面看不到制表符,但文本编辑器能看到,且Numbers不支持自定义分隔符。但用Swift代码let columns = line.components(separatedBy: "\t")逐行读取拆分时,无法得到多列结果。
可能的原因及对应解决方案
1. 文件编码不匹配(最常见)
Apple Numbers导出的TSV可能默认使用UTF-16编码(带BOM),而Swift默认用UTF-8读取,会导致制表符被解析成乱码或无效字符,无法匹配"\t"。
解决:读取文件时指定UTF-16编码:
guard let fileURL = Bundle.main.url(forResource: "your-file", withExtension: "tsv"), let fileData = try? Data(contentsOf: fileURL), let fileContent = String(data: fileData, encoding: .utf16) else { print("读取文件失败或编码错误") return } // 按行拆分并处理 for line in fileContent.components(separatedBy: .newlines) where !line.isEmpty { let columns = line.components(separatedBy: "\t") print("拆分结果:\(columns)") }
2. 存在非标准制表符或隐藏空白字符
有时候Numbers可能导出的不是标准ASCII制表符(U+0009),而是全角制表符(U+3000)或其他空白字符。可以先打印行内每个字符的Unicode值确认:
for char in line { print("字符:\(char),Unicode值:\(char.unicodeScalars.first?.value ?? 0)") }
如果发现制表符对应的Unicode值不是9,就用对应的字符替换"\t"进行拆分。比如全角制表符就用"\u{3000}"作为分隔符。
3. 逐行读取的换行符问题
如果是手动逐行读取(比如用FileHandle),可能因为换行符格式(\r\n vs \n)导致行内容不完整或包含多余字符。建议直接读取整个文件内容再按换行符拆分,用components(separatedBy: .newlines)可以自动适配不同换行格式。
内容的提问来源于stack exchange,提问作者horseshoe7
相关产品推荐
相关产品推荐

