2016-02-20 11 views
5

मैं कोर डेटा (5 विशेषता वाले 1 इकाई) के साथ एक ऐप बना रहा हूं जो तालिका दृश्य में प्रदर्शित होता है। अब मैं इस डेटा को एक CSV फ़ाइल में निर्यात करना चाहता हूं (इसलिए मैं इस फाइल को फोन से मेल के साथ भेज सकता हूं) ताकि मैं इसे विंडोज़ पर एक्सेल में खोल सकूं। मैं बहुत कुछ खोजता हूं लेकिन सही जवाब नहीं मिला। क्या कोई मेरी मदद कर सकता है या मुझे एक अच्छा स्पष्टीकरण या ट्यूटोरियल का लिंक दे सकता है?कोर डेटा (स्विफ्ट) से सीएसवी फ़ाइल कैसे बनाएं

मैं तेजी से बीटीडब्ल्यू में निर्माण कर रहा हूं।

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 मैं पहले से ही उस पर आया हूं, लेकिन मैं सिर्फ शुरुआत करने वाला हूं और नहीं वास्तव में ओबेजेक्टिव-सी को स्विफ्ट में परिवर्तित करने के बारे में एक विचार है ... –

+0

शायद चरणबद्ध वीडियो द्वारा यह कदम आपको मदद करता है, https://www.youtube.com/watch?v=iBZbMkmtHuU – UlyssesR

उत्तर

6

यह सब कुछ करने का एक संक्षिप्त तरीका है - आप प्रबंधित वस्तुओं की सरणी पास करते हैं और एक स्ट्रिंग जो सीएसवी का फ़ाइल नाम है। विधि आपके सीएसवी को फाइल में लिखती है। मेरा मानना ​​है कि आपके पास पहले से ही आपके कोड में सबसे अधिक है, जिस चीज की कमी है, वह पिछले दो पंक्तियां हैं जो "दस्तावेज़" निर्देशिका में एक नई फ़ाइल में स्ट्रिंग लिखती हैं।

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

फिर, संगीतकार (सेट शरीर, विषय के साथ हमेशा की तरह सामान कार्य करें:

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 
} 

अब, कहीं और कोड में आप इस स्ट्रिंग से NSData बना सकते हैं और मेल संगीतकार में जोड़ने के लिए की जरूरत है , आदि) और इसे उपयोगकर्ता को प्रस्तुत करें!

संपादित करें:

संपादित जवाब बेहतर सवाल का जवाब देने।

+0

से इकाई का नाम क्या आप शायद मुझे इस कोड के लिए कुछ और स्पष्टीकरण दे सकते हैं? आप इसे एक फाइल में कहां डालते हैं और आप इस कोड को व्यू कंट्रोलर में कहां डालते हैं? –

+0

ठीक है, मेरी गलती। यह मूल रूप से निर्यात = करता है क्या करता है। मैं जवाब – Terminus

+0

ठीक संपादित करूंगा। क्या आपने पहले ही अपना जवाब संपादित किया है? मुझे वास्तव में कोई अंतर नहीं दिख रहा है? : पी –

संबंधित मुद्दे