Frage Wie lade ich eine Textdatei mit Swift in ein Array?


Wie lade ich eine Textdatei in ein array mit swift?


34
2018-06-04 14:26


Ursprung


Antworten:


Etwas in der Art von:

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
    }
}

Bei diesem Ansatz wird davon ausgegangen, dass sich die fragliche Datei in Ihrem App-Bundle befindet.


58
2018-06-04 14:35



Dies funktioniert nur bis Xcode 6.1 beta 1. In 6.1 beta 2 musst du folgendes schreiben:

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

Woher fullPath ist eine Zeichenfolge, die den vollständigen Pfad zur Datei und enthält NSUTF8StringEncoding ist eine vordefinierte Konstante für UTF8-Encoding.

Sie können auch verwenden NSMacOSRomanStringEncoding für Mac-Dateien oder NSISOLatin1StringEncoding für Windows-Dateien.

s ist ein optionaler String und Sie können schauen, ob das Lesen der Datei erfolgreich war:

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

6
2017-09-25 09:08



Wenn Sie in Swift 2.0 sind, sollten Sie Folgendes verwenden:

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
}

5
2018-06-09 14:27



Swift 3 Version basierend auf der angenommenen Antwort:

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
    }
}

5
2017-10-27 04:49



Meine einfache Codierung für dich

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

2
2017-08-09 02:39



Mit Swift 3, Foundation  String hat ein init(contentsOfFile:encoding:)  Initialisierer. init(contentsOfFile:encoding:) hat folgende Erklärung:

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

Erzeugt eine Zeichenfolge, die durch das Lesen von Daten aus der Datei an einem bestimmten Pfad erstellt wird, der mit einer bestimmten Codierung interpretiert wird.


Mit Swift 3, Foundation  String hat auch eine Methode namens components(separatedBy:). components(separatedBy:) hat folgende Erklärung:

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

Gibt ein Array zurück, das Teilstrings von der String Diese wurden durch ein bestimmtes Trennzeichen getrennt.


deshalb, die UIViewController Die folgende Beispielimplementierung zeigt, wie der Inhalt einer Textdatei in ein Array geladen wird:

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)
    }

}

2
2018-02-26 15:43



Schnelles 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
}

1
2017-08-14 09:38



Für mich funktioniert wie folgt:

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

0
2018-06-28 07:42



Wenn Sie eine CSV-Datei mit numerischen Daten lesen möchten. (basierend auf Cezars Antwort)

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

0
2017-09-02 10:44