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

Простой способ чтения локального файла с помощью Swift?

Я пытаюсь изучить новый язык программирования Swift. Это выглядит великолепно, но мне сложно делать что-то так же просто, как читать содержимое локального файла .txt.

Я попробовал несколько примеров, которые я смог найти через Google, но они дают ошибки компиляции, такие как этот ответ здесь: Чтение и запись данных из текстового файла Если я немного подкорректирую код, он работает, но может читать только из специального места в проекте.

Почему не так просто читать .txt файл с Swift, как это, например, с Ruby? И как я могу прочитать содержимое файла, расположенного в ~/file.txt?

Thnx

4b9b3361

Ответ 1

Если у вас есть тильда на вашем пути, вы можете попробовать следующее:

let location = "~/file.txt".stringByExpandingTildeInPath
let fileContent = NSString(contentsOfFile: location, encoding: NSUTF8StringEncoding, error: nil)

иначе просто используйте это:

let location = "/Users/you/Desktop/test.txt"
let fileContent = NSString(contentsOfFile: location, encoding: NSUTF8StringEncoding, error: nil)

Это дает вам строковое представление файла, который, как я предполагал, является тем, что вы хотите. Вы можете использовать NSData(contentsOfFile: location) для получения двоичного представления, но вы обычно делаете это, например, для музыкальных файлов, а не для текстового файла.


Обновление: с Xcode 7 и Swift 2 это больше не работает. Теперь вы можете использовать

let location = NSString(string:"~/file.txt").stringByExpandingTildeInPath
let fileContent = try? NSString(contentsOfFile: location, encoding: NSUTF8StringEncoding)

Ответ 2

Это будет работать:

let path = "~/file.txt"
let expandedPath = path.stringByExpandingTildeInPath
let data: NSData? = NSData(contentsOfFile: expandedPath)

if let fileData = data {
    let content = NSString(data: fileData, encoding:NSUTF8StringEncoding) as String
}

Обратите внимание, что data может быть nil, поэтому вы должны это проверить.

EDIT: Не забудьте условное разворачивание - выглядит намного приятнее;)

Ответ 3

Относительный путь:

Вместо этого:
NSString("~/file.txt").stringByExpandingTildeInPath

Вы можете сделать это:
  "\(NSHomeDirectory())/file.txt"

Ответ 4

    let file = "/Users/user/Documents/text.txt"
    let path=URL(fileURLWithPath: file)
    let text=try! String(contentsOf: path)

Ответ 5

Вы можете найти этот инструмент полезным не только для чтения из файла в Swift, но и для его одновременного анализа: https://github.com/shoumikhin/StreamScanner

Просто укажите путь к файлу и разделители данных (см. readme для получения дополнительных опций):

import StreamScanner

if let input = NSFileHandle(forReadingAtPath: "/file/path")
{
     let scanner = StreamScanner(source: input, delimiters: NSCharacterSet(charactersInString: ":\n"))  //separate data by colons and newlines

     while let field: String = scanner.read()
     {
        //use field
     }
}

Надеюсь, это поможет.

Ответ 6

Это работало для меня в Swift 2.1, XCode7, чтобы получить местоположение и распечатать содержимое CSV. (вы можете создать простой CSV в Text Wrangler)

override func viewDidLoad() {
    super.viewDidLoad()

    let location = NSString(string:"/Users/*Myusername*/Documents/myCSVfile.csv")
    let fileContent = try? NSString(contentsOfFile: location as String, encoding: NSUTF8StringEncoding)
    print(fileContent)

}

Ответ 7

Используя ответ Atomix, это будет работать в Swift 4:

let location = NSString(string: "~/test.txt").expandingTildeInPath    
let fileContent = try? NSString(contentsOfFile: location, encoding: String.Encoding.utf8.rawValue)