Замените указанную строку c в текстовом файле, используя массив Swift 5 Xcode iOS - PullRequest
0 голосов
/ 27 февраля 2020

Я конвертирую свое приложение из Java Android в Swift 5 iOS.

Кажется, я не могу найти ничего, что указывает на то, что я ищу.

По сути, у меня есть массив, в который я загружаю свой файл. Я использую это для доступа к указанной строке c, которую необходимо заменить. Единственное, что я не могу получить, это загрузить массив обратно в файл. (по сути, заменяя содержимое файла содержимым массива).

Я понимаю, что может потребоваться что-то сделать, чтобы преобразовать массив обратно, но не уверен, что это лучший метод.

func saveToFile(bagged: Int, iD: Int, dateBagged: Date){
        var arrayOfLines: [String]?

        let dateFormat = "dd-MMM-yyyy";
        let dateFormatter = DateFormatter();
        dateFormatter.dateFormat = dateFormat;

        let dateBaggedFormatted = dateFormatter.string(from: dateBagged)

        do {
            let file = "file.txt"

            if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {

                let fileURL = dir.appendingPathComponent(file)

                let data = try String(contentsOf:fileURL, encoding: String.Encoding.utf8)

                arrayOfLineStrings = data.components(separatedBy: "\r\n")


                for i in 0 ..< arrayOfLines!.count {
                    let attributes: [String] =  arrayOfLines![i].components(separatedBy: ",");
                    if (attributes[0] == String(iD)) {
                        let replaceLine: String = attributes[0] + "," +
                            attributes[1] + "," +
                            attributes[2] + "," +
                            attributes[3] + "," +
                            attributes[4] + "," +
                            attributes[5] + "," +
                            String(bagged) + "," +
                        dateBaggedFormatted;
                        arrayOfLines![i]=replaceLine
                        break;
                    }
                }

//                let contents = try! String(contentsOf: fileURL)
//                let lines = contents.split(separator:"\r\n")
//                
//                for line in lines {
//                    try line.write(to: fileURL, atomically: false, encoding: .utf8)
//                }
            }
        }
        catch {/* error handling here */}
    }

Я достиг этого в Java с:

Files.write(Paths.get(outFile.getAbsolutePath()), fileContent, StandardCharsets.UTF_8); (I understand that will probably not help at all...)

Если требуется дополнительная информация. Дайте мне знать

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Как вам сказали, способ записать строку в файл:

try? myString.write(to: fileURL, atomically: true, encoding: .utf8)

Так что, если arrayOfLines - это [String], вы можете сказать

try? arrayOfLines.joined(separator: "\n").write(to:...)
0 голосов
/ 27 февраля 2020

Я рекомендую использовать более эффективный способ найти строку, начинающуюся с iD plus comma. И согласно коду 7-е поле - bagged, а 8-е - baggedDate.

. Так что запишите изменения непосредственно в массив attributes, присоединитесь к нему, переназначьте строку в lines массив по указанному индексу и объединить массив lines с разделителем CRLF. Наконец, записать строку обратно на диск

func saveToFile(bagged: Int, iD: Int, dateBagged: Date){
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd-MMM-yyyy"

    let dateBaggedFormatted = dateFormatter.string(from: dateBagged)

    do {
        let file = "file.txt"

        let dir = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

        let fileURL = dir.appendingPathComponent(file)

        let text = try String(contentsOf: fileURL, encoding: .utf8)
        var lines = text.components(separatedBy: .newlines)
        if let index = lines.firstIndex(where: {$0.hasPrefix("\(iD),")}) {
            var attributes = lines[index].components(separatedBy: ",")
            attributes[6] = String(bagged)
            attributes[7] = dateBaggedFormatted
            lines[index] = attributes.joined(separator: ",")
            let result = lines.joined(separator: "\r\n")
            try result.write(to: fileURL, atomically: true, encoding: .utf8)
        }
    } catch {print(error)}
}
...