French Lecture fichier CSV

Cast

Member
Bonjour,
j'aimerai savoir si quelqu'un sait comment lire un fichier CSV.

J'ai vu qu'il y avait cela "loadtablefromcsv" mais visiblement il ne le reconnait pas, faut il une bibliotheque, speciale ?

Pour le moment j'arrive ligne par ligne le fichier avec ça:
Liste = File.ReadList(File.DirAssets,"scenar.csv")

Mais j'aimerai pouvoir extraire de chaque ligne les elements séparés par des virgules et là je bloque, pour le moment.

Merci d'avance.
 
Last edited:

Quandalle

Member
Licensed User
Vous pouvez regarder cette solution proposée par Erel
https://www.b4x.com/android/forum/threads/b4x-csvparser-csv-parser-and-generator.110901/#content


Par contre si le fichier CSV est très gros la fonction Readstring risque de provoquer un manque de mémoire. dans ce cas là il faudra par exemple procéder à une lecture ligne par ligne et séparer chaque champ de ligne grâce par exemple aux expression régulières

exemple de lecture ligne par ligne pour les très gros fichiers:
...
Dim streamInput As InputStream
streamInput = File.OpenInput(PathCsv, filecsv)

Dim tr As TextReader
'tr.Initialize(streamInput) ‘ si pas de transcodage de caractères
tr.Initialize2(streamInput, "ISO-8859-1") ‘ s’il faut transcoder le jeu de caractères (souvent cas des accents entre windows et java)

Dim strLine As String
strLine = tr.ReadLine
    
Do While (strLine <> Null)
        Decoder la ligne, en utilisation par exemple les expressionx régulières
Loop
...
 

Cast

Member
Bon j'ai finis de creuser.....j'ai trouvé en utilisant regex.split() pour extraire les elements séparés par les virgules.
Merci Quandalle de m'avoir mis sur la bonne voie.
 

Quandalle

Member
Licensed User
Bon j'ai finis de creuser.....j'ai trouvé en utilisant regex.split() pour extraire les elements séparés par les virgules.
Merci Quandalle de m'avoir mis sur la bonne voie.
Attention cela suppose que les champs ne contiennent pas de virgule....
Dans le cas le plus large un CSV contient un séparateur de champ (souvent on utilise la virgule) et un délimiteur de champ souvent le guillemet (").
Si on est sur que les champs ne contiennent pas le caractère séparateur alors on peut se passer des délimiteurs sinon il faut en tenir compte pour éviter qu'un champ soit malencontreusement coupé en morceau
exemple :
1,2,AB CD,2,4 : est une ligne de 5 champs
1,2,Le Symbole , est une virgule, 2, 4 : va donner 6 champs car on trouve une virgule dans l'un des champs. Dans ce cas il faut mettre un délimiteur de champ ce qui donne
1,2,"Le Symbole , est une virgule,",2,4 : l'expression régulière pour traiter cela devient plus complexe qu'un regex.split(",")
De plus si la chaîne contient elle même le délimiteur il faut le doubler : l'expression régulière est alors encore plus complexe

Donc tout dépend des données en entrée et du fait qu'on soit sur que le séparateur n’apparaîtra pas dans l'un des champs.
On peut faire aussi le découpage en champ "à la main" sans utiliser les expression régulières. A cette effet vous pouvez consulter (et adapter) la routine ReadLine (du CSVParser.bas) de l'exemple https://www.b4x.com/android/forum/threads/b4x-csvparser-csv-parser-and-generator.110901
 

Cast

Member
Merci mais effectivement mes champs n'ont pas de virgule, seul les séparateurs en sont. Donc la methode regex.split() convient bien.
 

klaus

Expert
Licensed User
Il y a la bibliothèque StringUtils qui contient les fonctions LoadCSV et LoadCSV2 pour lire des fichiers csv.
LoadCSV lit un fichier CSV sans entête. La fonction retourne une List.
LoadCSV2 prend la première ligne du fichier CSV comme entête. La fonction retourne une List. Il faut donner une List pour les entêtes comme paramètre.
StringUtils est une bibliothèque interne.

Su tu veux afficher le contenu dans une table il existe une CustomView Class Table qui se trouve dans Flexible Table, qui contient un programme démo.
Elle contient deux routines qui lisent des fichiers CSV et remplissent une table.
Tu dis que tu as trouvé: "loadtablefromcsv", ceci fait probablement référence à la classe ci-dessus car les fonctions qu'elle contient se nomment LoadTableFromCSV et LoadTableFromCSV2.
Ces deux routines utilisent d'ailleurs les fonctions de la bibliothèque StringUtils.

Il y a aussi B4XTable qui est multi-plateforme, je ne la connais pas bien car je ne l'ai pratiquement jamais utilisée.
Elle a un inconvénient, du moins pour moi, on ne peut la 'scroller' que horizontalement mais pas verticalement, il faut avancer et reculer page par page.

Si tu veux convertir des fichier CSV une base de données SQLite tu peux utiliser CsvToSQLite qui est un programme écrit avec B4J.

ATTENTION: Si tu lis des fichiers CSV crées par Excel, les textes sont encodés en ASCII alors que Anrdoid donc B4A utilise l'encodage UTF-8.
Donc les caractères accentués ne seront pas affichés correctement.
On peut modifier l'encodeage avec le programme NotePad+.
 
Top