我找到了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)
}
}
}
我之前已经意识到这个问题,但我对这些答案中其他语言的语法差异感到困惑。我是一个新的程序员,如果那不是很残酷。
答案 0 :(得分:0)
通常,在处理常用格式(如CSV)时,最好找到并使用现有的库。在Swift中已经存在一对,例如CSwiftV和SwiftCSV(前者遵守rfc4180 standard)。
这样做的原因是常见任务中的一些细节(无论任务本身可能是什么)至少有点难以实现,所以通过使用现有的库而不是自己编写,可以最大限度地减少实际需要正确的人数。