Подтвердить что ты не робот

Как построчно загрузить текстовый файл в массив с помощью Swift?

Как построчно загрузить текстовый файл в array с помощью swift?

4b9b3361

Ответ 1

Что-то по строкам:

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

Этот подход предполагает, что указанный файл находится в вашем приложении.

Ответ 2

Это работает только до 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.

Вы также можете использовать NSMacOSRomanStringEncoding для файлов Mac или NSISOLatin1StringEncoding для файлов Windows.

s является необязательной строкой, и вы можете посмотреть, было ли чтение файла успешным:

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

Ответ 3

версия 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
    }
}

Ответ 4

Если вы находитесь в 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
}

Ответ 5

Мое простое кодирование для вас

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

Ответ 6

С Swift 5, в соответствии с вашими потребностями, вы можете выбрать один из 3 следующих способов, чтобы решить вашу проблему.


# 1. Использование components(separatedBy:) StringProtocol components(separatedBy:) метод StringProtocol components(separatedBy:)

Foundation предоставляет String метод с именем 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)

В качестве альтернативы вы можете использовать перегрузку 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)

However Однако вы должны предпочесть перегрузку components(separatedBy:) separaBy components(separatedBy:) которая принимает параметр CharacterSet и использует его со значением CharacterSet.newlines поскольку это будет управлять всеми символами новой строки (U + 000A ~ U + 000D, U + 0085, U +2028 и U + 2029).


# 2. Использование StringProtocol enumerateSubstrings(in:options:_:) методе enumerateSubstrings(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)

# 3. Использование NLTokenizer enumerateTokens(in:using:) методе enumerateTokens(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)

Перечисляет в заданном диапазоне строки и вызывает указанный блок для каждого токена.

Пример кода ниже показывает, как использовать 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)

Ответ 7

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
}

Ответ 8

Для меня это работает следующим образом:

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

Ответ 9

Если вы хотите прочитать csv файл с числовыми данными. (на основе ответа Цезара)

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