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

Seb*_*ull 37 ios swift

如何加载文本文件到一个arrayswift

Cez*_*zar 61

有点像:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

此方法假定相关文件位于您的应用包中.

  • 这是我第一次看到"守卫"声明 (2认同)

j.s*_*com 6

这只适用于Xcode 6.1 beta 1.在6.1 beta 2中你必须写下:

var err: NSError? = NSError()
let s = String(contentsOfFile: fullPath, encoding: NSUTF8StringEncoding, error: &err)
Run Code Online (Sandbox Code Playgroud)

哪个fullPath是包含文件完整路径的字符串,NSUTF8StringEncoding是UTF8-Encoding的预定义常量.

您还可以NSMacOSRomanStringEncoding用于Mac文件或NSISOLatin1StringEncodingWindows文件.

s 是一个可选的String,您可以查看读取文件是否成功:

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


dbn*_*dbn 6

基于接受的答案的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
    }
}
Run Code Online (Sandbox Code Playgroud)


Ima*_*tit 6

使用Swift 5,您可以根据需要选择以下三种方式之一来解决问题。


#1 使用StringProtocolcomponents(separatedBy:)方法

Foundation提供String一个components(separatedBy:)带有以下声明的方法:

func components(separatedBy separator: CharacterSet) -> [String]
Run Code Online (Sandbox Code Playgroud)

返回一个数组,其中包含来自字符串的子字符串,这些子字符串已被给定集合中的字符划分。

下面的代码示例显示如何将components(separatedBy:)其参数设置为CharacterSet.newlines,以便将文本文件的内容逐行加载到数组中:

import Foundation

let path = Bundle.main.path(forResource: "Lorem Ipsum", ofType: "txt")!
let text = try! String(contentsOfFile: path, encoding: String.Encoding.utf8)
let lines = text.components(separatedBy: CharacterSet.newlines)

print(lines)
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用带有type参数的重载components(separatedBy:)String。下面的代码示例显示了如何使用它:

import Foundation

let path = Bundle.main.path(forResource: "Lorem Ipsum", ofType: "txt")!
let text = try! String(contentsOfFile: path, encoding: String.Encoding.utf8)
let lines = text.components(separatedBy: "\n")

print(lines)
Run Code Online (Sandbox Code Playgroud)

?? 然而,你应该更喜欢超载的components(separatedBy:),需要一个CharacterSet参数,并与值使用它CharacterSet.newlines,因为这将管理所有换行符(U + 000A〜U + 000D,U + 0085,U + 2028和U + 2029)。


#2。使用StringProtocolenumerateSubstrings(in:options:_:)方法

Foundation提供String一种称为的方法enumerateSubstrings(in:options:_:)。下面示出了如何使用代码示例enumerateSubstrings(in:options:_:)options的参数值集合来String.EnumerationOptions.byLines,以便通过线加载的文本文件行的内容到一个数组:

import Foundation

let path = Bundle.main.path(forResource: "Lorem Ipsum", ofType: "txt")!
let text = try! String(contentsOfFile: path, encoding: String.Encoding.utf8)

let range = text.startIndex ..< text.endIndex
var lines = [String]()
text.enumerateSubstrings(in: range, options: String.EnumerationOptions.byLines) {
    (substring, range, enclosingRange, stop) in
    guard let substring = substring else { return }
    lines.append(substring)
}

print(lines)
Run Code Online (Sandbox Code Playgroud)

#3。使用NLTokenizerenumerateTokens(in:using:)方法

NLTokenizer有一种称为的方法enumerateTokens(in:using:)enumerateTokens(in:using:)具有以下声明:

@nonobjc func enumerateTokens(in range: Range<String.Index>, using block: (Range<String.Index>, NLTokenizer.Attributes) -> Bool)
Run Code Online (Sandbox Code Playgroud)

在给定的字符串范围内枚举并为每个令牌调用指定的块。

下面的代码示例显示如何使用enumerateTokens(in:using:)以便将文本文件的内容逐行加载到数组中:

import Foundation
import NaturalLanguage

let path = Bundle.main.path(forResource: "Lorem Ipsum", ofType: "txt")!
let text = try! String(contentsOfFile: path, encoding: String.Encoding.utf8)

let tokenizer = NLTokenizer(unit: .paragraph)
tokenizer.setLanguage(.english)
tokenizer.string = text

var lines = [String]()
tokenizer.enumerateTokens(in: text.startIndex ..< text.endIndex) { (range, attributes) -> Bool in
    let line = String(text[range])
    lines.append(line)
    return true
}
print(lines)
Run Code Online (Sandbox Code Playgroud)


hip*_*san 5

如果您使用的是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
}
Run Code Online (Sandbox Code Playgroud)

  • 您忘记了“ var lineArray = fileContents.componantsSeparedByString(“ \ n”)` (2认同)