Swift 5 читает текстовый файл в 2d массив Int / Doubles - PullRequest
0 голосов
/ 15 января 2020

Надеюсь, это не слишком простой вопрос для группы. Я учу себя Swift, но я действительно изо всех сил пытаюсь найти способ прочитать текстовый файл CSV, содержащий смесь значений Int и Double, в 2d массив, который находится внутри Class, где каждая строка в массиве представляет строку из входного файла. Я успешно загрузил 1d массив строк, каждый элемент соответствует строке текста в файле CSV. Однако я хочу сэкономить время, перейдя непосредственно от входного файла к двумерному массиву десятичных дробей.

1 Ответ

1 голос
/ 15 января 2020

Читайте в данных. Разделите текст на строки. Разделите строки на токены. Конвертируйте каждый токен в Int или, если он потерпит неудачу, в Double.

Я предполагаю, что вы знаете, как читать файлы, поэтому вот пример со строкой c CSV:

let text = """
 1,2,3.0
 4,5.0,6,z
 """

enum CustomError: Error {
  case notAnItOrADouble(String)
}

do {
  let numberRows = try text
    .split(separator: "\n")
    .map { line in
      try line.split(separator: ",").map { substring -> Any in
        let token = String(substring)
        guard let value: Any = Int(token) ?? Double(token) else {
          throw CustomError.notAnItOrADouble(token)
        }
        return value
      }
  }

  numberRows.forEach { row in
    row.forEach { number in
      print("\(number) is \(type(of: number))")
    }
  }
} catch (let error) {
  print(error)
}

Вывод:

1 is Int
2 is Int
3.0 is Double
4 is Int
5.0 is Double
6 is Int

Попробуйте ввести строку вместо целого или двойного, и вы увидите, что вы получите ошибку с первым непарсируемым токеном.

...