【问题标题】:Converting a multi dimensional string array into doubles将多维字符串数组转换为双精度
【发布时间】:2017-08-17 08:40:29
【问题描述】:

我一直在尝试解析一个 CSV 文件,而且我快到了。我已经使用以下代码将它变成了一个多维字符串数组:

let path = Bundle.main.url(forResource: "BaseballSimStats", withExtension: "csv")
    var file = String()
    do {
        file = try String(contentsOf: path!)
        print(file)
    } catch {
        print(error)
    }
    let stringarray = file.components(separatedBy: "\n").map{ $0.components(separatedBy: ",") }

现在最后一步是把它变成一个 Double。我正在使用此代码:

probs = Double[[stringarray]]

我收到一条错误消息,指出该类型没有下标错误。我摆脱了下标引用,错误消失了。为什么这里会出现这个错误,我该如何摆脱它?谢谢!

【问题讨论】:

  • 你能解释一下你的数组包含什么......以及你期望你的 probs 变量是什么?
  • 该数组包含 30 行,每行 6 个字符串,它们是这样的数字:15.14376997。 Probs 应该与前一个数组完全相同,但类型为 Double

标签: ios arrays swift syntax-error


【解决方案1】:

我使用.map() 将String 映射为Double,这应该适用于嵌套数组

var strArray = [["1.00000","1.10000"],["2.00000","2.10000"]]
var doubleArray = strArray.map { (arr: Array) -> Array<Any> in
    return arr.map({ (value: String) -> Double in
        return Double(value)!
    })
}
print(strArray)
print(doubleArray)

我不确定是否需要双重地图。

我不是一个快速的大师,但这段代码应该可以帮助你实现你想要的..

【讨论】:

  • 如果使用 flatMap 则无需强制展开
  • 我在操场上运行它并且它工作。然后我把它放在我的代码中,它告诉我 Array 与 Double 不兼容。
【解决方案2】:

我不熟悉Double[[stringarray]] 语法,所以我不知道它应该如何工作。我知道you can't just cast between array types

最简单的方法可能是用Double.init()包裹最里面的调用:

file.components(separatedBy: "\n").map{ $0.components(separatedBy: ",").map { Double($0)! }}

当然,CSV 不仅仅是用逗号分割并假设所有内容都是有效数字,因此我强烈建议对任何真实数据使用现有的 CSV 解析库。

【讨论】:

  • 我尝试通过可可豆荚使用 csv 解析器,但无法使其正常工作。当我运行这段代码时,我得到一个错误,说它找到了 nil。
  • 我设置了let file = "1,2,3\n4,5,6" 并运行了它,它对我来说效果很好。如果你有不能被解析为双精度值的值,你需要定义你希望它对它们做什么,并实现它。该语言不允许将它们放入[[Double]]
  • 有道理。我上面说的数字是双重的吗?
猜你喜欢
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多