sport - ¿Una forma sencilla de leer archivos locales usando Swift?
swift apple (7)
Punta de ruta relativa:
En lugar de hacer esto:
NSString("~/file.txt").stringByExpandingTildeInPath
Puedes hacerlo:
"/(NSHomeDirectory())/file.txt"
Estoy tratando de aprender el nuevo lenguaje de programación Swift. Se ve genial, pero me cuesta trabajo hacer algo tan simple como leer el contenido de un archivo .txt local.
He intentado los pocos ejemplos que pude encontrar a través de Google, pero dan errores de compilación, como esta respuesta aquí: Leer y escribir datos de un archivo de texto el proyecto.
¿Por qué no es tan simple leer un archivo .txt con Swift como con Ruby, por ejemplo? ¿Y cómo podría leer el contenido de un archivo ubicado en ~/file.txt
?
Thnx
Esto funcionó para mí en Swift 2.1, XCode7 para obtener la ubicación e imprimir los contenidos de CSV. (Puedes crear un CSV simple en 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)
}
Esto funcionaría:
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
}
Tenga en cuenta que los data
pueden ser nulos, por lo que debe verificarlo.
EDITAR: No se olvide de desenvolver condicional - se ve mucho mejor;)
Puede encontrar esta herramienta útil no solo para leer archivos en Swift sino también para analizarla simultáneamente: https://github.com/shoumikhin/StreamScanner
Simplemente especifique la ruta del archivo y los delimitadores de datos como este (vea el archivo https://github.com/shoumikhin/StreamScanner para obtener más opciones):
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
}
}
Espero que esto ayude.
Si tienes una tilde en tu camino, puedes probar esto:
let location = "~/file.txt".stringByExpandingTildeInPath
let fileContent = NSString(contentsOfFile: location, encoding: NSUTF8StringEncoding, error: nil)
de lo contrario solo usa esto:
let location = "/Users/you/Desktop/test.txt"
let fileContent = NSString(contentsOfFile: location, encoding: NSUTF8StringEncoding, error: nil)
Esto te da una representación de cadena del archivo, que asumí es lo que quieres. Puede usar NSData(contentsOfFile: location)
para obtener una representación binaria, pero normalmente lo haría para, por ejemplo, archivos de música y no un archivo de texto.
Actualización: Con Xcode 7 y Swift 2 esto ya no funciona. Ahora puedes usar
let location = NSString(string:"~/file.txt").stringByExpandingTildeInPath
let fileContent = try? NSString(contentsOfFile: location, encoding: NSUTF8StringEncoding)
Usando la respuesta de Atomix, esto funcionará en Swift 4:
let location = NSString(string: "~/test.txt").expandingTildeInPath
let fileContent = try? NSString(contentsOfFile: location, encoding: String.Encoding.utf8.rawValue)
let file = "/Users/user/Documents/text.txt"
let path=URL(fileURLWithPath: file)
let text=try! String(contentsOf: path)