我正在使用 TabularData 框架在 Swift 中处理数据。我将 CSV 文件中的数据加载到 DataFrame 中,然后将数据复制到第二个 DataFrame 中,最后从第二个 DataFrame 中删除一行。
当我尝试从第二个 DataFrame 中删除一行时,问题就出现了,此时我收到了 EXC_BAD_ACCESS 错误。但是,如果我在删除行之前修改“timings”列(最后一列)(甚至修改为相同的值),则代码运行不会出现错误。
有趣的是,只有当 CSV 文件的列中的一行包含超过 15 个字符时,才会出现此问题。
这是我正在使用的代码:
func loadCSV() {
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let url = documentsDirectory.appendingPathComponent("example.csv")
var dataframe: DataFrame
do {
dataframe = try .init(
contentsOfCSVFile: url,
columns: ["user", "filename", "syllable count", "timings"],
types: ["user": .string, "filename": .string, "syllable count": .integer, "timings": .string]
)
} catch {
fatalError("Failed to load csv data")
}
print("First data frame",dataframe, separator: "\n") /// This works
var secondFrame = DataFrame()
secondFrame.append(column: Column<String>(name: "user", capacity: 1000))
secondFrame.append(column: Column<String>(name: "filename", capacity: 1000))
secondFrame.append(column: Column<Int>(name: "syllable count", capacity: 1000))
secondFrame.append(column: Column<String>(name: "timings", capacity: 1000))
for row in 0..<dataframe.rows.count {
secondFrame.appendEmptyRow()
for col in 0..<4 {
secondFrame.rows[row][col] = dataframe.rows[row][col]
}
}
// secondFrame.rows[row][3, String.self] = String("0123456789ABCDEF") /* If we include this line, it will not crash, even though the content is the same */
print("Second data frame before removing row",dataframe, separator: "\n") // Before removal
secondFrame.removeRow(at: 0)
print("Second data frame after removing row",dataframe, separator: "\n") // After removal—we will get Thread 1: EXC_BAD_ACCESS here. The line will still print, however
}
这是我正在使用的 csv:
user,filename,syllable count,timings
john,john-001,12,0123456789ABCDEF
jane,jane-001,10,0123456789ABCDE
我已经能够使用最少的项目在 macOS 和 iOS 上复制此错误。我不确定为什么会发生此错误以及为什么修改“timings”列会阻止它。
需要注意的是,从 CSV 文件加载单个数据帧也会出现同样的错误,这意味着如果我想随后修改 DataFrame,我基本上无法从 CSV 加载。