2016-02-05 46 views
0

我有一個CSV掃描方法,我找到here。導致我在那裏的SO答案是here使用文本字段將CSV掃描到Array Swift

我的問題是:我想偶爾掃描CSV數據包含逗號(在一個名爲「註釋」以及其他領域)。這在我掃描csv時會出現問題,因爲它會將notes字段解釋爲具有分離值。

有人可以幫我編輯此方法來正確處理文本字段內的逗號嗎?我也不確定如何保存csv來分隔該字段。不知道我的確切更改需要在此方法中以及csv的保存選項中進行。

這裏是直接從我的應用程序的功能:

func scanCSV() -> Array<Dictionary<String,String>> { 
    var myCSVContents = Array<Dictionary<String, String>>() 

    //rawData is a global string variable that gets set to the CSV string on object init. 
    let allRows = rawData.componentsSeparatedByString("\n") 
    let headers = allRows[0].componentsSeparatedByString(",") 

    runFunctionOnRowsFromFile(headers, withFunction: { 
     (aRow: Dictionary<String, String>) in 
     myCSVContents.append(aRow) 
    }) 

    return myCSVContents 

} 
func runFunctionOnRowsFromFile(theColumnNames:Array<String>, withFunction theFunction:(Dictionary<String, String>)->()) { 

    var fileObjectCleaned = rawData.stringByReplacingOccurrencesOfString("\r", withString: "\n") 

    fileObjectCleaned = fileObjectCleaned.stringByReplacingOccurrencesOfString("\n\n", withString: "\n") 

    let objectArray = fileObjectCleaned.componentsSeparatedByString("\n") 

    for anObjectRow in objectArray { 

     let objectColumns = anObjectRow.componentsSeparatedByString(",") 

     var aDictionaryEntry = Dictionary<String, String>() 

     var columnIndex = 0 

     for anObjectColumn in objectColumns { 

      aDictionaryEntry[theColumnNames[columnIndex]] = anObjectColumn.stringByReplacingOccurrencesOfString("\"", withString: "", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil) 

      columnIndex++ 
     } 

     if aDictionaryEntry.count>1{ 
      theFunction(aDictionaryEntry) 
     } 
    } 
} 

我意識到這個問題已經被問過,但我得到我被這個語法差異,其他語言都具有這些問題的答案混淆。我是一名新程序員,如果這不是非常明顯的話。

+0

我建議找到一個現有的CSV解析器,如[this](https://github.com/Daniel1of1/CSwiftV)或[this](https://github.com/naoty/SwiftCSV)並使用它代替。 –

+0

@Elogent - 你知道這些是否明確處理我正在努力的條件?在自述文件中,他們沒有馬上出來,並說他們做 – Charlie

+0

第一個說它符合[rfc4180](http://tools.ietf.org/html/rfc4180#section-2),所以我會假設所以。 –

回答

0

通常,在處理常用格式(如CSV)時,最好找到並使用現有的庫。 Swift中已經存在一對夫婦,如CSwiftVSwiftCSV(前者符合rfc4180 standard)。

之所以這樣做,是因爲常見任務中的一些細節(無論任務本身可能是什麼)對於正確使用起碼會有點棘手,所以通過使用現有的庫而不是自己編寫它,您可以將實際需要需要的人數減至最少。