Как мне написать новую строку CSV-файла в каталоге документов в Swift 5? - PullRequest
0 голосов
/ 16 июня 2020

У меня есть функция, в которой я хочу создать файл CSV, если он не существует, и добавить в него данные. Если он существует, я хочу добавлять эти данные как новую строку каждый раз, когда она вызывается.

Вот мой текущий код, на данный момент он просто перезаписывает весь файл каждый раз:

func writeTrackedSymptomValues(symptom: String, comment: String, time: String, timestamp: String) {
    symptomData = SymptomData()
    for _ in 0..<5 {
        symptomData.symptom = symptom
        symptomData.severity = self.severity
        symptomData.comment = comment
        symptomData.timestamp = timestamp
        symptom_data.append(symptomData!)
    }

    creatCSV()
}

func creatCSV() -> Void {
        let fileName = "symptom_data.csv"

        let path = self.getDocumentsDirectory().appendingPathComponent(fileName)
        var csvText = "Symptom,Severity,Comment,Time\n"


            let newLine = "\(symptomData.symptom),\(symptomData.severity),\(symptomData.comment),\(symptomData.timestamp)\n"
            csvText.append(newLine)


        do {
            try csvText.write(to: path, atomically: true, encoding: String.Encoding.utf8)
        } catch {
            print("Failed to create file")
            print("\(error)")
        }
        print(path ?? "not found")
}

func getDocumentsDirectory() -> URL {
    // find all possible documents directories for this user
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)

    // just send back the first one, which ought to be the only one
    return paths[0]
}

Как я могу каждый раз добавлять новую строку вместо этого? Swift

1 Ответ

0 голосов
/ 16 июня 2020

Решено с использованием совета Уоррена:

    var logFile: URL? {
        guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return nil }
        let fileName = "symptom_data.csv"
        return documentsDirectory.appendingPathComponent(fileName)
    }

Эта функция проверяет, существует ли файл, если нет, он делает его так, как в моем исходном вопросе, и если да, то использует FileManager для добавления новой строки.

    func createCSV() {
        guard let logFile = logFile else {
            return
        }

        guard let data = ("\(symptomData.symptom),\(symptomData.severity),\(symptomData.comment),\(symptomData.timestamp)\n").data(using: String.Encoding.utf8) else { return }

        if FileManager.default.fileExists(atPath: logFile.path) {
            if let fileHandle = try? FileHandle(forWritingTo: logFile) {
                fileHandle.seekToEndOfFile()
                fileHandle.write(data)
                fileHandle.closeFile()
            }
        } else {
            var csvText = "Symptom,Severity,Comment,Time\n"


                 let newLine = "\(symptomData.symptom),\(symptomData.severity),\(symptomData.comment),\(symptomData.timestamp)\n"
                 csvText.append(newLine)


             do {
                try csvText.write(to: logFile, atomically: true, encoding: String.Encoding.utf8)

             } catch {
                 print("Failed to create file")
                 print("\(error)")
             }
             print(logFile ?? "not found")
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...