Swift 斯威夫特:使用字符串

Swift 斯威夫特:使用字符串,swift,string,Swift,String,我们有一个简单的字符串: let str = "\"abc\", \"def\",\"ghi\" , 123.4, 567, \"qwe,rty\"" 如果我们这样做: let parsedCSV = str .components(separatedBy: .newlines) .filter { !$0.isEmpty } .map { $0.components(separatedBy: ",") }

我们有一个简单的字符串:

let str = "\"abc\", \"def\",\"ghi\" , 123.4, 567, \"qwe,rty\""
如果我们这样做:

let parsedCSV = str
            .components(separatedBy: .newlines)
            .filter { !$0.isEmpty }
            .map { $0.components(separatedBy: ",") }
            .map { $0.map { $0.trimmingCharacters(in: .whitespaces) } }
print(parsedCSV)
我们得到这个:

[["\"abc\"", "\"def\"", "\"ghi\"", "123.4", "567", "\"qwe", "rty\""]]

有没有一个简单的解决方案(使用函数式编程)不分割最后一个元素“qwe,rty\”,因为我们知道这是一个整体?

这是一个黑客,它适用于这种情况。。。。对于复杂的问题不是很简单的解决方案

let str = "\"abc\", \"def\",\"ghi\" , 123.4, 567, \"qwe,rty\""

let parsedCSV = str
    .components(separatedBy: .newlines)
    .filter { !$0.isEmpty }
    .map { $0.components(separatedBy: ",") }
    .map { $0.map { $0.trimmingCharacters(in: .whitespaces) } }.reduce([]) { (result, items) -> [String] in
        var goodItems = items.filter{ $0.components(separatedBy: "\"").count == 3 ||  $0.components(separatedBy: "\"").count == 1}
        let arr = items.filter{ $0.components(separatedBy: "\"").count == 2}
        var join:[String] = []
        for x in 0..<arr.count {
            let j = x + 1
            if j < arr.count {
                join = [arr[x] + "," + arr[j]]
            }
        }
        goodItems.append(contentsOf: join)
        return goodItems
}


print(parsedCSV)
let str=“\'abc\”、\'def\”、\'ghi\”、123.4567、\'qwe、rty\”
让parsedCSV=str
.components(分隔符:。换行符)
.filter{!$0.isEmpty}
.map{$0.components(以“,”分隔)
.map{$0.map{$0.trimmingCharacters(in:.空格)}}.reduce([]){(结果,项)->中的[String]
var goodItems=items.filter{$0.components(分隔符:\).count==3 | | |$0.components(分隔符:\).count==1}
设arr=items.filter{$0.components(以“\”分隔)。count==2}
var join:[字符串]=[]
对于0中的x…我已经做到了

let str = "_, * ,, \"abc\",  000, def, ghi , 123.4,,  567,  \"qwe,rty,eur\", jkl"
    let separator = ","
    let parsedCSV = str
        .components(separatedBy: .newlines)
        .filter { !$0.isEmpty }
        .map { $0.components(separatedBy: separator).map { $0.trimmingCharacters(in: .whitespaces) } }
        .reduce([]) { (result, items) -> [String] in
            var result: [String] = []
            for item in items {
                guard let last = result.last, last.components(separatedBy: "\"").count % 2 == 0 else {
                    result.append(item)
                    continue
                }
                result.removeLast()
                let lastModified = record + separator + item
                result.append(lastModified)

            }
            return result
    }.map { $0.trimmingCharacters(in: CharacterSet(charactersIn: "\"")) }
    print(parsedCSV)
[“_u”,“*”,“abc”,“000”,“def”,“ghi”,“123.4”,“567”, “qwe、rty、eur”、“jkl”]


如果您不介意使用正则表达式,可以编写如下内容:

let str = "_, * ,, \"abc\",  000, def, ghi , 123.4,,  567,  \"qwe,rty,eur\", jkl"

let pattern = "((?:[^\",]|\"[^\"]*\")*)(?:,|$)"
let regex = try! NSRegularExpression(pattern: pattern)

let parsedCSV = regex.matches(in: str, options: .anchored, range: NSRange(0..<str.utf16.count))
    .map {$0.range(at: 1)}
    .filter {$0.location != NSNotFound && $0.location < str.utf16.count}
    .map {String(str[Range<String.Index>($0, in: str)!]).trimmingCharacters(in: .whitespaces)}
    .map {$0.trimmingCharacters(in: CharacterSet(charactersIn: "\""))}
print(parsedCSV) //->["_", "*", "", "abc", "000", "def", "ghi", "123.4", "", "567", "qwe,rty,eur", "jkl"]
let str=“\uw,*,\“abc\”,000,def,ghi,123.4,,567,\“qwe,rty,eur\”,jkl”
let pattern=“((?:[^\”,]|\“[^\”]*”*)(?:,|$)”
让regex=try!NSRegularExpression(模式:模式)

让parsedCSV=regex.matches(in:str,options:.archored,range:NSRange(0.)这不是那么简单。您需要上下文来处理
一般来说,逐列循环比较容易。我建议使用库,例如,非平凡CSV数据的处理比大多数人意识到的要复杂得多。它不能用简单的字符串操作来解析。使用(或写入)正确的CSV解析库。SwiftCSV不受swift 4支持…是的,它应该是这样的!但它仍然不是完美的,因为如果我们在str的末尾添加一些内容,输出字符串的顺序将改变。