Простой способ чтения локального файла с помощью Swift?
Я пытаюсь изучить новый язык программирования Swift. Это выглядит великолепно, но мне сложно делать что-то так же просто, как читать содержимое локального файла .txt.
Я попробовал несколько примеров, которые я смог найти через Google, но они дают ошибки компиляции, такие как этот ответ здесь: Чтение и запись данных из текстового файла
Если я немного подкорректирую код, он работает, но может читать только из специального места в проекте.
Почему не так просто читать .txt файл с Swift, как это, например, с Ruby? И как я могу прочитать содержимое файла, расположенного в ~/file.txt
?
Thnx
Ответы
Ответ 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)