Page 1 sur 1
[R]Etablir une connexion avec un fichier csv pour requête
Posté : jeu. 13 avr. 2017 11:12
par Supernatural
Bonjour,
Je souhaiterai établir une connexion ADODB avec un fichier csv.
Après quelques temps passé sur g**gle, j'ai bien trouvé des choses intéressantes, mais j'ai toujours une erreur...
The requested action with this object has failed.:
$oRecordset.Open($sSQL, $oConnection, $iCursorType, $iLockType, $iOptions)
$oRecordset^ ERROR
Voici le code:
Global $csvpath="C:\temp\"Global $csvFile="Mon fichier.csv"Global Const $iCursorType = 0 ; adOpenForwardOnlyGlobal Const $iLockType = 1 ; adLockReadOnlyGlobal Const $iOptions = 2 ; adCmdTableGlobal $oConnection = ObjCreate("ADODB.Connection") ; Create a connection objectGlobal $oRecordset = ObjCreate("ADODB.Recordset") ; Create a recordset objectGlobal $sConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' & $csvpath & ';Extended Properties="Text;HDR=YES;FMT=Delimited(,)"'$oConnection.Open($sConnectionString) ; Open the connectionGlobal $sSQL = 'Select * From Monfichier.csv'; Select all records with the specified content and select two fields$oRecordset.Open($sSQL, $oConnection, $iCursorType, $iLockType, $iOptions) ; Issue the SQL queryWith $oRecordset While Not .EOF ; repeat until End-Of-File (EOF) is reached ConsoleWrite(.Fields("Ville").Value & "|" & .Fields("Code postal").Value & @CR) .MoveNext ; Move To the Next record WEndEndWith$oRecordset.Close ; Close the recordset$oRecordset = 0 ; Release the connection object$oConnection.Close ; Close the connection$oConnection = 0 ; Release the connection object
Merci par avance
Re: [..]Etablir une connexion avec un fichier csv pour requête
Posté : ven. 14 avr. 2017 15:43
par Supernatural
J'ai essayé avec ça, pas d'erreur mais rien ne se passe non plus...
Local $sPath_to_database = "C:\temp"; DSN-less connectionLocal $connection = "DRIVER={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & $sPath_to_database & ";Extensions=asc,csv,tab,txt;"ConsoleWrite($connection & @CR)Func FireSQL
($connection, $search)Local $sResult = "", $adoCon, $adoRs, $adoSQL$adoCon = ObjCreate("ADODB.Connection")$adoCon.Open($connection);If @error Then Exit MsgBox(48, "Error", "error " & @error)$adoRs = ObjCreate("ADODB.Recordset")$adoSQL = "SELECT * FROM MonFichier.csv"$adoRs.CursorType = 2$adoRs.LockType = 3$adoRs.Open($adoSQL, $adoCon)With $adoRsIf .RecordCount ThenWhile Not .EOF$sResult = $sResult & "" & .Fields("Ligne").Value & "|" & .Fields("Cellule").Value & "|" & .Fields("Process").Value & @CRConsoleWrite(.Fields("Ligne").Value).MoveNextWEndEndIfEndWith$adoCon.CloseReturn $sResultEndFunc ;==>FireSQL
Re: [..]Etablir une connexion avec un fichier csv pour requête
Posté : lun. 24 avr. 2017 10:03
par Supernatural
J'ai réussi à établir une connexion avec mon fichier csv... enfin... (pour info, il ne faut pa de caractères spéciaux dans le nom du fichier csv)...
J'obtiens bien le nombre de lignes de mon fichier par contre je n'arrive pas à récupérer le nombre et le nom de mes colonnes... Ca ne me retourne que la première... Si une âme généreuse passe par là...
Je sais qu'il y a $oRs.fields.name, mais ça me retourne une erreur (^error)...
Merci par avance
#include <file.au3>;#include <_My_ADODB_Constants.au3>;======= les constantes ADO ===============================Global Const $adoProvider = "Microsoft.Jet.OLEDB.4.0";======= Votre programme ==================================Global $DBPath = "C:\temp\moncsv.csv"Global $base = "C:\temp"Global $fieldname, $aOptionValueIf Not FileExists($DBPath) Then MsgBox(16, "Error", "CSV file doesn't exist!" & @CRLF & "End of program.") _FileWriteLog(@ScriptDir & "\log\error.log", @UserName & ";" & @ComputerName & ";" & @IPAddress1 & ";" & "CSV file doesn't exists") ExitEndIfLocal $oConn = ObjCreate("ADODB.Connection")$oConn.ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & $base & ";Extensions=tab;Extended Properties=TEXT"$oConn.OpenLocal $oRs = ObjCreate("ADODB.Recordset")Local $SQL = "SELECT * FROM moncsv.csv"$oRs.CursorType = 1$oRs.LockType = 3$oRs.Open($SQL, $oConn)ConsoleWrite("RecordCount: " & $oRs.RecordCount & ", Fields.Count: " & $oRs.Fields.Count & @CRLF)$oConn.Close
Re: [..]Etablir une connexion avec un fichier csv pour requête
Posté : lun. 24 avr. 2017 12:19
par jchd
Ca fonctionne ici (nom du fichier à changer) :
Code : Tout sélectionner
#include <file.au3>
;#include <_My_ADODB_Constants.au3>
;======= les constantes ADO ===============================
;~ Global Const $adoProvider = "Microsoft.Jet.OLEDB.4.0"
;======= Votre programme ==================================
Global $DBPath = "codesnew.csv"
Global $base = "."
;~ Global $fieldname, $aOptionValue
If Not FileExists($DBPath) Then
MsgBox(16, "Error", "CSV file doesn't exist!" & @CRLF & "End of program.")
Exit
EndIf
Local $oConn = ObjCreate("ADODB.Connection")
$oConn.ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & $base & ""
$oConn.Open
Local $SQL = "SELECT * FROM codesnew.csv "
Local $oRs = ObjCreate("ADODB.Recordset")
With $oRs
.CursorType = 1
.LockType = 3
.Open($SQL, $oConn)
ConsoleWrite("RecordCount: " & .RecordCount() & ", Fields.Count: " & .Fields.Count() & @CRLF)
Local $sColNames
For $i = 0 To .Fields.Count - 1
$sColNames &= .Fields($i).Name & @TAB
Next
ConsoleWrite($sColNames & @LF)
_ArrayDisplay(.GetRows)
EndWith
$oRs = 0
$oConn.Close
Re: [..]Etablir une connexion avec un fichier csv pour requête
Posté : lun. 24 avr. 2017 13:30
par Supernatural
Merci jchd,
Malheureusement cela ne me retourne que les valeurs de ma première colonne, or j'ai 22 colonnes...
Le RecordCount me retourne bien le nombre de lignes (sauf la première qui correspond à mon nom de colonne), mais le .Fields.Count me retourne toujours 1 colonne...
J'avoue que je suis perdu...
Re: [..]Etablir une connexion avec un fichier csv pour requête
Posté : lun. 24 avr. 2017 14:19
par jchd
Est-ce bien un fichier .CSV (Comma Separated Values) ?
Col1;Col2;Col3 ne marchera pas
Col1<TAB>Col2<Tab>Col3 non plus
Col1,"Colonne numéro 2",Col3 sera OK
Re: [..]Etablir une connexion avec un fichier csv pour requête
Posté : lun. 24 avr. 2017 14:20
par Supernatural
C'est un fichier extension CSV avec comme séparateur ";". Je peux, si je veux avoir un fichier avec une extension *.xlsb, peut-être plus récent...
Re: [..]Etablir une connexion avec un fichier csv pour requête
Posté : lun. 24 avr. 2017 14:58
par Supernatural
Du coup, je me suis lancé sur l'extension *.xlsb.
J'arrive à me connecter à récupérer les valeurs qui m'intéresse, mais comme je suis un chanceux toutes catégories, il faut que le fichier xlsb soit ouvert, hors moi je ne veux pas qu'il soit ouvert... Comment faire la même chose mais classeur fermé?
Merci par avance
Désolé de passer du coq à l'âne mais je dois clore se projet avant la fin de la semaine
Ci-joint mon code.
Global Const $iCursorType = 0 ; adOpenForwardOnlyGlobal Const $iLockType = 1 ; adLockReadOnlyGlobal Const $iOptions = 512 ; adCmdTableDirect - Return all rows from the specified tableGlobal $oConn = ObjCreate("ADODB.Connection") ; Create a connection objectGlobal $oRs = ObjCreate("ADODB.Recordset") ; Create a recordset objectGlobal $sFilename = "C:\temp\monfichier.xlsb"Global $sADOConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' & $sFilename & ';Extended Properties="Excel 8.0;HDR=No"'$oConn.Open($sADOConnectionString) ; Open the connectionGlobal $sADOSQL = "Select * FROM [Valeurs$]" ; Select all records and all fields$oRs.Open($sADOSQL, $oConn, $iCursorType, $iLockType, $iOptions) ; Issue the SQL queryWith $oRs While Not .EOF ;..... BLA BALA BLA .MoveNext ; Move To the Next record WEndEndWith$oRs.Close ; Close the recordset$oRs = 0 ; Release the recordset object$oConn.Close ; Close the connection$oConn = 0 ; Release the connection object
Re: [..]Etablir une connexion avec un fichier csv pour requête
Posté : lun. 24 avr. 2017 16:11
par Supernatural
Je viens de trouver... Il faut remplacer le provider par Provider=Microsoft.ACE.OLEDB.12.0, je n'ai pas fait attention à la version d'Excel que j'utilise...

Re: [R]Etablir une connexion avec un fichier csv pour requête
Posté : lun. 24 avr. 2017 18:53
par jchd
Hé oui, comma <> semicolumn