使用文本字段将CSV扫描到Array Swift中

时间:2016-02-05 16:54:17

标签: arrays swift parsing csv

我找到了here的CSV扫描方法。导致我在那里的SO答案是here

我的问题是:我尝试扫描的CSV数据偶尔会包含逗号(在一个名为" Notes"以及其他字段的字段中)。这在扫描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)
        }
    }
}

我之前已经意识到这个问题,但我对这些答案中其他语言的语法差异感到困惑。我是一个新的程序员,如果那不是很残酷。

1 个答案:

答案 0 :(得分:0)

通常,在处理常用格式(如CSV)时,最好找到并使用现有的库。在Swift中已经存在一对,例如CSwiftVSwiftCSV(前者遵守rfc4180 standard)。

这样做的原因是常见任务中的一些细节(无论任务本身可能是什么)至少有点难以实现,所以通过使用现有的库而不是自己编写,可以最大限度地减少实际需要正确的人数。