fichier "Texte-Tabulé"
tablier
Membre
Je souhaite ouvrir un fichier "texte-tabulé" (ou csv) et récupérer séquentiellement les textes individuels en contrôlant les changements de lignes.
Je n'ai rien trouvé de mieux que d'en faire un NSSstring et d'analyser le résultat caractère par caractère (recherche des fins de lignes et des tabulations).
ça marche, mais ça ne me parait lourd et peu élégant!
J'ai jeté un oe“il sur NSUnarchiver et sur NSData, mais je ne vois pas trop comment utiliser cela.
Quelle serait la méthode la plus simple pour arriver à mes fins?
Je n'ai rien trouvé de mieux que d'en faire un NSSstring et d'analyser le résultat caractère par caractère (recherche des fins de lignes et des tabulations).
ça marche, mais ça ne me parait lourd et peu élégant!
J'ai jeté un oe“il sur NSUnarchiver et sur NSData, mais je ne vois pas trop comment utiliser cela.
Quelle serait la méthode la plus simple pour arriver à mes fins?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
As-tu vu cette discussion? Cela devrait faire ton bonheur je pense.
Bon, cet article résoud presque complètement mon problème, merci! :P
Donc ça marche si ton CSV n'a pas de quote, ou en a partout autour de chaque champ mais pas à l'intérieur... mais pas pour les champs étalés sur plusieurs lignes ou ceux contenant des quotes.
Moi dans ma situation j'avais parsé des fichier remplis d'info de license dans le style de :
Donc pour moi c'était amplement suffisant, mais pas idéal
Quitte à régler le problème des " ou ' séparement pour chaque string récupéré.
ça vous paraà®t idiot?
Sinon pour corriger les erreurs de découpage avec componentsSeparatedByString :
Exemples de lignes chiantes : Cette ligne correspond à 3 éléments Pourtant quand tu fais ton [tt]componentsSeparatedByString:@,[/tt], tu obtiendras :
Une idée d'algo pour pas te compliquer la vie (peut-être pas le plus optimisé mais celui où on se prend sans doute moins la tête, à part la solution du parcours caractère par caractère avec suivi d'un flag si on est dans une chaine "quotée" ou pas, mais bon) :
Soit V = CheckDeb(C) le test défini comme suit sur une chaà®ne C et retournant un booléen V :
- Supprimer tous les espaces en début et fin de C
- Supprimer tous les double-guillemets (2 guillemets consécutifs) du résultat (pour pas perturber)
- V est vrai si le résultat commence par un guillemet, faux sinon
Et le test V = CheckFin(C) qui fait la même chose mais en testant si le résultat se termine par un guillemet (ou pas)
--> Ce test permet de vérifier si une chaà®ne est le début d'un élément qui a été coupé par erreur, et de trouver l'élement de fin correspondant :
1) Effectuer Comps[ L ] = [ligne componentsSeparatedByString:@\t] sur chaque ligne Lde ton fichier CSV.
2) Ensuite pour chaque composant C, effectuer le test D = CheckDeb(C), puis regarder si D est vrai. Si oui, c'est une chaà®ne qui est le début d'un composant tronqué par erreur. Dans ce cas, enlever le guillemets du début du composant C, puis :
2a) effectuer F=CheckFin(C2) sur le composant C2 qui suit
2b) concaténer : C = C + C2.
2c) Et recommencer 2a tant que F est faux (donc s'arrêter quand F est vrai, en en profitant pour supprimer le guillemet à la fin)
Sachant que le composant "qui suit" peut être le suivant dans le tableau Comps[ i ]... ou si on est arrivé à la fin, le premier de Comps[ i+1 ] (= début de la ligne suivante) !
Cet algo permet de réunifier les composants qui auraient été coupés en deux (ou plus) par erreur, mais ça fait bcp de replaceString (qui, j'imagine, en interne fait une boucle de parcours des caractères) et de appendString aussi, pour la partie 2 de l'algo. Donc à se demander si ça vaut pas le coup de faire un parcours caractère par caractère dès le début :
- avec un flag "inQuotedString" dont on inverse l'état quand on rencontre une quote, sauf si cette dernière est suivie d'une autre quote
- le flag permettant ensuite de savoir si on doit considérer les séparateurs de ligne (\n) et de colonnes (\t) comme des vrais séparateurs ou comme à considérer comme caractères (échappés)
Voilà pour les idées.
Pour le séparateur d'élément, comme je peux avoir des chiffres écrits en Français ( 34,5 par exemple) je prends la précaution de demander des fichiers "Texte-Tabulé" et non des fichiers CSV.
Ceci dit juste histoire de pinailler...c'est à ça aussi que servent les guillemets dans ces fichiers, à encapsuler le contenu des colonnes pour que tout ce qui est entre les guillemets soit compris comme du texte brut :P
Mais bon après autant utiliser les tabulations, je suis d'accord (d'ailleurs moi je préfère aussi les CSV utilisant les tabs, même si historiquement c'est la virgule)
Comme j'ai enfin eu un peu de temps libre j'ai écris une méthode d'extraction des champs de la ligne.
Mais, étant d'origine Normande (ptet' bin qu'oui, ptet' bin qu'non ??? ) , je n'ai pas voulu choisir entre tabulation, virgule ou point virgule.
Je mets dans le fichier joint (extraire.zip) la méthode qui, après essais, me semble très bien marcher.