Как мне разбить файл .txt на многомерный массив или словарь в Swift? - PullRequest
0 голосов
/ 16 февраля 2020

Тело моего txt-файла, которое мне нужно проанализировать в следующем формате:

Name: LittleX
Package: com.ioscreatix.littlex
Description: iPhone X features for Non-X devices on iOS 11, and iPad Dock and PiP for All iOS 11 Devices on iOS 11

Name: InteliX
Package: com.ioscreatix.intelix
Description: Grouped Notifications for iOS 11

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

Это код, который у меня есть до сих пор:

var unfilteredPackagesArray = [String]()
    var secondFilteredPackagesArray = [String]()
    var finalFilteredPackagesArray = [String]()

if let startWordsURL = Bundle.main.url(forResource: "Packages", withExtension: "") {
            if let startWords = try? String(contentsOf: startWordsURL) {
                unfilteredPackagesArray = startWords.components(separatedBy: "\n\n")

                print(unfilteredPackagesArray)
                secondFilteredPackagesArray = startWords.components(separatedBy: "\n")


                finalFilteredPackagesArray = startWords.components(separatedBy: ":")

                print(secondFilteredPackagesArray)

Каков наилучший способ сделать это? Создать объекты Package и создать их массив?

1 Ответ

0 голосов
/ 16 февраля 2020

Да, go впереди!

Да, я думаю, вы должны создать Package структуру и затем сгенерировать array of Package(s).

Вот код.

1. Определите структуру пакета 100

struct Package {
    let name: String
    let package: String
    let description: String
}

2. Загрузите файл 101

guard
    let url = Bundle.main.url(forResource: "Packages", withExtension: "txt"),
    let content = try? String(contentsOf: url)
else { fatalError() }

3. Извлеките строки 101

let lines = content
    .components(separatedBy: CharacterSet.newlines)
    .filter { !$0.isEmpty }
    .compactMap { $0.components(separatedBy: ": ").last }

4. Извлеките 3 массива ?

let nameLines = lines.enumerated().filter { $0.offset % 3 == 0 }.map { $0.element }
let packageLines = lines.enumerated().filter { $0.offset % 3 == 1 }.map { $0.element }
let descriptionLines = lines.enumerated().filter { $0.offset % 3 == 2 }.map { $0.element }

5. Создайте массив пакетов (ы) ???

let packages = zip(nameLines, zip(packageLines, descriptionLines))
    .map { (name: $0, package: $1.0, description: $1.1) }
    .map (Package.init)

6. Тест ?

print(packages)

[
    Package(name: "LittleX",
            package: "com.ioscreatix.littlex",
            description: "iPhone X features for Non-X devices on iOS 11, and iPad Dock and PiP for All iOS 11 Devices on iOS 11"
    ),
    Package(name: "InteliX",
            package: "com.ioscreatix.intelix",
            description: "Grouped Notifications for iOS 11"
    )
]
...