Ios SwiftCsv解析器支持双引号

Ios SwiftCsv解析器支持双引号,ios,iphone,csv,swift,Ios,Iphone,Csv,Swift,Im使用Swiftcsv库解析CSV文件。 如何忽略双引号内字符串的逗号分隔符,例如Abcd,转到Apple? 在这里,解析器将Abcd作为一个值,并将其作为另一个值转到Apple 代码: func parseRows(fromLines lines: [String]) -> [Dictionary<String, String>] { var rows: [Dictionary<String, String>] = [] for (lineN

Im使用Swiftcsv库解析CSV文件。 如何忽略双引号内字符串的逗号分隔符,例如Abcd,转到Apple? 在这里,解析器将Abcd作为一个值,并将其作为另一个值转到Apple

代码:

 func parseRows(fromLines lines: [String]) -> [Dictionary<String, String>] {
    var rows: [Dictionary<String, String>] = []

    for (lineNumber, line) in enumerate(lines) {
        if lineNumber == 0 {
            continue
        }

        var row = Dictionary<String, String>()
        let values = line.componentsSeparatedByCharactersInSet(self.delimiter)
        for (index, header) in enumerate(self.headers) {
            let value = values[index]
            row[header] = value
        }
        rows.append(row)
    }

    return rows
}

如何更改line.componentsSeparatedByCharactersInSetself.delimiter以忽略双引号中的逗号?

我不知道您是否仍在寻找解决方案,但我刚刚想出了一个快速方法,因为这是我刚刚遇到的问题

这段代码不是完全可靠的,因为我只在一个次要项目中使用它,所以如果你想处理更多的情况,你可能需要做一些更改

    func parseRows(fromLines lines: [String]) -> [Dictionary<String, String>] {
    var rows: [Dictionary<String, String>] = []

    for (lineNumber, line) in enumerate(lines) {
        if lineNumber == 0 {
            continue
        }

        var row = Dictionary<String, String>()

        // escape commas in the string when it is surrounded by quotes 

        let convertedLine = NSString(string: line) // have to convert string to NSString because string does not have all NSString API

        var escapedLine = line

        var searchRange = NSMakeRange(1,convertedLine.length)
        var foundRange:NSRange

        if NSString(string: line).containsString("\"")
        {
            while (searchRange.location < convertedLine.length) {
                searchRange.length = convertedLine.length-searchRange.location
                foundRange = convertedLine.rangeOfString("\"", options: nil, range: searchRange)
                if (foundRange.location != NSNotFound) {
                    // found a quotation mark
                    searchRange.location = foundRange.location+foundRange.length
                    let movieTitle = convertedLine.substringToIndex(foundRange.location)

                    escapedLine = convertedLine.stringByReplacingOccurrencesOfString(",", withString: "&c", options: nil, range: NSMakeRange(0,foundRange.location))
                } else {
                    // no more substring to find
                    break
                }
            }
        }

        var values = escapedLine.componentsSeparatedByCharactersInSet(self.delimiter)

        for (index, header) in enumerate(self.headers) {
            var value = values[index]

            //reinsert commas if they were escaped and get rid of quotation marks
            value = value.stringByReplacingOccurrencesOfString("\"", withString: "")
            value = value.stringByReplacingOccurrencesOfString("&c", withString: ",")

            row[header] = value
        }
        rows.append(row)
    }

    return rows
}
用这个代替

有同样的问题。我花了大约一个小时才发现问题在于SwiftCSV不起作用

CSV文件中的文本在引号内,因此CSV中的逗号和换行符不会使解析器出错。我查看了SwiftCSV源代码,但没有对它的支持,这意味着任何逗号或换行符都会破坏解析


您可以修补SwiftCSV,或者直接使用我上面链接的CSwiftV。

我会检查它,谢谢,我的CSV字段值之一是华盛顿特区,它不起作用。我得到这个错误:致命错误:数组索引超出范围。