Problème avec _FileReadToArray()

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Supernatural
Niveau 2
Niveau 2
Messages : 26
Enregistré le : jeu. 06 avr. 2017 15:18
Status : Hors ligne

Problème avec _FileReadToArray()

#1

Message par Supernatural »

Bonjour,

J'ai un problème avec la fonction _FileReadToArray().

Je souhaite que la fonction me retourne le fichier CSV dans un beau tableau ^^, pour cela j'utilise les options de la fonction mais elles ne fonctionne pas tout le temps... :cry:

Si j'enlève les option le fichier est bien lu mais pas mis en forme. Si quelqu'un a une idée? Merci
#include <Array.au3>
#include <File.au3>
Global $aArray

_FileReadToArray("MonFichierCSV", $aArray, 0, ";")

_ArrayDisplay($aArrayr)

If @error then ConsoleWrite(@error)
 
marcgforce
Niveau 3
Niveau 3
Messages : 47
Enregistré le : lun. 07 mars 2016 07:20
Status : Hors ligne

Re: Problème avec _FileReadToArray()

#2

Message par marcgforce »

Bonsoir tu peux utiliser cette fonction qui marche super bien (je l'insère dans un exemple pour plus de clarté sur son fonctionnement) :
#include<file.au3>
#include<Array.au3>

$fileopen = FileOpenDialog("Ouvrir un fichier CSV",@ScriptDir,"Fichiers CSV (*.csv)", $FD_FILEMUSTEXIST ); ouverture du CSV
                   Global $csv= $fileopen
                   local $scsv = FileRead($csv) ; lecture
                   $aarray= toArrayCsv($scsv) ; traitement de la fonction
                   _arraydisplay($aarray) ; pour debug

Func toArrayCsv($s)
    Local $line = StringSplit($s,@CRLF,2+1) ; combien de ligne de mon fichier <> tableau
    Local $maxCol = 1 ; nombre de colonne de depart
    Local $a[UBound($line)][$maxCol] ; je crée un tableau de n ligne et de 1 colonne que je modifierai à ma guise
    For $i = 0 To UBound($line)-1 ; parcours toutes les lignes
        Local $tmp = StringSplit($line[$i],";",3) ; combien de colonnes pour la ligne n°i
        If(UBound($tmp) > $maxCol ) then $maxCol = UBound($tmp) ; pour connaitre le nombre de colonnes
        ReDim $a[UBound($line)][$maxCol] ; je redimensionne mon tableau aux bonnes dimensions
        For $j = 0 To UBound($tmp)-1 ; je parcours cellule par cellule "de gauche a droite"
            $a[$i][$j] = $tmp[$j] ; je remplis chaque cellule
        Next
    Next
    Return $a
EndFunc
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Problème avec _FileReadToArray()

#3

Message par walkson »

Bonjour,
Mais _FileReadToArray() fonctionne très bien. Il suffit de mettre le bon chemin et le bon nom du array :mrgreen:
#include <Array.au3>
#include <File.au3>
Global $aArray

_FileReadToArray(@ScriptDir & "\MonFichier.CSV", $aArray, 0, ";")

_ArrayDisplay($aArray)   ;=> _ArrayDisplay($aArrayr) ???

If @error then ConsoleWrite(@error)
 
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Supernatural
Niveau 2
Niveau 2
Messages : 26
Enregistré le : jeu. 06 avr. 2017 15:18
Status : Hors ligne

Re: Problème avec _FileReadToArray()

#4

Message par Supernatural »

Salut,

Merci pour ta réponse ^^, désolé pour les fautes de frappe dans le code... :oops:

Je me suis aperçu en réalité, que si j'ai des cellules vides dans une colonne, la fonction ne me retourne rien contrairement à la même fonction sans "options"... :(

Exemple:


_FileReadToArray("MonFichierCSV", $aArray, 0, ";") ne me retourne rien alors que
_FileReadToArray("MonFichierCSV", $aArray) me retourne bien le contenu du fichier mais pas sous forme d'array...
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Problème avec _FileReadToArray()

#5

Message par walkson »

Bonjour,
Il semblerait que ce soit votre CSV qui pose problème, nombre de colonnes irrégulier.
Lancez ce petit code ci dessous, il vous indiquera où sont les erreurs. En affichant le CSV dans Scite, vous pouvez vérifier le nombre de ";" dans les lignes qui posent problème.
#include <Array.au3>
$lire = FileReadLine(@ScriptDir & "\Classeur.csv",1);nombre de colonnes selon ligne 1
$split = StringSplit($lire,";")
Local $aArray[0][$split[0]]
$i = 0
While 1
   $i += 1
$lire = FileReadLine(@ScriptDir & "\Classeur.csv",$i)
If @error Then ExitLoop
$split_1 = StringSplit($lire,";")
$replace = StringReplace($lire,";","|")
If $split[0] <> $split_1[0] Then $replace = "erreur ligne " & $i & " >> nb colonnes " & $split_1[0]
_ArrayAdd($aArray,$replace)
WEnd
_ArrayDisplay($aArray)
Et si votre espace est écrit comme "aa;bb;cc; ;ee" il n-y a aucun problème pour _FileReadToArray tant que le nb de colonnes est respecté (5 ici)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Supernatural
Niveau 2
Niveau 2
Messages : 26
Enregistré le : jeu. 06 avr. 2017 15:18
Status : Hors ligne

Re: Problème avec _FileReadToArray()

#6

Message par Supernatural »

Ok merci, je viens de tester et effectivement j'ai bien une "pseudo" erreur dans mon fichier csv.

En effet, j'ai une valeur dans une ou plusieurs cellule(s) qui commence(nt) par un ";" donc... ça fait planter la fonction...

Maintenant c'est comment y remédier....? Un StringReplace?
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Problème avec _FileReadToArray()

#7

Message par mikell »

S'il y a des valeurs qui contiennent le délimiteur, t'es pas arrivé...
Solution 1 (crade, parce qu'on peut trouver un ";;" correct en cas de cellule vide)

Code : Tout sélectionner

$txt = FileRead(@ScriptDir & "\fichier.csv")
$txt = StringReplace($txt, ";;", ";")
FileWrite(@ScriptDir & "\temp.csv", $txt)

_FileReadToArray(@ScriptDir & "\temp.csv", $aArray, 0, ";")
;etc
Solution 2 (propre)
Changer de délimiteur dans le csv, en mettant par exemple "|"

Solution 3 (plus compliquée)
Mettre les valeurs qui contiennent le délimiteur entre guillemets, et trouver une autre fonction de lecture de csv qui sait gérer ça
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre