Как построчно загрузить текстовый файл в array
с помощью swift
?
Как построчно загрузить текстовый файл в массив с помощью Swift?
Ответ 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 []
}
}