2016-09-19 8 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ファイルを解析してソートするのを手伝ってもらえますか?あなたは私に知らせてくださいファイルをダウンロードするすべての問題がある場合は

RestAreasCombined_USA.csv

:添付

はCSVファイルです。

私の記事を読む時間を取ってくれてありがとう!

答えて

0

問題は完全に.csvファイルではないということです。 [詳細]列の4列目は、(残念なことに)カンマ自体を含む文字列です。

あなたがする必要があるのは、最初の3つの列がそこにあることを期待してから、さらにサブ項目の解析を行うことです。

たとえば、州間項目は別のフィールドではありません。タイプノートの列3列の一部です(州間道路であることは保証されていませんが、たとえば米国の高速道路に関する14行目と22行目を参照してください)。

また、なぜ「CA」の第3列をテストしていますか?あなたがリンクしているファイル内のどの行も全くそれを持っていません...

そして、文字列の4桁の長さになると、あなたは "RR"、 "PT"

+0

私は "CA"をチェックしています。なぜなら、3番目の文字は "CA"です。 indexは常に状態名の省略形です(例:CAはカリフォルニア)。これはエントリの例です-120.780655,36.860709、CA、I-5、NB、JOHN ERRECA REST AREA、MM386、RR、PT、VM 、ペット、HF、PHONES –

+0

リンクしたCSVファイルと一致しません '経度、緯度、TYPE_NOTES、DETAILS -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 AREA NB I-95 MM240、RR、PT 、ペット、HF " 見られる" CA "ではありません。 –

+0

あなたはまだ同じ問題があります。あなたがここに持っているのはカンマ区切りの値のリストだけではありません。代わりに、あなたが持っているものは: 1)コンマ区切り:long、lat;もう1つカンマ。 2)引用符をつけてコンマ区切り州、州間高速道路、名前、マイルマーカー、終値を入力し、さらにカンマを1つ入力します。 3)引用符をつけて、カッコで区切られた項目のリストを開き、次にブラケット、次にパイプ、オプションの要素、次に引用符を閉じます。 複数のレベルの解析を行う必要があります。トークンを引用符で区切り、次にコンマで区切ることをお勧めします。 –

関連する問題