Я написал файл CSV, содержащий набор элементов по строкам. Я использовал такой класс для создания файла CSV, вот код для создания файла:
class SymptomData: NSObject {
var symptom: String = ""
var severity: String = ""
var comment: String = ""
var timestamp: String = ""
}
var symptom_data = [SymptomData]()
var symptomData: SymptomData!
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!)
}
createCSV()
}
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)
}
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")
}
}
Файл CSV выглядит так:
Теперь я хотел бы прочитать файл и добавить каждую строку в представление таблицы. В идеале я хотел бы иметь простой доступ к каждой строке, например:
row0.symptom = symptomData[0].symptom
row0.comment = symptomData[0].comment
et c. Но я не уверен, как разобрать данные обратно в мой класс, я бы тоже хотел, чтобы это было так, чтобы я мог переупорядочить их по метке времени.
Вот как я анализирую данные до сих пор:
func readCSV() {
guard let logFile = logFile else {
return
}
if FileManager.default.fileExists(atPath: logFile.path) {
if let fileHandle = try? FileHandle(forWritingTo: logFile) {
fileHandle.seekToEndOfFile()
fileHandle.readDataToEndOfFile()
fileHandle.closeFile()
print("symptom_data exists")
do {
let file = try String(contentsOf: logFile)
let rows = file.components(separatedBy: .newlines)
for row in rows {
let fields = row.replacingOccurrences(of: "\"", with: "").components(separatedBy: ",")
print(fields)
}
} catch {
print(error)
}
}
} else {
print("No symptom_data File.")
}
}
Это напечатает это:
["Symptom", "Severity", "Comment", "Time"]
["Anxiety", "Severe", "test", "1592333677"]
["Anxiety", "Mild", "test2", "1592333686"]
["Fatigue", "Mild", "test3", "1592160840"]
["Electric shock sensations (Brain Zaps)", "Mild", "", "1592333820"]
["Anxiety", "Severe", "", "1592336985"]
Как я могу поместить каждую строку в класс или структуру, чтобы я мог легко добавить ее в представление таблицы, или есть лучший способ сделать это?