从cvs文件中读取数据并将数据转换为Swift中的多维数组

时间:2017-02-09 02:15:29

标签: arrays swift multidimensional-array

我是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)
}

}

1 个答案:

答案 0 :(得分:0)

根据您显示的代码,您似乎正在尝试将两个不同的空数组的值更改243次。你有一个循环设置来根据你的totalList属性进行迭代,但是你得到了这个值,我不知道。如果可以,以编程方式确定该值是明智的。

您将tempListarrayList都设置为空数组:

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)
 }

现在上面的一小部分代码甚至都不会经历一次循环,因为两个数组仍然是空的。您需要在某个地方获取邮件数据并对其进行解析,以便您可以填充tempListarrayList