我是Swift的新手。我可以从csv文件格式读取数据(许多行和列的名称和邮件地址)。我有几个这样的文件,所以我创建了一个函数来读取文件并将数据提取到一个多维数组 - 名称,地址,城市,州,国家。我从文件中读取每一行并尝试将其附加到多维数组但我得到错误 - 索引超出范围或文件类型不匹配。什么是实现这一目标的最佳方式。请参阅下面的代码。
func getMailing(fileName: String) -> ([[String]])? {
let totalList = 243
var tempList: [String] = []
var arrayList = [[String]]()
guard let path = Bundle.main.url(forResource: fileName, withExtension: "csv") else {
print("File Error")
arrayList = [[""]]
return (arrayList)
}
do {
// get mailing data from file
let content = try String(contentsOf:path, encoding: String.Encoding.utf8)
// separate each line entry
tempList = content.components(separatedBy: "\r\n")
for index in 0...totalList - 1 {
// get each line from list and post into an array
let singleLine = tempList[index].components(separatedBy: ",").dropFirst().prefix(5)
// store each line data into into a multidimensional array for easy retrieval
arrayList[index].append(singleLine)
}
}
return (arrayList)
} catch {
print("File Error")
arrayList = [[""]]
return (arrayList)
}
}
答案 0 :(得分:0)
根据您显示的代码,您似乎正在尝试将两个不同的空数组的值更改243次。你有一个循环设置来根据你的totalList
属性进行迭代,但是你得到了这个值,我不知道。如果可以,以编程方式确定该值是明智的。
您将tempList
和arrayList
都设置为空数组:
var tempList: [String] = []
var arrayList = [[String]]()
但是你要经历一个循环并试图改变一个甚至不存在的条目的值,因此你的索引超出了范围错误。您需要先向这两个数组添加一些内容,因为它们现在是空的。当您尝试将singleLine
设置为tempList[index].components(separatedBy: ",").dropFirst().prefix(5)
时,它可能会在第一次循环时崩溃,因为您说的是tempList[0].components(separatedBy: ",").dropFirst().prefix(5)
,而tempList
没有条目在索引0
,因为它仍然是空的!如果你要遍历一个数组,那么根据数组的数量来做它总是明智的,或者当你需要使用来自两个不同数组的索引时,至少需要快速修复:
// Get the maximum times you can iterate based on the lowest count from each array
let maxLoop = min(tempList.count - 1, arrayList.count - 1)
for index in 0...maxLoop {
// get each line from list and post into an array
let singleLine = tempList[index].components(separatedBy: ",").dropFirst().prefix(5)
// store each line data into into a multidimensional array for easy retrieval
arrayList[index].append(singleLine)
}
现在上面的一小部分代码甚至都不会经历一次循环,因为两个数组仍然是空的。您需要在某个地方获取邮件数据并对其进行解析,以便您可以填充tempList
和arrayList