如何使用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 [] } }