Enregistrer un fichier en format csv
mac_manu
Membre
Bonjour,
Est-il possible d'enregistrer des données de types différents (NSString, NSDate, float, etc) se trouvant dans une même NSArray en format csv , afin de pouvoir lire le fichier ainsi créé dans une application telle que Numbers ? SI oui, pourriez-vous s'il vous plaà®t me mettre (ou m'indiquer où trouver) un petit exemple ? Un grand merci /thumbsup.gif' class='bbc_emoticon' alt=' ' />
Est-il possible d'enregistrer des données de types différents (NSString, NSDate, float, etc) se trouvant dans une même NSArray en format csv , afin de pouvoir lire le fichier ainsi créé dans une application telle que Numbers ? SI oui, pourriez-vous s'il vous plaà®t me mettre (ou m'indiquer où trouver) un petit exemple ? Un grand merci /thumbsup.gif' class='bbc_emoticon' alt=' ' />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
sFileName = /color][color=#713ea3]NSString[/color][color=#000000] [/color]stringWithFormat[color=#000000]:[/color][color=#d12c26]@"DT_Export_%@"[/color][color=#000000], [[/color][color=#713ea3]NSDate[/color][color=#000000] [/color]date[color=#000000] ;
NSString* path = [NSString stringWithFormat:@%@/%@/%@.csv", NSHomeDirectory(), @Documents, sFileName];
BOOL success;
// Crée un objet FileManagerCreate qui va servir à vérifer le status
// de la base de données et de la copier si nécessaire
NSFileManager *fileManager = /color]NSFileManager[color=#000000] [/color][color=#3e1f7c]defaultManager[/color][color=#000000;
// Vérifie si la BDD a déjà été créée dans les fichiers system de l'utilisateur
success = [fileManager fileExistsAtPath:path];
// Si la BDD existe déjà "return" sans faire la suite
if(!success)
{
//char *donnees = [data ]
// Si ce n'est pas le cas alors on copie la BDD de l'application vers les fichiers système de l'utilisateur
[fileManager createFileAtPath:path contents:nil attributes:nil];
NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath: path];
// ici tu mets tes données a exporter séparer d'un ; et de /n
NSString *donneesExport = @"";
[handle writeData:[donneesExport dataUsingEncoding:NSUTF8StringEncoding]];
}
Tu as la classe CHCSVParser (lecture et écriture) sur GitHub
voir ici https://github.com/davedelong/CHCSVParser
Je savais pas qu'il y avait une class, je vais y jeter un oeil. Merci!
- (NSArray *)filterTheArray:(NSArray *)objects typeOfArray:(NSString *)arrayName
{
if (searchString == nil && compteFiltre == nil && posteFiltre == nil && genreFactureFiltre == -1 && beneficiaireFiltre == nil)
return objects;
NSMutableArray *filteredObjects = color=#7031a8]NSMutableArray[/color] [color=#3f0b80]arrayWithCapacity[/color]:[objects [color=#3f0b80]count[/color];
NSEnumerator *objectsEnumerator = [objects objectEnumerator];
id item;
if ([arrayName isEqualToString:@mouvement]) {
while (item = [objectsEnumerator nextObject]) {
if (item [color=#37595d]mouvementVentile[/color count] > 1 && color=#568186]mainWindow[/color] [color=#3f0b80]firstResponder[/color != prefCompteTable) {
NSEnumerator *objectsEnumerator = item [color=#37595d]mouvementVentile[/color objectEnumerator];
id itemVentile;
while (itemVentile = [objectsEnumerator nextObject]) {
Mouvements *newMouvement = [color=#568186]Mouvements[/color] [color=#3f0b80]alloc[/color init];
[newMouvement setNo_mvt:[item no_mvt]];
[newMouvement setDateMouvement:[item dateMouvement]];
[newMouvement setCompte:[item compte]];
if ([itemVentile debitCp] != 0.0)
[newMouvement setMontantPrim:[itemVentile debitCp]];
else
[newMouvement setMontantPrim:[itemVentile creditCp]];
[newMouvement setMotifPrim:[item motifPrim]];
[newMouvement setRubrique:[itemVentile rubriqueCp]];
[newMouvement setMotif:[itemVentile motifCp]];
[newMouvement setCredit:[itemVentile creditCp]];
[newMouvement setDebit:[itemVentile debitCp]];
if ([self respondToFilterOf:0 with:newMouvement] && [self respondToFilterOf:1 with:newMouvement] && [self respondToFilterOf:2 with:newMouvement])
[filteredObjects addObject:newMouvement];
[newMouvement release];
}
}
else if ([self respondToFilterOf:0 with:item] && [self respondToFilterOf:1 with:item] && [self respondToFilterOf:2 with:item])
[filteredObjects addObject:item];
}
}
else if ([arrayName isEqualToString:@facture]) {
while (item = [objectsEnumerator nextObject]) {
if ([self respondToFilterOf:3 with:item] && [self respondToFilterOf:4 with:item] && [self respondToFilterOf:5 with:item])
[filteredObjects addObject:item];
}
}
return filteredObjects;
}
puis-je exporter directement la variable filteredObjects ?
J'ai juste un conseil: faire relire le CSV par différents tableurs, Mac et éventuellement PC.
Excel, Libre office, Open office, Numbers, Ragtime, KOffice, .....
Cela ce fait rapidement dans une boucle for.
Le seul gros problème que j'ai pu rencontrer, c'est lorsque dans ma chaine NSString il y a une partie qui contient un ;
Il faut vérifier les éléments pour éliminer les ; et les sauts de ligne sinon on peut avoir des surprises...
Donc la meilleur approche est effectivement de passer par un NString avec un délimiteur de données et un séparateur de valeur. Quelque chose dans le genre:
"valeur11","valeur12", ...... ,"Valeur1N" CRLF "valeur21","valeur22", ...... ,"Valeur2N" ..... etc
Peut-être que CR ou LF peuvent être employés seuls.
Pour ma part, j'avais un panneau de préférences qui permettait à l'utilisateur de choisir le délimiteur et le séparateur.
Nota: CSV -> coma separated value -> donc: valeurs séparées par des virgules
Denis
Malheureusement, je rencontre un problème de débutant (cela fait plus de 5 ans que je n'ai plus programmé, et comme je suis 100% autodidacte, c'est grâce à tous vos conseils que je peux avancer dans mes connaissances /thumbsup.gif' class='bbc_emoticon' alt='' /> ). Je joins une partie de mon code, ce sera plus explicite et vous pourrez me dire ou je fais la faute !
- (IBAction)exportAs:(id)sender
{
NSEnumerator *objectsEnumerator = color=#568186]filteredArray[/color] [color=#3f0b80]objectEnumerator[/color;
NSString *stringToExport;
Mouvements *item;
while (item = [objectsEnumerator nextObject]) {
// *** DATES ***
[stringToExport stringByAppendingString:item [/color][color=#37595d]dateMouvement[/color][color=#000000 descriptionWithCalendarFormat:@%d.%b.%y
timeZone:nil
locale:nil]];
// *** COMPTES ***
[stringToExport stringByAppendingString:[item rubrique]]; // [item rubrique] renvoi une NSString
// *** MOTIFS PRIMAIRES ***
[stringToExport stringByAppendingString:[item motif]]; // [item motif] renvoi une NSString
// *** CREDITS ***
[stringToExport stringByAppendingString:/color][color=#7031a8]NSString[/color][color=#000000] [/color]stringWithFormat[color=#000000]:[/color][color=#c82a25]@"%1.2f"[/color][color=#000000],[item [/color][color=#37595d]credit[/color][color=#000000]]; // [item credit] renvoi un // float
// *** DEBITS ***
[stringToExport stringByAppendingString:/color][color=#7031a8]NSString[/color][color=#000000] [/color]stringWithFormat[color=#000000]:[/color][color=#c82a25]@"%1.2f"[/color][color=#000000],[item [/color][color=#37595d]debit[/color][color=#000000]];
}
Comme résultat, je n'ai strictement rien dans ma variable stringToExport. Je pense que je tourne autour du pot, mais je ne sais plus ou est la faute...
Merci de me dépanner à nouveau /implore.gif' class='bbc_emoticon' alt=' ' />
Sinon, la méthode stringByAppendingString c'est :
Returns a new string made by appending a given string to the receiver.
J'aurai plutôt fait quelque chose comme :
NSMutableString *stringToExport;
puis
[stringToExport appendString:.....]; ou [stringToExport appendFormat:...]; c'est selon.
La méthode appendString: (de la classe NSMutableString) c'est :
Adds to the end of the receiver the characters of a given string.
Dans ton code tu utilises une méthode qui te retourne un string dont tu ne fais rien.
Je crois que tu as oublié quelque chose /biggrin.png' class='bbc_emoticon' alt=':D' />
En fait, ton code serait correct si tu utilisais NSMutableString ...
D'autre part, (pas sure non plus) il me semble qu'avec un énumérateur tu ne peux pas être sure de l'ordre d'énumération.
Essayes plus tot comme le dit Kuberman ou comme ci-dessous
NSString *stringToExport = [color=#7031a8]NSString[/color] [color=#3f0b80]alloc[/color init];
NSString *aLineOfData;
début de la boucle
aLineOfData = [NSString stringWithFormat:@\%@\",\"%@\",\"%@\",\"%@\",\"%@\"\n", mouvement, rubric, motif, credit, debit] ;
stringToExport = [aLineOfData stringByAppendingString:aLineOfData];
fin de boucle
Mais ça ne fonctionne pas...
stringToExport = [stringToExport stringByAppendingString:aLineOfData];
En tous les cas, un grand merci pour votre aide sans vous... Je serais perdu ! Alors, vive vous /cliccool.gif' class='bbc_emoticon' alt=' ' />