2016-09-19 87 views
0

這是我第一次嘗試解析CSV文件;我以前只使用過JSON文件。我知道CSV是逗號分隔值的縮寫。我有一個CSV文件,列出美國各州際高速公路上所有休息站的列表;但是,此文件中的值不能用逗號分隔。我想知道是否有人可以幫助我解析這個文件到對象?我的目標是對這個文件進行排序,並把每個州際屬於一個特定的狀態放在相應的對象(狀態)中。例如,5號州際公路(I-5)跨越美國的整個西部海岸,從加拿大邊境開始,經過華盛頓,俄勒岡和加利福尼亞,直至墨西哥邊境。因此,I-5應該屬於「華盛頓」,「俄勒岡」和「加利福尼亞州」的對象。下面的代碼是我嘗試刪除所有標點符號,並用逗號替換它們以獲得常規的CSV文件。按照順序,在我創建了一個常規的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

如果您在下載文件,請讓我知道任何麻煩。

預先感謝您花時間閱讀我的文章!

回答

0

您遇到的問題是,這不完全是.csv文件。 「詳細信息」列第4列只是一個字符串,(不幸的是您)可能包含逗號本身。

你需要做的是期望前3列在那裏,然後做更多的子項解析。

例如,州際項目不是一個單獨的字段;它是類型註釋欄第3列的一部分(並且不能保證是州際公路;請參閱第14和22行,例如與美國高速公路有關的內容)。

此外,爲什麼要測試「CA」的第三列?你連接的文件中沒有任何行有...

然後,當你得到字符串條目4-長度,你將不得不只是測試他們對「RR」,「PT」 ,「VM」,「Pets」,「HF」,「Gas」,「Food」,「RV Dump」等設置適合您的出口的布爾值

+0

我正在檢查「CA」索引始終是州名的縮寫,例如CA是加利福尼亞州,這是一個條目的示例:-120.780655,36.860709,CA,I-5,NB,JOHN ERRECA REST AREA,MM386,RR,PT,VM ,Pets,HF,PHONES –

+0

該條目與您鏈接的CSV文件不符 '經度,緯度,TYPE_NOTES,詳細信息 -67.834062,46.141129,REST AREA-FOLLOW SIGNS SB I-95 MM305,「RR,PT,Pets,HF」 -67.845906,46.138084,REST AREA-FOLLOW SIGNS NB I-95 MM305,「RR,PT,Pets,HF」 -68.498471,45.659781,TURNOUT NB I -95 MM249,Scenic Vista-NO FACILITIES -68.534061,45.598464,REST AREA SB I-95 MM240,「RR,PT,Pets,HF」 -68.539034,45.594001,REST ARE NB NB I-95 MM240,「RR,PT ,寵物,HF「' 不是一個」CA「被看到。 –

+0

你仍然有同樣的問題。你在這裏有什麼不只是一個逗號分隔值的列表。相反,你有什麼是: 1)逗號分隔:長,拉特;再多一個逗號; 2)報價打開,然後逗號分隔狀態,州際或高速公路,名稱,英里標記,關閉報價,然後多一個逗號; 3)報價打開,然後括號,可能或可能不存在的項目的逗號分隔列表,然後括號,然後管道,可選元素,然後關閉報價。 你將不得不做多層次的解析。我會建議首先通過引用分割令牌,然後再通過逗號分割令牌。 –