2017-04-08 29 views
7

如何在這種CSV文件中使用數據?或者我怎麼能打印例如「內部」列中的第2行值並將其分配給屬性/實體?swift 3.1如何從CSV獲取數組或字典

我有這樣的文件,我從Excel文件轉換爲數字,我想抓住每個列的數據並使用它們。在數量上打開

原來的CSV文件:

enter image description here

控制檯輸出我:

enter image description here

使用這種方法:

func readDataFromCSV(fileName:String, fileType: String)-> String!{ 
     guard let filepath = Bundle.main.path(forResource: fileName, ofType: fileType) 
      else { 
       return nil 
     } 
     do { 
      var contents = try String(contentsOfFile: filepath, encoding: .utf8) 
      contents = cleanRows(file: contents) 
      return contents 
     } catch { 
      print("File Read Error for file \(filepath)") 
      return nil 
     } 
    } 


func cleanRows(file:String)->String{ 
    var cleanFile = file 
    cleanFile = cleanFile.replacingOccurrences(of: "\r", with: "\n") 
    cleanFile = cleanFile.replacingOccurrences(of: "\n\n", with: "\n") 
    //  cleanFile = cleanFile.replacingOccurrences(of: ";;", with: "") 
    //  cleanFile = cleanFile.replacingOccurrences(of: ";\n", with: "") 
    return cleanFile 
} 

SOLUTION感謝延斯梅德爾

在viewDidLoad中

var data = readDataFromCSV(fileName: kCSVFileName, fileType: kCSVFileExtension) 
    data = cleanRows(file: data!) 
    let csvRows = csv(data: data!) 
    print(csvRows[1][1]) // UXM n. 166/167 
+0

有什麼問題嗎?看來你已經讀過這些數據了。 – matt

+0

是的,我讀了它,但我只有一個很長的字符串,我怎麼能打印例如「內部」列的第2行值,並將其分配給一個屬性/實體? – biggreentree

+0

您是否嘗試過搜索堆棧溢出?你真的認爲你是第一個想將CSV文件分解爲組件的人嗎? – matt

回答

6

你想要做什麼用

func csv(data: String) -> [[String]] { 
     var result: [[String]] = [] 
     let rows = data.components(separatedBy: "\n") 
     for row in rows { 
      let columns = row.components(separatedBy: ";") 
      result.append(columns) 
     } 
     return result 
    } 

是分手了行,然後爲列的字符串(基本上是兩個字符串的二維陣列)。 Swift已經爲String結構提供了components方法。

func csv(data: String) -> [[String]] { 
    var result: [[String]] = [] 
    let rows = data.components(separatedBy: "\n") 
    for row in rows { 
     let columns = row.components(separatedBy: ";") 
     result.append(columns) 
    } 
    return result 
} 

然後,您可以通過訪問任意值:

var data = readDataFromCSV(fileName: kCSVFileName, fileType: kCSVFileExtension) 
data = cleanRows(file: data) 
let csvRows = csv(data: data) 
print(csvRows[1][1]) //UXM n. 166/167. 
+0

感謝您的幫助,我用您的代碼在我的問題中添加了一個測試,但我認爲我不明白要輸入什麼數據:<你的文件字符串>你能檢查我是否誤解了一些東西嗎? – biggreentree

+0

與'<您的文件字符串>'我指的是'readDataFromCSV'方法的結果。它基本上是讀入字符串的csv文件的內容。 –

+0

我已經添加了更多的示例代碼來澄清它。 –