如何解析我的CSV文件?

时间:2016-09-19 20:42:42

标签: ios swift csv

这是我第一次尝试解析CSV文件;我之前只使用过JSON文件。我知道CSV是逗号分隔值的缩写。我有一个CSV文件,其中列出了美国各州的州际高速公路上的所有休息站点;但是,此文件中的值不用逗号分隔。我想知道是否有人可以帮我解析这个文件到对象?我的目标是对此文件进行排序,并将属于特定状态的每个州际对象放入相应的对象(状态)中。例如,5号州际公路(I-5)横跨美国的整个西海岸,从加拿大边境开始,经过华盛顿,俄勒冈和加利福尼亚,一直到墨西哥边境。因此,I-5应该在"华盛顿","俄勒冈"和"加利福尼亚"对象。下面的代码是我尝试删除所有标点符号并用逗号替换它们以获取常规CSV文件。顺便说一句,在我创建了常规CSV文件之后,我尝试按照上面的解释进行排序。这是我的代码:

var californiaInterstates: [InterstateAttributes] = []
func parseCSVFile(){
        var fullString: String = ""
        var restStops: [String] = []
        guard let path = NSBundle.mainBundle().pathForResource("Rest_Areas", ofType: "csv") else{
            print("There was an error parsing the data file!")
            return
        }
        do{
            fullString = try String(contentsOfFile: path)
        }catch let error as NSError{
            print(error.debugDescription)
        }
        restStops = fullString.componentsSeparatedByString("\r")
        for (index, restStop) in restStops.enumerate() {
            let element = restStop.componentsSeparatedByString("\"").joinWithSeparator("").componentsSeparatedByString("]").joinWithSeparator("").componentsSeparatedByString("[").joinWithSeparator("").componentsSeparatedByString("|").joinWithSeparator(",")
            restStops[index] = element
        }
        for (index, restStop) in restStops.enumerate(){
            //print(index)
            let restStopArray = restStop.componentsSeparatedByString(",")
            if restStopArray[2] == "CA" {
                let interstateAttributes = InterstateAttributes()
                interstateAttributes.latitude = Double(restStopArray[0])
                interstateAttributes.longitude = Double(restStopArray[1])
                interstateAttributes.state = restStopArray[2]
                interstateAttributes.interstate = restStopArray[3]
                interstateAttributes.bound = restStopArray[4]
                interstateAttributes.description = restStopArray[5]
                interstateAttributes.name = restStopArray[6]
                interstateAttributes.RR = restStopArray[7]
                interstateAttributes.PT = restStopArray[8]
                interstateAttributes.VM = restStopArray[9]
                interstateAttributes.pets = restStopArray[10]
                interstateAttributes.HF = restStopArray[11]
                interstateAttributes.RVDump = restStopArray[12]
                californiaInterstates.append(interstateAttributes)
            }
        }
    }

我试图以加利福尼亚州的高速公路为例。此代码不起作用并且出错,因为当我尝试访问州际属性时,某些索引超出了范围。你能帮我解析一下这个CVS文件吗?

附件是CSV文件:

RestAreasCombined_USA.csv

如果您在下载文件时遇到任何问题,请与我们联系。

提前感谢您花时间阅读我的帖子!

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,这不完全是.csv文件。第4列的“详细信息”列只是一个字符串(不幸的是,您)可能包含逗号本身。

您需要做的是期望前3列,然后对子项进行更多解析。

例如,州际项目不是单独的字段;它是类型注释列第3列的一部分(并不保证是州际公路;例如,查看第14和22行,与美国高速公路相关)。

另外,为什么要测试“CA”的第三列?您链接的文件中的所有行都没有...

然后,当你得到4个长度的字符串条目时,你将不得不只针对“RR”,“PT”,“VM”,“Pets”,“HF”,“Gas”进行测试, Food“,”RV Dump“等为您的退出设置适当的布尔值。