2016-02-20 19 views
5

Bir tabloda görüntülenen çekirdek verileri (5 özniteliği olan bir varlık) içeren bir uygulama yapıyorum. Şimdi bu verileri bir CSV dosyasına aktarmak istiyorum (bu yüzden bu dosyayı telefondan postayla gönderebilirim) böylece bir pencerede excel açabilirim. Çok araştırıyorum ama doğru cevabı bulamadım. Birisi bana yardım edebilir mi veya bana iyi bir açıklama veya öğretici bir link verebilir mi?Çekirdek Verilerden bir CSV dosyası nasıl oluşturulur (hızlı)

Hızlı btw inşa ediyorum.

func createExportString() -> String { 
    var merk: String? 
    var ref: String? 
    var beschrijving: String? 
    var aantal: String? 
    var wbs: String? 

    var export = NSLocalizedString("merk, ref, beschrijving, aantal, wbs \n", comment: "") 
      merk = Lijst.valueForKey("merk") as? String 
      ref = Lijst.valueForKey("ref") as? String 
      aantal = Lijst.valueForKey("aantal") as? String 
      beschrijving = Lijst.valueForKey("beschrijving") as? String 
      wbs = Lijst.valueForKey("wbs") as? String 


      let merkString = "\(merk!)" ?? "-" 
      let refString = "\(ref!)" ?? "-" 
      let beschString = "\(beschrijving!)" ?? "-" 
      let aantalString = "\(aantal!)" ?? "-" 
      let wbsString = "\(wbs!)" ?? "-" 

      export += merkString + "," + refString + "," + beschString + "," + aantalString + 
       "," + wbsString + "\n" 

    print("This is what the app will export: \(export)") 
    return export 
} 

@IBAction func saveToCSV(sender: AnyObject) { 
    exportDatabase() 
} 

func exportDatabase() { 
    var exportString = createExportString() 
    saveAndExport(exportString) 
} 

func saveAndExport(exportString: String) { 
    let exportFilePath = NSTemporaryDirectory() + "export.csv" 
    let exportFileURL = NSURL(fileURLWithPath: exportFilePath) 
    NSFileManager.defaultManager().createFileAtPath(exportFilePath, contents: NSData(), attributes: nil) 
    var fileHandleError: NSError? = nil 
    var fileHandle: NSFileHandle? = nil 
    do { 
     fileHandle = try NSFileHandle(forWritingToURL: exportFileURL) 
    } catch { 
     print("Error with fileHandle") 
    } 

    if fileHandle != nil { 
     fileHandle!.seekToEndOfFile() 
     let csvData = exportString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
     fileHandle!.writeData(csvData!) 

     fileHandle!.closeFile() 

     let firstActivityItem = NSURL(fileURLWithPath: exportFilePath) 
     let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [firstActivityItem], applicationActivities: nil) 

     self.presentViewController(activityViewController, animated: true, completion: nil) 
    } 
} 
+0

http://stackoverflow.com/questions/10572172/how-to-export-core-data-to-csv – UlyssesR

+0

@UlyssesR'yi kontrol edin. Ben zaten bu işe geldim, ama sadece yeni başlayan biriyim obejctive-c nasıl hızlıca dönüştürüleceğine dair bir fikriniz var ... –

+0

Belki bu adım adım video yardımında size yardımcı olacak https://www.youtube.com/watch?v=iBZbMkmtHuU – UlyssesR

cevap

6

Bu, istediğiniz her şeyi yapmanın kısa bir yoludur - yönetilen nesneler dizisini ve CSV'nin dosya adı olan bir dizeyi geçirirsiniz. Yöntem, CSV'nizi bir dosyaya yazar. Bu kodun çoğunda zaten var olduğuna inanıyorum, eksik olan şey "Documents" dizinindeki yeni bir dosyaya sadece bir dize yazan son iki satır.

let csvString = ..... 
let data = csvString.dataUsingEncoding(NSUTF8StringEncoding) 
let composer = MFMailComposeViewController() 
composer.addAttachmentData(attachment: data, 
      mimeType mimeType: "text/csv", 
      fileName filename: "mydata.csv") 

Sonra besteci (set gövdesine, konu ile olağan şeyler:

func writeCoreDataObjectToCSV(objects: [NSManagedObject], named: String) -> String { 
    /* We assume that all objects are of the same type */ 
    guard objects.count > 0 else { 
     return 
    } 
    let firstObject = objects[0] 
    let attribs = Array(firstObject.entity.attributesByName.keys) 
    let csvHeaderString = (attribs.reduce("",combine: {($0 as String) + "," + $1 }) as NSString).substringFromIndex(1) + "\n" 

    let csvArray = objects.map({object in 
     (attribs.map({(object.valueForKey($0) ?? "NIL").description}).reduce("",combine: {$0 + "," + $1}) as NSString).substringFromIndex(1) + "\n" 
    }) 
    let csvString = csvArray.reduce("", combine: +) 

    return csvHeaderString+csvString 
} 

Şimdi, başka bir yerde kodunda bu dizeden NSData oluşturmak ve posta besteci eklemek gerekir , vb) ve kullanıcıya sunun!

DÜZENLEME:

Düzenlendi daha iyi soruyu cevaplamak için cevap.

+0

arasındaki varlığın adı, bu kod için bana biraz daha açıklama yapabilir misiniz? bir dosyaya nereye koyarsınız ve bu kodu viewcontroller'a nereye koyarsınız? –

+0

Tamam, benim hatam. Bu temelde ihracata izin veren şeyi yapar. – Terminus

+0

cevabını okeyim tamam. Cevabınızı zaten düzenlediniz mi? Gerçekten bir fark görmüyorum? : p –

İlgili konular