如何从Core Data(swift)创建CSV文件 [英] How to create a CSV file from Core Data (swift)

查看:618
本文介绍了如何从Core Data(swift)创建CSV文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个应用程序,核心数据(1个实体具有5个属性)显示在tableView中。现在我想导出这个数据到CSV文件(所以我可以发送这个文件与邮件从手机),所以我可以在Excel上打开它。我搜索了很多,但没有找到正确的答案。有人可以帮助我或给我一个很好的解释或教程的链接?

I'm building an app with core data (1 entity with 5 attributes) that display in a tableView. Now i would like to export this data to a CSV file (so i can send this file with mail from phone) so i can open it in excel on a windows. i search a lot but didn't find the right answer. Can someone help me or give me a link to a good explanation or tutorial?

我正在建立swift btw。

I'm building in swift btw.

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)
    }
}


推荐答案

这是一个简单的方法来做所有你想要的 - 传递管理对象的数组和一个字符串是CSV的文件名。该方法将CSV写入文件。我相信你已经在你的代码中有这么多,缺少的东西是最后两行,只是写一个字符串到一个新的文件Documents目录。

This is a concise way of doing all you want - you pass array of managed objects and a string that is CSV's filename. The method writes your CSV to a file. I believe you already have most of this in your code, the thing that is lacking are last two lines that just write a string into a new file in "Documents" directory.

func writeCoreDataObjectToCVS(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,

Now, somewhere else in the code you need to create NSData from this string and add it to mail composer:

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

然后,使用作曲家做一些常用的操作(set body,topic等),并将其呈现给用户

Then, do the usual stuff with the composer (set body, topic, etc) and present it to the user!

编辑:

编辑答案以更好地回答问题。

Edited the answer to better answer the question.

这篇关于如何从Core Data(swift)创建CSV文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆