大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

SwiftUI沼でゆっくり浸る 郵便番号DetailViewの起動時のZip解凍

著者:川上洋
公開日:2022/08/26
最終更新日:2022/08/26
カテゴリー:技術情報 雑記
タグ:

こんにちは、川上です。

アプリの解凍から郵便番号DetailView用表示Arry作成の前掲の件の続きです。

 
  // MARK: === 郵便番号データZipのLoad
   self.vm.getZip(tfklstIdx,postsIdx)

郵便番号DetailViewの起動時のonAppear()内で、サイトからZipをLoadし、解凍して郵便番号データListの表示Arryを作成するのでした。

class PostNumberViewModel:ObservableObject {
   ・・・
    @Published var postArry: [stPostNumber] = []    // 郵便番号、住所データの型 arry
}
   
    func getZip(_ lstidx:Int,_ postidx:Int)
    {
        
        let urlstr = tofukenAreaArry_Datas[lstidx]
                        .postss[postidx]
                        .dl_url

        // MARK: ===  zip 保存存在チェック
        if LFmanager.isZipSaveFileExist(urlstr) {
            let fname = urlstr.lastPathComponent // hogehoge.zip
            if let csvstrarry = self.LFmanager.getUnZip(fname) {
                self.getPostNumberArry2CSVArry(csvstrarry)
            }
            else {
                print(" 🟥 == getZip(): NG == zip -> str")
            }
            return
        }
        
        
        guard let url = URL(string: urlstr) else { return }
        // MARK: === DLするData File
        downloadData(fromURL: url) { (returnedData) in
            if let data = returnedData {
                
                DispatchQueue.main.async {
                    self.loadCSVzip = data

                    let fname = urlstr.lastPathComponent // hogehoge.zip
                    self.LFmanager.saveLoadData(loaddata: data, fname: fname)
                    
                    // MARK: == Zip -> Data → [String]
                    if let csvstrarry = self.LFmanager.getUnZip(fname) {
                        
                        // MARK: == 既存Zip Fileからのcsv dataの取得
                        self.getPostNumberArry2CSVArry(csvstrarry)
                    }
                    else {
                        print(" 🟥 == getZip(): NG == zip -> str")
                    }
                }

            }
            else {
                print ("== 🟥 from web , No data returned.")
            }
        }
    } // == getZip()

    // MARK: == 既存Zip Fileからのcsv dataの取得
    func getPostNumberArry2CSVArry(_ csvstrarry :[String]) {
        postArry.removeAll()
        for (idx,csv) in csvstrarry.enumerated() {
            let csv2 = csv.substringSpaceTrim()
            if !csv2.isEmpty {
                // == "\""を削除
                let dcsv = csv.replacingOccurrences(of: "\"", with: "")
                var spritArry:[String] = []
                // == ","でCSVから分割しデータ取得
                spritArry = dcsv.components(separatedBy: ",")

                var post_dt = stPostNumber()
                post_dt.poststr =  spritArry[eCSV_DT.ePOSTNUM.rawValue]      // 郵便番号
                post_dt.tofukenn_h = spritArry[eCSV_DT.eTFKEN_H.rawValue]   // 都道府県名 半角カタカナ
                post_dt.sikuson_h = spritArry[eCSV_DT.eCKTS_H.rawValue]    // 市区村名 半角カタカナ
                post_dt.tyoiki_h = spritArry[eCSV_DT.eMERA_H.rawValue]    // 町域 半角カタカナ
                post_dt.tofukenn_k = spritArry[eCSV_DT.eTFKEN_K.rawValue]   // 都道府県名
                post_dt.sikuson_k = spritArry[eCSV_DT.eCKTS_K.rawValue]    // 市区村名
                post_dt.matison_k = spritArry[eCSV_DT.eMERA_K.rawValue]    // 町村名

                postArry.append(post_dt)
                
            } 
        } 
        print("postArry.count =\(postArry.count)")
    } // == getPostNumberArry

で、郵便番号DetailViewに検索窓を付けて、postArryから検索したい郵便番号データをsortして表示するのでした。

ではでは。

    上に戻る