【问题标题】:How to create a CSV file from Core Data (swift)如何从 Core Data (swift) 创建 CSV 文件
【发布时间】:2016-02-20 23:46:32
【问题描述】:

我正在构建一个应用程序,其中包含显示在 tableView 中的核心数据(1 个实体和 5 个属性)。现在我想将这些数据导出到一个 CSV 文件(这样我就可以通过电话通过邮件发送这个文件),这样我就可以在 windows 上的 excel 中打开它。我搜索了很多,但没有找到正确的答案。有人可以帮助我或给我一个很好的解释或教程的链接吗?

顺便说一句,我正在快速构建。

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

【问题讨论】:

  • @UlyssesR 我已经来到了那个,但我只是一个初学者,并不知道如何将 obejctive-c 转换为 swift...
  • 也许这个分步视频对你有帮助,youtube.com/watch?v=iBZbMkmtHuU
  • @UlyssesR 已经为 :p 制作了该视频,我已将其与我的数据一起导入到我的应用程序中,但我在 createExportString 函数上出现错误。
  • 你能把代码和错误放在一起吗?可以帮助我们调试代码。

标签: ios swift csv core-data


【解决方案1】:

这是做所有你想做的一切的简洁方式 - 你传递托管对象的数组和一个作为 CSV 文件名的字符串。该方法将您的 CSV 写入文件。我相信您的代码中已经包含了大部分内容,缺少的是最后两行,它们只是将字符串写入“Documents”目录中的新文件。

func writeCoreDataObjectToCSV(objects: [NSManagedObject], named: String) -> String? {
    /* We assume that all objects are of the same type */
    guard objects.count > 0 else {
        return nil
    }
    let firstObject = objects[0]
    let attribs = Array<Any>(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 并将其添加到邮件编写器:

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

然后,与作曲家一起做通常的事情(设置正文、主题等)并将其呈现给用户!

编辑:

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

【讨论】:

  • 你能给我更多关于这段代码的解释吗?你把它放在一个文件的什么地方?你把这段代码放在 viewcontroller 的什么地方?
  • 好吧,我的错。这基本上就是 let export = 所做的。我会编辑答案
  • 好的。你已经编辑了你的答案吗?我真的看不出有什么不同? :p
  • 好的,我想我明白了吗?但是我在哪里可以找到 csv 文件以便我可以使用它?
  • DocumentsDir 变量保存文件的确切路径。也许这个名字有点不幸:) 你可以从函数中返回它,然后在其他地方使用它(例如邮件控制器)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2019-04-25
  • 2019-09-17
  • 1970-01-01
  • 2021-04-11
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多