Анализ файла CSV и загрузка его в Core Data в Swift - PullRequest
0 голосов
/ 17 апреля 2019

Я работаю из предыдущей публикации в AppCode под названием «Основные данные: предварительная загрузка данных и использование существующей базы данных SQLite», расположенной здесь: https://www.appcoda.com/core-data-preload-sqlite-database/

В публикации Саймона Нг есть функция parseCSV, которая выполняетвесь тяжелый процесс сканирования через .csv и разбиения его на соответствующие строки, чтобы затем элементы каждой строки могли быть сохранены в соответствующем managedObjectContext в основных данных.

К сожалению, весь код выглядит написаннымв Swift 1.0 или Swift 2.0, и я не смог понять ошибки, которые я получаю при преобразовании его в Swift 4.

Я внес все изменения, предложенные Xcode в отношении «этого»был заменен на «тот», с последней ошибкой, сообщавшей мне, что «метки аргументов» (contentsOfURL :, encoding :, error :) «не соответствуют ни одной из доступных перегрузок», которые я не смог ни понять, ни исправить.

// https://www.appcoda.com/core-data-preload-sqlite-database/

    func parseCSV (contentsOfURL: NSURL, encoding: String.Encoding, error: NSErrorPointer) -> [(name:String, detail:String, price: String)]? {
        // Load the CSV file and parse it
        let delimiter = ","
        var items:[(name:String, detail:String, price: String)]?

        if let content = String(contentsOfURL: contentsOfURL, encoding: encoding, error: error) {
            items = []
            let lines:[String] = content.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) as [String]

            for line in lines {
                var values:[String] = []
                if line != "" {
                    // For a line with double quotes
                    // we use NSScanner to perform the parsing
                    if line.range(of: "\"") != nil {
                        var textToScan:String = line
                        var value:NSString?
                        var textScanner:Scanner = Scanner(string: textToScan)
                        while textScanner.string != "" {

                            if (textScanner.string as NSString).substring(to: 1) == "\"" {
                                textScanner.scanLocation += 1
                                textScanner.scanUpTo("\"", into: &value)
                                textScanner.scanLocation += 1
                            } else {
                                textScanner.scanUpTo(delimiter, into: &value)
                            }

                            // Store the value into the values array
                            values.append(value! as String)

                            // Retrieve the unscanned remainder of the string
                            if textScanner.scanLocation < textScanner.string.count {
                                textToScan = (textScanner.string as NSString).substring(from: textScanner.scanLocation + 1)
                            } else {
                                textToScan = ""
                            }
                            textScanner = Scanner(string: textToScan)
                        }

                        // For a line without double quotes, we can simply separate the string
                        // by using the delimiter (e.g. comma)
                    } else  {
                        values = line.components(separatedBy: delimiter)
                    }

                    // Put the values into the tuple and add it to the items array
                    let item = (name: values[0], detail: values[1], price: values[2])
                    items?.append(item)
                }
            }
        }

        return items
    }

5-я строка:

если let content = String (contentsOfURL: contentsOfURL, кодировка: кодировка, ошибка: ошибка) {

выдает следующую ошибку:

Метки аргумента '(contentsOfURL :, encoding :, error :)' не соответствуют ни одному доступномуперегрузки

Что выше моего понимания и уровня навыков.Я просто пытаюсь найти лучший способ импортирования файла CSV через запятую в основной объект данных.

Любая помощь будет принята с благодарностью.Оригинальный пример Саймона Нга кажется идеальным для того, чего я пытаюсь достичь.Просто он очень долго не обновлялся.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Прежде всего - вы все замечательные участники и чертовски быстро в вашей информации. Я хотел бы поблагодарить всех вас за быстрый ответ. Вот где я остановился на этой конкретной функции в последнем синтаксисе Swift 5.

func parseCSV (contentsOfURL: NSURL, encoding: String.Encoding, error: NSErrorPointer) -> [(name:String, detail:String, price: String)]? {
            // Load the CSV file and parse it
            let delimiter = ","
            var items:[(name:String, detail:String, price: String)]?

            //if let content = String(contentsOfURL: contentsOfURL, encoding: encoding, error: error) {
            if let content = try? String(contentsOf: contentsOfURL as URL, encoding: encoding) {
                items = []
                let lines:[String] = content.components(separatedBy: NSCharacterSet.newlines) as [String]

                for line in lines {
                    var values:[String] = []
                    if line != "" {
                        // For a line with double quotes
                        // we use NSScanner to perform the parsing
                        if line.range(of: "\"") != nil {
                            var textToScan:String = line
                            var value:NSString?
                            var textScanner:Scanner = Scanner(string: textToScan)
                            while textScanner.string != "" {

                                if (textScanner.string as NSString).substring(to: 1) == "\"" {
                                    textScanner.scanLocation += 1
                                    textScanner.scanUpTo("\"", into: &value)
                                    textScanner.scanLocation += 1
                                } else {
                                    textScanner.scanUpTo(delimiter, into: &value)
                                }

                                // Store the value into the values array
                                values.append(value! as String)

                                // Retrieve the unscanned remainder of the string
                                if textScanner.scanLocation < textScanner.string.count {
                                    textToScan = (textScanner.string as NSString).substring(from: textScanner.scanLocation + 1)
                                } else {
                                    textToScan = ""
                                }
                                textScanner = Scanner(string: textToScan)
                            }

                            // For a line without double quotes, we can simply separate the string
                            // by using the delimiter (e.g. comma)
                        } else  {
                            values = line.components(separatedBy: delimiter)
                        }

                        // Put the values into the tuple and add it to the items array
                        let item = (name: values[0], detail: values[1], price: values[2])
                        items?.append(item)
                    }
                }
            }

            return items
        }
0 голосов
/ 17 апреля 2019

Начиная с Swift 3, эта функция была изменена на String(contentsOf:, encoding:), поэтому вам просто нужно изменить метки аргументов в коде.

Стоит также отметить, что эта функция теперь будет выдавать, так что вы получитесправиться с этим.Вам не помешает взглянуть на эту страницу по обработке исключений в Swift.

...