我正在使用Swift 3创建一个管理事件条目的应用程序。我使用Firebase存储客户端的CSV文件。这些CSV文件表示事件的所有参与者的数据库。
存储在Firebase存储中的CSV文件中的行示例:
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。我想阅读我的文件内容并将所有行存储到tab []中。
但是,当我打印数据时,我可以获得的唯一信息是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)
}
}
}
}
}
答案 0 :(得分:2)
您提出的问题实际上与Firebase无关。您只想解析代表CSV文件的Data
/ NSData
。从Firebase Storage下载数据与其格式无关,因为它只是存储原始数据。
CSV文件只是以逗号分隔或以分号分隔的纯文本,因此请将您下载的数据视为String
。
请注意以下事项:
无论您使用何种方法(d)将CSV文件上传到Firebase存储,请确保稍后使用其字符编码来解码下载的数据。这就是你如何获得Swift UTF8
的{{1}}数据表示(在Swift 3中)
String
解析传入的CSV数据:
正如您在示例中所做的那样,将数据解码回字符串:
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解析器:
Objective-C图书馆:
Swift库:
使用其中一个为您提供了一些优势,即已经有一些有用的方法,并且能够将内容拆分为更多的组件(行,标题等等),而这些组件需要的工作量比我提供的例子。