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 ; adOpenForwardOnly
Global Const $iLockType = 1 ; adLockReadOnly
Global Const $iOptions = 2 ; adCmdTable
Global $oConnection = ObjCreate("ADODB.Connection") ; Create a connection object
Global $oRecordset = ObjCreate("ADODB.Recordset") ; Create a recordset object
Global $sConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source=' & $csvpath & ';Extended Properties="Text;HDR=YES;FMT=Delimited(,)"'

$oConnection.Open($sConnectionString) ; Open the connection
Global $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 query
With $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
    WEnd
EndWith
$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 connection
Local $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 $adoRs
If .RecordCount Then
While Not .EOF
$sResult = $sResult & "" & .Fields("Ligne").Value & "|" & .Fields("Cellule").Value & "|" & .Fields("Process").Value & @CR
ConsoleWrite(.Fields("Ligne").Value)
.MoveNext
WEnd
EndIf
EndWith

$adoCon.Close
Return $sResult
EndFunc ;==>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à... :mrgreen:

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, $aOptionValue

If 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")
    Exit
EndIf

Local $oConn = ObjCreate("ADODB.Connection")
$oConn.ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & $base & ";Extensions=tab;Extended Properties=TEXT"
$oConn.Open

Local $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 :roll:

Ci-joint mon code.
Global Const $iCursorType = 0 ; adOpenForwardOnly
Global Const $iLockType = 1 ; adLockReadOnly
Global Const $iOptions = 512 ; adCmdTableDirect - Return all rows from the specified table
Global $oConn = ObjCreate("ADODB.Connection") ; Create a connection object
Global $oRs = ObjCreate("ADODB.Recordset") ; Create a recordset object
Global $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 connection
Global $sADOSQL = "Select * FROM [Valeurs$]" ; Select all records and all fields
$oRs.Open($sADOSQL, $oConn, $iCursorType, $iLockType, $iOptions) ; Issue the SQL query
With $oRs
    While Not .EOF
        ;..... BLA BALA BLA
   .MoveNext ; Move To the Next record
    WEnd
EndWith

$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... :oops:

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