在Swift中创建CSV文件并写入文件

时间:2015-10-26 15:09:59

标签: swift uitableview csv directory

我制作了一款应用UITableView,其中todoItemsarray。它运行完美,我有一个导出按钮,可以从UITableView数据创建一个CSV文件并通过电子邮件发送出来:

// Variables
var toDoItems:[String] = []
var convertMutable: NSMutableString!
var incomingString: String = ""
var datastring: NSString!

// Mail alert if user does not have email setup on device
func showSendMailErrorAlert() {
    let sendMailErrorAlert = UIAlertView(title: "Could Not Send Email", message: "Your device could not send e-mail.  Please check e-mail configuration and try again.", delegate: self, cancelButtonTitle: "OK")
    sendMailErrorAlert.show()
}
// MARK: MFMailComposeViewControllerDelegate Method
func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
    controller.dismissViewControllerAnimated(true, completion: nil)
}

// CSV Export Button
@IBAction func csvExport(sender: AnyObject) {
    // Convert tableView String Data to NSMutableString
    convertMutable = NSMutableString();
    for item in toDoItems
    {
        convertMutable.appendFormat("%@\r", item)
    }

    print("NSMutableString: \(convertMutable)")

    // Convert above NSMutableString to NSData
    let data = convertMutable.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    if let d = data { // Unwrap since data is optional and print
        print("NSData: \(d)")
    }

    //Email Functions
    func configuredMailComposeViewController() -> MFMailComposeViewController {
        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self
        mailComposerVC.setSubject("CSV File Export")
        mailComposerVC.setMessageBody("", isHTML: false)
        mailComposerVC.addAttachmentData(data!, mimeType: "text/csv", fileName: "TodoList.csv")

        return mailComposerVC
    }

    // Compose Email
    let mailComposeViewController = configuredMailComposeViewController()
    if MFMailComposeViewController.canSendMail() {
        self.presentViewController(mailComposeViewController, animated: true, completion: nil)
    } else {
        self.showSendMailErrorAlert() // One of the MAIL functions
    }
}

我的问题是如何创建相同的CSV文件,而不是通过电子邮件发送,将其保存到文件?我是编程新手并且仍在学习Swift 2.我理解代码(data!, mimeType: "text/csv", fileName: "TodoList.csv")部分将文件创建为附件。我在网上看了这个,试图理解路径和目录对我来说很难。我的最终目标是让另一个UITableView列出这些“已保存”的CSV文件。有人可以帮忙吗?谢谢!

我在项目中添加了以下IBAction

// Save Item to Memory
@IBAction func saveButton(sender: UIBarButtonItem) {
    // Convert tableView String Data to NSMutableString
    convertMutable = NSMutableString();
    for item in toDoItems
    {
        convertMutable.appendFormat("%@\r", item)
    }

    print("NSMutableString: \(convertMutable)")

    // Convert above NSMutableString to NSData
    let data = convertMutable.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    if let d = data { // Unwrap since data is optional and print
        print("NSData: \(d)")
    }

    let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString

    func writeToFile(_: convertMutable, path: String, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws {

    }

}

2 个答案:

答案 0 :(得分:1)

多年来,我一直在努力寻找一个像样的简单答案。

这是我发现创建csv文件甚至是您想要的目录并将其写入的最佳方法。

//First make sure you know your file path, you can get it from user input or whatever
//Keep the path clean of the name for now
var filePath = "/Users/Johnson/Documents/NEW FOLDER/"
//then you need to pick your file name
let fileName = "AwesomeFile.csv"
//You should probably have some data to put in it
//You can even convert your array to a string by appending all of it's elements
let fileData = "This,is,just,some,dummy,data"

// Create a FileManager instance this will help you make a new folder if you don't have it already
let fileManager = FileManager.default 

//Create your target directory
do {
   try fileManager.createDirectory(atPath: filePath!, withIntermediateDirectories: true, attributes: nil)
   //Now it's finally time to complete the path
   filePath! += fileName!
        }
        catch let error as NSError {
            print("Ooops! Something went wrong: \(error)")
        }

//Then simply write to the file
do {
   // Write contents to file
   try fileData.write(toFile: filePath!, atomically: true, encoding: String.Encoding.utf8)
   print("Writing CSV to: \(filePath!)")
}
        catch let error as NSError {
            print("Ooops! Something went wrong: \(error)")
        }

PS。刚刚注意到这个问题是从一年前开始的,但是我希望当他们像我一样无意中发现这个问题时,它能帮助像我这样挣扎的新手。

答案 1 :(得分:0)

convertMutable可以使用fun writeToFile(_ path: String, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throwsfunc writeToURL(_ url: NSURL, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws轻松写入磁盘。您所要做的就是创建一个路径或URL来写出字符串。如果您使用的是iCloud,那么事情会更具挑战性,但对于本地存储的文件,您可以使用let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString来获取文档目录的根路径。

更新:根据您在下面的第一条评论,这里有一些补充信息: 第一个问题是,看起来好像您正在寻找代码,您只需粘贴到您的项目中,而无需真正理解它的作用。如果我错了,我的抱怨,但如果我说对了,这不是一条好路线,因为当事情发生变化时,你会遇到很多问题。

在上一个代码部分的底部,您尝试在函数内创建一个函数,该函数不会执行您想要的操作。上面提到的函数是两个NSString函数的声明,而不是您需要创建的函数。由于NSMutableString是NSString的子类,因此您可以在convertMutable变量上使用这些函数。

您需要处理的另一件事是为要保存的文件创建一个名称,目前您已粘贴到上面的行中,该行获取了Documents目录但没有文件名。每次保存CSV文件并将该名称添加到path的末尾时,您需要设计一种创建唯一文件名的方法。然后,您可以使用writeToFile…writeToURL…将字符串写入所需位置。

如果您发现自己并未完全理解要添加的代码,请考虑获取一本书或查找有关Swift的课程(Coursera.org有一个可能有用的课程)。有很多资源可以学习软件开发和Swift的基础知识,需要花费精力和时间,但如果这是你想要追求的东西,那么它最终是值得的。