簡體   English   中英

如何使用Swift逐行將文本文件加載到數組中?

[英]How do I load a text file line by line into an array with 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.1 beta 1.在6.1 beta 2中你必須寫下:

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

其中fullPath是包含文件完整路徑的字符串, NSUTF8StringEncoding是UTF8-Encoding的預定義常量。

您還可以將NSMacOSRomanStringEncoding用於Mac文件或NSISOLatin1StringEncoding用於Windows文件。

s是一個可選的String,您可以查看讀取文件是否成功:

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

基於接受的答案的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
    }
}

如果您使用的是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 5,根據您的需要,您可以選擇以下3種方法之一來解決您的問題。


#1。 使用StringProtocolcomponents(separatedBy:)方法

FoundationString提供了一個名為components(separatedBy:)的方法,其聲明如下:

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

返回一個數組,其中包含已由給定集中的字符除以的字符串中的子字符串。

下面的代碼示例顯示了如何使用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)

作為替代方案,您可以使用帶有String類型參數的components(separatedBy:)重載components(separatedBy:) 下面的代碼示例顯示了如何使用它:

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)

⚠️你應該更喜歡重載components(separatedBy:) ,它接受一個CharacterSet參數並將其與值CharacterSet.newlines一起使用,因為這將管理所有新行字符(U + 000A~U + 000D,U + 0085,U + 2028年,和U + 2029)。


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

FoundationString提供了一個名為enumerateSubstrings(in:options:_:)的方法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)

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

NLTokenizer有一個名為enumerateTokens(in:using:)的方法enumerateTokens(in:using:) enumerateTokens(in:using:)具有以下聲明:

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

枚舉字符串的給定范圍,並為每個標記調用指定的塊。

下面的代碼示例顯示了如何使用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)

我的簡單編碼

 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.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 []
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM