【问题标题】:How to parse a CSV file downloaded from Firebase Storage Swift 3如何解析从 Firebase Storage Swift 3 下载的 CSV 文件
【发布时间】:2017-06-10 00:36:37
【问题描述】:

我正在使用 Swift 3 创建一个应用程序来管理事件中的条目。我正在使用 Firebase 来存储我的客户端的 CSV 文件。这些 CSV 文件代表一个事件的所有参与者的数据库。

我的 CSV 文件中存储在 Firebase 存储中的行示例:

id;event;lastname;firstname;phone;email;address;zipcode;city;added_in_event;comment;checked;checked_date;created;created_uid
479;NULL;CHARLANES;Herve;Google;NULL;NULL;NULL;NULL;NULL;NULL;1;24/11/2016 11:43;NULL;NULL
480;NULL;CHARLANES;Eve;Google;NULL;NULL;NULL;NULL;NULL;NULL;1;24/11/2016 13:21;NULL;NULL[...]

Firebase 网站为您提供教程,帮助您了解如何使用 Firebase 存储存储图像以及如何从我们的应用下载该图像。这很简单,您只需使用您的参考gsReference.data(withMaxSize: 1 * 1024 * 1024) { data, error in [...] 并将NSData 类型的“数据”的结果存储在UIImage 中即可完成。

Firebase 教程链接:https://firebase.google.com/docs/storage/ios/download-files

但是今天,我想下载 CSV 文件而不是图像。正如 Firebase 教程所说,NSData 类型的“数据”的结果是我新下载的 CSV。我想读取文件的内容并将所有行存储到选项卡 [] 中。 但是,当我打印“数据”时,我能得到的唯一信息是 CSV 文件“1796 字节”的正确大小,而不是我的 CSV 内容。

所以我试图从“数据”编码NSData,但它也不起作用......

你们有什么建议吗?

这是我的功能示例:

  func downloadMyCSV(){
        //Firebase Storage Reference
        let storage = FIRStorage.storage()
        //location of my CSV file in Firebase Storage Reference
        let gsReference = storage.reference(forURL: "gs://xxxx-xxxx.appspot.com/USERS_BDD_CSV/XXXxq5qur9XQOqAOoAeWH9F5AXo2/Tab-User-Trial.csv")

        //Firebase function for download a file with a reference
        gsReference.data(withMaxSize: 1 * 1024 * 1024) { data, error in
            if let error = error {
                //Sh*t happen
                print(error.localizedDescription)
            } else {
                print(data)//print : "1796 bytes" the exacte size of my CSV file stored in firebase storage

                if data != nil {//Me trying to encode
                    do {
                        let dataString = String(data: data!, encoding: .utf8)
                        let s = try String(contentsOf: url!, encoding : .utf8)
                        print("my data : \(dataString)")
                        print(s)
                    }catch let error as NSError{
                        print(error)
                    }
                }
            }
        }
    }

【问题讨论】:

  • 你能发布你得到的(dataString 的值)吗? 1)这似乎不是 Firebase 问题,2)很可能是字符编码问题(也许您存储的值不是 UTF8 兼容字符?)

标签: ios swift parsing firebase firebase-storage


【解决方案1】:

您的问题实际上与 Firebase 无关。您只想解析代表 CSV 文件的 Data/NSData。从 Firebase 存储下载数据与其格式无关,因为它只是存储原始数据。

CSV 文件只不过是逗号分隔或分号分隔的纯文本,因此请将您下载的数据视为String

注意事项:

无论您使用什么方法 (d) 将 CSV 文件上传到 Firebase 存储,请确保稍后使用其字符编码来解码下载的数据。这就是你如何获得 Swift StringUTF8 数据表示(在 Swift 3 中)

let data = "myCSVString".data(using: .utf8)

解析传入的 CSV 数据:

正如您在示例中所做的那样,将数据解码回字符串:

let dataString = String(data: data!, encoding: .utf8)    // this is only valid if you used UTF8 to encode it

为了方便处理,在 CSV 中获取所有字符串的数组,如下所示:

let csvStrings = dataString.components(separatedBy: ";")
// this can also be...
let moreGenericCSVStrings = dataString.components(separatedBy: [",", ";"])   // to handle comma separated CSV

如果您想要一种更少的手动方式来做到这一点,那么就没有必要重新发明轮子。

一些 CSV 解析器:

使用其中一种方法可以让您拥有一些有用的方法,并且能够将内容拆分为更多组件(行、标题等),这比我提供的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 2018-03-18
    • 2023-03-25
    • 2016-11-27
    • 2012-06-08
    • 2017-06-15
    • 2019-04-17
    相关资源
    最近更新 更多