我希望顺便使用https://github.com/yaslab/CSV.swift/issues将数据从数组添加到CSV文件,他们建议的方式是每个新行需要声明
try! csv.write(row: ["", ""])
例如,手动。
import Foundation
import CSV
let stream = OutputStream(toFileAtPath: "/path/to/file.csv", append: false)!
let csv = try! CSVWriter(stream: stream)
try! csv.write(row: ["id", "name"])
try! csv.write(row: ["1", "foo"])
try! csv.write(row: ["1", "bar"])
csv.stream.close()
无论如何,我需要让它自动创建一个新行取决于数组内的对象数量。所以我通过将每个csv附加到数组
来改变它 func saveCSVFiles() -> URL {
let itemList = objectNo
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
csvFile = documentDirectory.appendingPathComponent("\(fileName!).csv")
let path = csvFile
let stream = OutputStream(url: csvFile!, append: false)
let csv = try! [CSVWriter(stream: stream!)]
try! csv[0].write(row: ["name", "x", "y", "width", "height"])
for no in stride(from: 1, to: itemList.count, by: 1) {
try! csv[no].write(row: [String(describing: objects.dataName[no]), String(describing: objects.dataX[no]), String(describing: objects.dataY[no]), String(describing: objects.boundingX[no]), String(describing: objects.boundingY[no])])
}
csv[itemList.count].stream.close()
print("yesss!", "\(fileName!)")
return path!
}
但是每次我尝试保存它都会导致致命错误:索引超出范围在线for循环并且根本不保存
任何建议都会有所帮助
答案 0 :(得分:0)
Swift(和大多数语言)中的数组是从零开始的。所以你希望你的for循环从0变为count-1。有一个内置的构造..<
,非常适合:
for no in 0..< itemList.count {
try! csv[no].write(row: [String(describing: objects.dataName[no]), String(describing: objects.dataX[no]), String(describing: objects.dataY[no]), String(describing: objects.boundingX[no]), String(describing: objects.boundingY[no])])
}
听起来你需要索引你的csv数组从1到itemList.count
,以及从0到itemList.count - 1
的所有其他数组。因此你应该使用
for no in 0..< itemList.count {
try! csv[no+1].write(row: [String(describing: objects.dataName[no]), String(describing: objects.dataX[no]), String(describing: objects.dataY[no]), String(describing: objects.boundingX[no]), String(describing: objects.boundingY[no])])
}
(请注意+1
索引中的csv
。)