Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift 4+;中解析此GTFS字符串;_Swift_Csv - Fatal编程技术网

如何在Swift 4+;中解析此GTFS字符串;

如何在Swift 4+;中解析此GTFS字符串;,swift,csv,Swift,Csv,这是以CSV格式导入的部分GTFS字符串: 83,51001,"Ballston Metro G, Fairfax Dr, EB @ N Stafford, NS",38.882092,-77.110876,"http://www.arlingtontransit.com/pages/rider-tools/realtime/?Stop=A51001#realTimeResultsContainer" 请注意地址中的逗号。有什么好方法可以避免在这些点拆分字符串,即不在引号之间拆分 到目前

这是以CSV格式导入的部分GTFS字符串:

   83,51001,"Ballston Metro G, Fairfax Dr, EB @ N Stafford, NS",38.882092,-77.110876,"http://www.arlingtontransit.com/pages/rider-tools/realtime/?Stop=A51001#realTimeResultsContainer"
请注意地址中的逗号。有什么好方法可以避免在这些点拆分字符串,即不在引号之间拆分

到目前为止,我一直在使用此代码:

let data = try Data(contentsOf: fileURL as URL)
                    let content = String(data: data, encoding: .utf8)
                    let parsedCSV = content!.components(separatedBy: "\n").map{ $0.components(separatedBy: ",")
除了带引号的字符串外,逗号分隔是我所需要的

非常感谢

一个使用正则表达式的简单示例

let csvText = """
83,51001,"Ballston Metro G, Fairfax Dr, EB @ N Stafford, NS",38.882092,-77.110876,"http://www.arlingtontransit.com/pages/rider-tools/realtime/?Stop=A51001#realTimeResultsContainer"
"""

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

var parsedCSV: [String] = []
regex.enumerateMatches(in: csvText, options: .anchored, range: NSRange(0..<csvText.utf16.count)) {match, flags, stop in
    guard let match = match else {fatalError()}
    if match.range(at: 1).location != NSNotFound {
        //matching double-quoted item
        let field = csvText[Range(match.range(at: 1), in: csvText)!].replacingOccurrences(of: "\"\"", with: "\"")
        parsedCSV.append(field)
    } else if match.range(at: 2).location != NSNotFound {
        let field = csvText[Range(match.range(at: 2), in: csvText)!].trimmingCharacters(in: .whitespaces)
        parsedCSV.append(field)
    }
    let separator = csvText[Range(match.range(at: 3), in: csvText)!]
    switch separator {
    case "": //end of line
        stop.pointee = true
    default: //comma
        break
    }
}
print(parsedCSV) //->["83", "51001", "Ballston Metro G, Fairfax Dr, EB @ N Stafford, NS", "38.882092", "-77.110876", "http://www.arlingtontransit.com/pages/rider-tools/realtime/?Stop=A51001#realTimeResultsContainer"]
让csvText=“”
8351001,“新南威尔士州斯塔福德北区费尔法克斯特区鲍尔斯顿地铁G号EB@N”,38.882092,-77.110876http://www.arlingtontransit.com/pages/rider-tools/realtime/?Stop=A51001#realTimeResultsContainer"
"""
let pattern=“(?:\”((?:[^\”]|\“\”*)\“([^,\”\\n]*)[\t]*(,|$)”
让regex=试试!NSRegularExpression(模式:模式)
var parsedCSV:[字符串]=[]

regex.enumerateMatches(在:csvText,选项:。锚定,范围:NSRange(0..中)我最终使用了NSScanner。速度很快

for i in 1..<objectArray.count - 1 {
                        autoreleasepool(invoking: { () -> () in
                            let item: [String] = objectArray[i]

                            for j in 0..<item.count {
                                let tempString = item[j]
                                let scanner = Scanner(string: tempString)

                                var bitBucket: NSString!  
                                var stop_id, stop_code, stop_name, stop_lat, stop_lon: NSString?

                                scanner.scanUpTo(",", into: &stop_id)

                                scanner.scanLocation = scanner.scanLocation + 1
                                scanner.scanUpTo(",", into: &stop_code)

                                scanner.scanLocation = scanner.scanLocation + 2
                                scanner.scanUpTo("\"", into: &stop_name)

                                scanner.scanLocation = scanner.scanLocation + 2
                                scanner.scanUpTo(",", into: &stop_lat)

                                scanner.scanLocation = scanner.scanLocation + 1
                                scanner.scanUpTo(",", into: &stop_lon)

                                scanner.scanUpTo("\n", into: &bitBucket)

                                let newResource = NSEntityDescription.insertNewObject(forEntityName: busStopEntity, into: context)
                                newResource.setValue(stop_id, forKey: "stop_id")
                                newResource.setValue(stop_name, forKey: "stop_name")
                                newResource.setValue(stop_code, forKey: "stop_code")

                                let tempString1 = String(stop_lat!)
                                let myFloat1 = (tempString1 as NSString).doubleValue
                                newResource.setValue(myFloat1, forKey: "stop_lat")

                                let tempString2 = String(stop_lon!)
                                let myFloat2 = (tempString2 as NSString).doubleValue
                                newResource.setValue(myFloat2, forKey: "stop_lon")                             
                                newResource.setValue(date, forKey: "update_date")
                            }

                            do {
                                try context.save()
                            } catch let error as NSError  {
                                print("Error While Saving Data: \(error.userInfo)")
                            }
                        }
用于1中的i..()中
let项:[String]=objectArray[i]

对于0中的j..有一些很好的Swift CSV解析库。最好使用一个。正确解析一般CSV比大多数人意识到的要复杂得多。Crap.typo。我编辑了question@rmaddy我看了github就是为了这个。你有什么建议吗?谢谢