2009-07-21 11 views

Répondre

2

L'exportation vers un fichier csv n'est généralement pas très difficile. L'importer est beaucoup plus délicat à faire correctement.

pour exporter des données vers un fichier csv, procédez comme suit: (pseudocode)

1) fichier ouvert 2) les noms de colonnes d'exportation

int cnt=0; 
foreach(String columnname in columns) 
{ 
     if(cnt!=0) //write the delimiter 
     { 
      file.WriteText(","); //could also be a tab delimiter 
     } 
     file.WriteText(columnName) //write columnname 
     cnt++; 
} 

3) écrire toutes les données à l'csv

foreach(StringArray row in rows) 
{ 
     cnt=0; 
     foreach(String fieldValue in row) 
     { 
      if(cnt!=0) //write the delimiter 
      { 
       file.WriteText(","); //could also be a tab delimiter 
      } 
      file.WriteText(fieldValue) //write fieldvalue 
      cnt++; 
     } 
} 

Veuillez vous méfier du fait que le délimiteur pourrait également faire partie de la valeur. Si cela se produit, le champ complet doit être placé entre guillemets.

+0

Il y a un excellent moyen d'échapper caractères délimiteurs à ce repo: http://bitbucket.org/fourplusone/fourcsv –

11

Vous pouvez aussi faire quelque chose comme:

[[array componentsJoinedByString:@","] writeToFile:@"components.csv" atomically:YES encoding:NSUTF8StringEncoding error:NULL]; 

Vous pouvez utiliser des combinaisons de cela pour mettre en place un fichier CSV (ajoutez la sortie d'un tableau pour les noms de colonnes à un tableau pour les valeurs, etc.).

Bien sûr, vous devez faire attention à mettre des guillemets autour des valeurs qui contiennent déjà une virgule, et ensuite d'échapper les guillemets dans la valeur.

+1

Que dois-je faire si je veux convertir ma table de base de données en fichier csv? Donc, si l'utilisateur ouvre le fichier dans la feuille Excel, il peut voir l'élément dans un formulaire – Warrior

0
NSData *data=[[arr componentsJoinedByString:@","] writeToFile:@"Bhavesh.csv" atomically:YES encoding:NSUTF8StringEncoding error:NULL]; 
[mail addAttachmentData:data mimeType:@"text/csv" fileName:@"Bhavesh.csv"]; 
+0

'- (BOOL) writeToFile: (NSString *) chemin atomiquement: (BOOL) encodage useAuxiliaryFile: (NSStringEncoding) erreur enc: (NSError * *) La méthode error' renvoie une valeur 'BOOL' non pas' NSData'. – TheTiger

0

Voici une fonction complète qui fait le travail (Swift 3):

func write(theseArrays arrays: [[String]], withTheseHeaders headers: [String], toFile filename: String) { 

    let numCollumns = arrays.count 
    let numRows = arrays.first!.count 
    var output = "\(headers.joined(separator: ", "))\n" 

    for r in 0...numRows-1 { 
     var row = "" 
     for c in 0...numCollumns-1 { 
      row = c == 0 ? arrays[c][r] : row.appending(", \(arrays[c][r])") 
     } 
     output = output.appending("\(row)\n") 
    } 

    let localDocumentsURL = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: .userDomainMask).last 
    let myLocalFile = localDocumentsURL?.appendingPathComponent(filename) 

    guard myLocalFile != nil else { 
     print("----------- Couldn't create local file!") 
     return 
    } 

    do { 
     try output.write(to: myLocalFile!, atomically: true, encoding: String.Encoding.utf8) 
    } 
    catch let error as NSError { 
     print(error.localizedDescription) 
     return 
    } 
    print("Wrote CSV to: \(myLocalFile!)") 

} 
Questions connexes