2017-01-25 4 views
2

Я создаю приложение для управления записью в событии с помощью Swift 3. Я использую Firebase для хранения CSV-файлов моего клиента. Эти CSV-файлы представляют собой базу данных всех участников события.Как разобрать CSV-файл, загруженный из Firebase Storage Swift 3

Пример строк в моем файле 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 Tutorials: 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) 
        } 
       } 
      } 
     } 
    } 
+1

Можете ли вы опубликовать то, что вы получаете (значение 'dataString')? 1) это не проблема Firebase, 2) это, возможно, проблема с кодировкой символов (возможно, вы сохраняете значения не как символы, совместимые с UTF8?) –

ответ

1

Что вы спрашиваете, не имеет ничего общего с Firebase на самом деле. Вы просто хотите разобрать Data/NSData, которые представляют файл CSV. Загрузка данных из хранилища Firebase не имеет никакого отношения к его формату, поскольку он просто хранит необработанные данные.

CSV-файл - это не что иное, как разделенный запятыми или разделенный точкой с запятой простой текст, поэтому считайте, что ваши загруженные данные являются String.

Что-то иметь в виду здесь:

Какой бы метод вы используете (г), чтобы загрузить файл CSV на Firebase хранилище, убедитесь, что вы используете его кодировку позже декодировать загруженные данные.Это, как вы получите представление UTF8 данных в Swift String (в 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 парсеры:

Используя один из них дает вам преимущество, что некоторые полезные методы уже на месте, и возможность иметь разделение контента в более компонентов (строк, заголовки и т. д.), что потребует чуть больше работы, чем приведенный мной пример.

Смежные вопросы