web-dev-qa-db-ja.com

swift 3.1 CSVから配列または辞書を取得する方法

この種のCSVファイルでデータを使用するにはどうすればよいですか?または、たとえば「内部」列の行2の値を印刷して、それをプロパティ/エンティティに割り当てるにはどうすればよいですか?

Excelファイルから取得したこの種のファイルをNumbersに変換しました。各列のデータを取得して使用したいと思います。

番号で開いた元の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
}

Jens Mederのおかげで解決策

を使用して

 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
    }

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
19
biggreentree

何をしたいのかは、文字列を行に分割してから列に分割することです(基本的には、文字列の2次元配列)。 Swiftはすでにcomponents構造体の String メソッドを提供しています。

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.
18
Jens Meder

Swift 4

CSVファイルは特殊文字(コンマなど)のようにより複雑な場合があり、値は以下の例のように二重引用符で囲まれています:

Hello, "Complicated String, with a comma inside", 123

この場合、以下を使用します。

let dataString: String! = String.init(data: data!, encoding: .utf8)
var items: [(String, String, String)] = []
let lines: [String] = dataString.components(separatedBy: NSCharacterSet.newlines) as [String]

for line in lines {
    var values: [String] = []
    if line != "" {
        if line.range(of: "\"") != nil {
            var textToScan:String = line
            var value:NSString?
            var textScanner:Scanner = Scanner(string: textToScan)
            while textScanner.string != "" {
                if (textScanner.string as NSString).substring(to: 1) == "\"" {
                    textScanner.scanLocation += 1
                    textScanner.scanUpTo("\"", into: &value)
                    textScanner.scanLocation += 1
                } else {
                    textScanner.scanUpTo(",", into: &value)
                }

                 values.append(value! as String)

                 if textScanner.scanLocation < textScanner.string.count {
                     textToScan = (textScanner.string as NSString).substring(from: textScanner.scanLocation + 1)
                 } else {
                     textToScan = ""
                 }
                 textScanner = Scanner(string: textToScan)
            }

            // For a line without double quotes, we can simply separate the string
            // by using the delimiter (e.g. comma)
        } else  {
            values = line.components(separatedBy: ",")
        }

        // Put the values into the Tuple and add it to the items array
        let item = (values[0], values[1], values[2])
        items.append(item)
        print(item.1)
        print(item.2)
        print(item.3)
     }
 }

Swift 4、オリジナルは https://www.appcoda.com/core-data-preload-sqlite-database/

9
Chhaileng

これはSwift 4.2 at 20181208のCSVファイル用です

  var dataArray : [String] = []
      if  let path = Bundle.main.path(yourfile: "svenskaidiom", ofType: "csv")  
      {
        dataArray = []
        let url = URL(fileURLWithPath: path)
        do {
            let data = try Data(contentsOf: url) 
            let dataEncoded = String(data: data, encoding: .utf8)
            if  let dataArr = dataEncoded?.components(separatedBy: "\r\n").map({ $0.components(separatedBy: ";") })
          {
            for line in dataArr
            {
                    dataArray?.append(line)
            }
        }
        }
        catch let jsonErr {
            print("\n Error read CSV file: \n ", jsonErr)
        }
        }
3