web-dev-qa-db-fra.com

swift 3.1 comment obtenir un tableau ou un dictionnaire à partir de CSV

Comment pourrais-je utiliser des données dans ce type de fichier CSV? Ou comment pourrais-je imprimer par exemple la valeur de la ligne 2 pour la colonne "inside" et l'assigner à une propriété/entité?

J'ai ce type de fichier que j'ai obtenu à partir d'un fichier Excel converti en nombres, je voudrais récupérer des données pour chaque colonne et les utiliser.

Le fichier CSV d'origine ouvert en chiffres:

enter image description here

La sortie console que j'ai obtenue:

enter image description here

En utilisant ces méthodes:

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 grâce à Jens Meder

en utilisant

 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
    }

in 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

Ce que vous voulez faire, c'est diviser la chaîne en lignes, puis en colonnes (essentiellement un tableau bidimensionnel de chaînes). Swift fournit déjà la méthode components pour cela sur les structures 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
}

Ensuite, vous pouvez accéder à n'importe quelle valeur via:

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

Parfois, le fichier CSV est plus compliqué, comme les caractères spéciaux (par exemple la virgule), les valeurs sont entourées de guillemets doubles comme exemples ci-dessous:

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

Dans ce cas, j'utilise:

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)
     }
 }

Il est simplement écrit en Swift 4, l'original est de https://www.appcoda.com/core-data-preload-sqlite-database/

9
Chhaileng

C'est pour le fichier CSV pour Swift 4.2 à 20181208

  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
Mohammed Abunada