【Swift】CSVから読み込んだデータを画面に表示

# はじめに
単語帳、家計簿アプリなどのデータの読み込みでCSVを読み込むことがある。
ここではCSVを読み込んで画面に表示するまでを記録しておく。

# 実装
``` swift:ViewController.swift
import UIKit

final class ViewController: UIViewController {
    @IBOutlet weak var firstNameLabel: UILabel!
    
    @IBOutlet weak var firstFoodLabel: UILabel!
    
    @IBOutlet weak var firstHeightLabel: UILabel!
    
    @IBOutlet weak var secondNameLabel: UILabel!
    
    @IBOutlet weak var secondFoodLabel: UILabel!
    
    @IBOutlet weak var secondHeightLabel: UILabel!
    
    @IBOutlet weak var thirdNameLabel: UILabel!
    
    @IBOutlet weak var thirdFoodLabel: UILabel!
    
    @IBOutlet weak var thirdHeightLabel: UILabel!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var csvLines: [String] = []
        
        guard let path = Bundle.main.path(forResource:"dataList", ofType:"csv") else {
            let alert = UIAlertController(title: String.csvErrorTitle, message: "", preferredStyle: .alert)
            let gotItAction = UIAlertAction(title: String.ok, style: .default)
            
            self.showAlert(alert: alert, actions: [gotItAction])
            return
        }
        
        do {
            let csvString = try String(contentsOfFile: path, encoding: String.Encoding.utf8)
            csvLines = csvString.components(separatedBy: .newlines)
            csvLines.removeLast()
        } catch let error as NSError {
            self.showErrorAlert(code: String(error.code), message: error.localizedDescription)
            return
        }
        
        let firstData = csvLines[0].components(separatedBy: ",")
        let secondData = csvLines[1].components(separatedBy: ",")
        let thirdData = csvLines[2].components(separatedBy: ",")
        
        self.firstNameLabel.text = firstData[0]
        self.firstFoodLabel.text = firstData[1]
        self.firstHeightLabel.text = firstData[2] + "cm"
        
        self.secondNameLabel.text = secondData[0]
        self.secondFoodLabel.text = secondData[1]
        self.secondHeightLabel.text = secondData[2] + "cm"
        
        self.thirdNameLabel.text = thirdData[0]
        self.thirdFoodLabel.text = thirdData[1]
        self.thirdHeightLabel.text = thirdData[2] + "cm"
    }
    
    static func makeFromStoryboard() -> ViewController {
        guard let vc = UIStoryboard.init(name: "ViewController", bundle: nil).instantiateInitialViewController() as? ViewController else {
            fatalError()
        }
        return vc
    }
}

private extension ViewController {
    func showErrorAlert(code: String, message: String) {
        let gotItAction = UIAlertAction(title: String.ok, style: .default)
        let errorTitle = String.errorTitle + code
        let alert = UIAlertController(title: errorTitle, message: message, preferredStyle: .alert)
        self.showAlert(alert: alert, actions: [gotItAction])
    }
}

```

# プレビュー
①CSVを読み込んで画面に表示
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802393/e0803527-414e-c2c1-f720-c82a84eb7c04.png">

②CSVが存在しなければ、アラートを出す
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/802393/44141afe-41e7-3236-7665-b5e5c8903936.png">

# 終わりに
家計簿アプリなどのデータを出力してバックアップした後に、違う端末でCSVを読み込んで復元する機能に「CSVの読み込み」は使えそう

単位などはハードコーディングしているので修正した方がいい。

# 参考リンク
[【Swift/Xcode】CSVファイルからデータを読み込む方法](https://ios-docs.dev/loadcsv/)
[SwiftでCSVデータを読み込んでコンソールに出力](https://qiita.com/motokiohkubo/items/ab150591a7ddea830b86)