Lire un csv avec séparateur inconnu

Fermé
Tudum - 29 déc. 2015 à 14:44
 Tudum - 29 déc. 2015 à 15:37
Bonjour,

Je cherche un lire fichier de type CSV avec C#.
Pour le moment, les seuls solutions possibles sont celles qui connaissent à l'avance le séparateur.

Ma question est-il possible de lire un fichier csv quand on ne connait pas le séparateur ?

Ma seule idée pour l'instant était de parcourir les caractères du fichier et prendre comme séparateur celui que l'on retrouve le plus.

Merci d'avance,

A voir également:

4 réponses

Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 649
29 déc. 2015 à 14:55
Bonjour,

C'est dangereux ton astuce, si un caractère se répète plus que ton séparateur (les voyelles c'est fort probable), ton programme fera n'importe quoi.
Pourquoi ne peux-tu pas connaitre le séparateur?
0
dna.factory Messages postés 25384 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 29 novembre 2024 1 613
29 déc. 2015 à 15:01
Ma seule idée pour l'instant était de parcourir les caractères du fichier et prendre comme séparateur celui que l'on retrouve le plus.
Donc l'espace ? ou la lettre e ?
A des fins d'exercice l'idée est bonne.
A des fins de production, ça ne peut pas marcher...

0
NHenry Messages postés 15164 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 novembre 2024 345
29 déc. 2015 à 15:03
Je te propose peut être de voir plutôt sur chaque ligne, quel est le caractère le plus constant en terme d'apparition.

Si par exemple sur chaque ligne tu as 5 ! c'est probablement le bon séparateur.
0
Merci pour vos réponses, oui en effet cela risque de ne pas fonctionné à 100%.

Ma deuxième idée est donc de compter par séparateurs qui sont le plus souvent utilisé. Les 3 types de séparateurs les plus utilisés sont "#", "," et ";".

Pour chaque caractère du flux
Si carac[i] = #
Dieze = dieze ++
FinSi
Si carac[i] = ;
Pointvirgule = pointvirgule++
FinSi
Si carac[i] = ,²
Virgule = virgule ++
FinSi
FinPour

Si dieze > pointvirgule alors
Si dieze > virgule
Separateur = dieze
Sinon
Separateur = virgule
FinSi
Sinon
Si Pointvirgule > virgule
Separateur = pointvirgule
Sinon
Separateur = virgule
FinSi
FinSi


Cela devrait fonctionné. Je ne sais pas comment seront les séparateurs car ils proviennent de fichier importer et pourront être importé par des utilisateurs lambda n'étant pas forcement au courant que le séparateur a utilisé est toujours ";" par exemple.
0
Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 649
29 déc. 2015 à 15:20
Rien ne t'empêche d'expliquer dans le fichier les conditions du format csv pour le programme
0
Tudum > Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020
29 déc. 2015 à 15:22
C'était la 1er idée oui en me disant oh et puis zut ^^
0
dna.factory Messages postés 25384 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 29 novembre 2024 1 613
29 déc. 2015 à 15:24
Nhenry a donné une solution beaucoup plus intelligente.
le séparateur csv est le seul caractère présent le même nombre de fois dans chaque ligne.
Cette méthode est surement la plus efficace, et celle avec le moindre risque d'erreur.
Sauf évidement si les fichiers font une ligne.
0
J'aime bien son idée en effet cependant je ne vois pas comment tester cette présence
0
dna.factory Messages postés 25384 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 29 novembre 2024 1 613
29 déc. 2015 à 15:31
un tableau à 3 dimension numéro de ligne, caractère, nombre de caractère. (on peut faire le tests sur 20 lignes, ça devrait être suffisant).
une fois le tableau rempli, on défile les caractères, et on regarde si c'est le même nombre pour chaque ligne.
0