如何使用Swift将文本文件加载到数组中?

如何使用swift将文本文件加载到array

有些东西是:

 func arrayFromContentsOfFileWithName(fileName: String) -> [String]? { guard let path = NSBundle.mainBundle().pathForResource(fileName, ofType: "txt") else { return nil } do { let content = try String(contentsOfFile:path, encoding: NSUTF8StringEncoding) return content.componentsSeparatedByString("\n") } catch _ as NSError { return nil } } 

这种方法假定有问题的文件位于您的应用程序包中。

这只能工作,直到Xcode 6.1testing版1.在6.1testing版2你必须写这个:

 var err: NSError? = NSError() let s = String(contentsOfFile: fullPath, encoding: NSUTF8StringEncoding, error: &err) 

其中, fullPath是包含文件完整path的string, NSUTF8StringEncoding是UTF8编码的预定义常量。

您也可以使用Mac文件的NSISOLatin1StringEncoding或Windows文件的NSISOLatin1StringEncoding

s是一个可选的string,你可以看看如果读取文件是成功的:

 if (s != nil) { return (s!) // Return the string as "normal" string, not as optional string } 

如果你在Swift 2.0中,你应该使用:

 let path = NSBundle.mainBundle().pathForResource(fileName, ofType: nil) if path == nil { return nil } var fileContents: String? = nil do { fileContents = try String(contentsOfFile: path!, encoding: NSUTF8StringEncoding) } catch _ as NSError { return nil } 

Swift 3版本基于接受的答案:

 func arrayFromContentsOfFileWithName(fileName: String) -> [String]? { guard let path = Bundle.main.path(forResource: fileName, ofType: "txt") else { return nil } do { let content = try String(contentsOfFile:path, encoding: String.Encoding.utf8) return content.components(separatedBy: "\n") } catch { return nil } } 

我简单的编码给你

  let path = NSBundle.mainBundle().pathForResource("FileName", ofType: "txt") var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)! println(text) var array = text.componentsSeparatedByString("\n") 

在Swift 3中, Foundation String有一个init(contentsOfFile:encoding:)初始值设定项。 init(contentsOfFile:encoding:)具有以下声明:

 init(contentsOfFile path: String, encoding enc: String.Encoding) throws 

生成一个string,它是通过从给定path的文件中读取数据来创build的。


在Swift 3中, Foundation String也有一个名为components(separatedBy:)的方法。 components(separatedBy:)具有以下声明:

 func components(separatedBy separator: String) -> [String] 

返回一个数组,其中包含已由给定分隔符分隔的String中的子String


因此,下面的UIViewController实例实现演示了如何将文本文件的内容加载到数组中:

 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Get the path of the file (located in app bundle) guard let path = Bundle.main.path(forResource: "Lorem Ipsum", ofType: "txt") else { return } let array: [String] do { // Put the content of the file into a string let fileContent = try String(contentsOfFile: path, encoding: String.Encoding.utf8) // Put each sentence of the string into an array array = fileContent.components(separatedBy: "\n") } catch { print("Error:", error) return } print(array) } } 

Swift 3.0

 if let path = Bundle.main.path(forResource: <#FileName#>, ofType: "txt") { do { let str = try String(contentsOfFile:path, encoding: String.Encoding.utf8) return str.components(separatedBy: "\n") } catch { } } else { return nil } 

对我来说,工作如下:

 let myFileURL = NSBundle.mainBundle().URLForResource("listacomuni", withExtension: "txt")! let myText = try! String(contentsOfURL: myFileURL, encoding: NSISOLatin1StringEncoding) print(String(myText)) 

如果你想读取一个数字数据的CSV文件。 (根据Cezar的回答)

 func get_csv_data() -> [[Double]] { guard let path = NSBundle.mainBundle().pathForResource("filename_without_extension", ofType: "csv") else { return [] } do { let content = try String(contentsOfFile:path, encoding: NSUTF8StringEncoding) let line_str_array = content.componentsSeparatedByString("\n") return line_str_array.map { let field_str_array = $0.componentsSeparatedByString(",") return field_str_array.map { Double($0)! } } } catch _ as NSError { return [] } }