2009-10-03 7 views
1

Dans mon application iOS, j'ai besoin d'exporter des données au format CSV ou HTML. Comment puis-je faire ceci?Comment convertir des données au format CSV ou HTML sur iOS?

+1

Pouvez-vous s'il vous plaît être précis sur le type de données ou au moins le type de source de données? –

+0

ok. Plus précisément, j'ai besoin d'exporter des données de la base de données sqlite. – diana

Répondre

4

RegexKitLite est livré avec un exemple de la façon de lire un fichier csv dans un NSArray de NSArrays et d'aller dans le sens inverse est assez trivial.

Ce serait quelque chose comme ça (avertissement: le code tapé dans le navigateur):

NSArray * data = ...; //An NSArray of NSArrays of NSStrings 
NSMutableString * csv = [NSMutableString string]; 
for (NSArray * line in data) { 
    NSMutableArray * formattedLine = [NSMutableArray array]; 
    for (NSString * field in line) { 
    BOOL shouldQuote = NO; 
    NSRange r = [field rangeOfString:@","]; 
    //fields that contain a , must be quoted 
    if (r.location != NSNotFound) { 
     shouldQuote = YES; 
    } 
    r = [field rangeOfString:@"\""]; 
    //fields that contain a " must have them escaped to "" and be quoted 
    if (r.location != NSNotFound) { 
     field = [field stringByReplacingOccurrencesOfString:@"\"" withString:@"\"\""]; 
     shouldQuote = YES; 
    } 
    if (shouldQuote == YES) { 
     [formattedLine addObject:[NSString stringWithFormat:@"\"%@\"", field]]; 
    } else { 
     [formattedLine addObject:field]; 
    } 
    } 
    NSString * combinedLine = [formattedLine componentsJoinedByString:@","]; 
    [csv appendFormat:@"%@\n", combinedLine]; 
} 
[csv writeToFile:@"/path/to/file.csv" atomically:NO]; 
+0

ok.Comment puis-je exporter en fichier html? – diana

+6

@Edwin HTML est juste un format texte, alors construisez la chaîne et écrivez-la dans un fichier. Nous ne pouvons pas écrire votre application pour vous ... –

0

CSV - comma separated values.

habituellement je viens de parcourir les structures de données dans mon application et la sortie d'un ensemble de valeurs par ligne, les valeurs dans ensemble séparées par des virgules.

struct person 
{ 
    string first_name; 
    string second_name; 
}; 

person tony = {"tony", "momo"}; 
person john = {"john", "smith"}; 

ressemblerait

tony, momo 
john, smith 
+1

Cela ne montre pas comment passer de l'enregistrement à la chaîne. –

2

La solution générale est d'utiliser stringWithFormat: pour formater chaque ligne. Vraisemblablement, vous écrivez ceci dans un fichier ou une socket, auquel cas vous écririez une représentation de données de chaque chaîne (voir dataUsingEncoding:) dans le handle de fichier lorsque vous le créerez. Si vous formatez beaucoup de lignes, vous pouvez utiliser les messages initWithFormat: et explicites release, afin d'éviter de manquer de mémoire en accumulant trop d'objets chaîne dans le pool de libération automatique. Toujours

Et toujours, toujours, toujours n'oubliez pas d'échapper correctement les valeurs avant de les passer à la méthode de formatage.

Echapper (avec unescaping) est une très bonne chose pour écrire des tests unitaires pour. Écrire une fonction au format CSV sur une seule ligne et avoir des cas de test qui comparent son résultat pour corriger la sortie. Si vous avez un analyseur CSV en main, ou si vous voulez en avoir un, ou si vous voulez juste être sûr que votre échappement est correct, écrivez des tests unitaires pour l'analyse et la déconnexion, ainsi que l'échappement et le formatage. Si vous pouvez commencer avec un seul enregistrement contenant n'importe quelle combinaison de caractères CSV spéciaux et/ou SQL spéciaux, formatez-le, analysez la chaîne formatée et terminez avec un enregistrement égal à celui que vous avez commencé, vous Connaissez votre code est bon.

(Tous les cas ci-dessus également au format CSV et HTML. Si possible, vous pouvez envisager d'utiliser XHTML, de sorte que vous pouvez utiliser des outils de validation XML et parseurs, y compris NSXMLParser.)

Questions connexes