iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Swift】csv からデータを取得するメモ

今回は csv からデータを取得する方法をメモ程度に残しておきます。

それではやっていく

下記のような、お酒の情報が並んだ liquors.csv ファイルからデータを取得していきたいと思います。

ビール1缶,5,350
ビール1缶,5,500
チューハイ1缶,5,350
チューハイ1缶,5,500
ハイボール1缶,7,350
ハイボール1缶,7,350
ワイン1杯,12,120
清酒1合,15,180
焼酎コップ1杯,15,100
ウイスキーシングル1杯,40,30
テキーラシングル1杯,40,30
ブランデーシングル1杯,45,30

ということで下記が完成したコードになります👷‍♀️

    func liquors() -> [Liquor] {
        guard let path = Bundle.main.path(forResource:"liquors", ofType:"csv"),
              let csvString = try? String(contentsOfFile: path, encoding: String.Encoding.utf8) else {
            return []
        }
        let liquors = csvString.components(separatedBy: .newlines).compactMap { line -> (name: String, alcoholContent: Float, milliliter: Float)? in
            let component = line.components(separatedBy: ",")
            guard let name = component[safe: 0], let alcoholContent = component[safe: 1], let milliliter = component[safe: 2] else {
                return nil
            }
            return Liquor(name: name, alcoholContent: alcoholContent, milliliter: milliliter)
        }
        return liquors
    }

components で取得した値は万が一の場合を考えてオプショナルで取得しています。このように配列の要素をオプショナルで取得したい状況は結構あるので ArrayExtension に追加しておくとん便利です。

extension Array {
    public subscript (safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

という感じで本日も以上になります🍺

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com