2016-02-20 64 views
5

私は、tableViewに表示されるコアデータ(5つの属性を持つ1つのエンティティ)を持つアプリケーションを構築しています。今私はこのデータをCSVファイルにエクスポートしたいので(電話でこのファイルをメールで送信できるので)、Windows上でExcelを開くことができます。私は多くを検索するが、正しい答えは見つからなかった。誰かが私を助けたり、良い説明やチュートリアルへのリンクを私に与えることはできますか?Core Data(swift)から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

チェック@stackoverflow.com/questions/10572172/how-to-export-core-data-to-csv – UlyssesR

+0

@UlyssesR私はすでにそれに来ましたが、私は初心者です。 obejctive-cを迅速に変換する方法についてのアイデアを持っています。 –

+0

ステップビデオによるこの手順は、おそらくhttps://www.youtube.com/watch?v=iBZbMkmtHuU – UlyssesR

答えて

6

これは、管理対象オブジェクトの配列とCSVのファイル名である文字列を渡すための簡潔な方法です。このメソッドは、CSVをファイルに書き込みます。私はあなたがすでにあなたのコードでこれのほとんどを持っていると信じていますが、欠けているものは "Documents"ディレクトリの新しいファイルに文字列を書き込む最後の2行です。

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

あなたは多分私にこのコードのいくつかの説明を与えることができますか?あなたはどこにファイルを置いていますか?このコードをviewcontrollerにどこに置いていますか? –

+0

さて、私の間違い。これは基本的にexport =を行うものです。私は答えを – Terminus

+0

okを編集します。あなたはすでにあなたの答えを編集しましたか?違いは分かりません。 :p –

関連する問題