[R]Etablir une connexion avec un fichier csv pour requête

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

[R]Etablir une connexion avec un fichier csv pour requête

#1

Message 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
Modifié en dernier par Supernatural le lun. 24 avr. 2017 16:13, modifié 1 fois.
Supernatural
Niveau 2
Niveau 2
Messages : 26
Enregistré le : jeu. 06 avr. 2017 15:18
Status : Hors ligne

Re: [..]Etablir une connexion avec un fichier csv pour requête

#2

Message 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
Supernatural
Niveau 2
Niveau 2
Messages : 26
Enregistré le : jeu. 06 avr. 2017 15:18
Status : Hors ligne

Re: [..]Etablir une connexion avec un fichier csv pour requête

#3

Message 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

 
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2273
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..]Etablir une connexion avec un fichier csv pour requête

#4

Message 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
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Supernatural
Niveau 2
Niveau 2
Messages : 26
Enregistré le : jeu. 06 avr. 2017 15:18
Status : Hors ligne

Re: [..]Etablir une connexion avec un fichier csv pour requête

#5

Message 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...
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2273
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..]Etablir une connexion avec un fichier csv pour requête

#6

Message 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
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Supernatural
Niveau 2
Niveau 2
Messages : 26
Enregistré le : jeu. 06 avr. 2017 15:18
Status : Hors ligne

Re: [..]Etablir une connexion avec un fichier csv pour requête

#7

Message 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...
Supernatural
Niveau 2
Niveau 2
Messages : 26
Enregistré le : jeu. 06 avr. 2017 15:18
Status : Hors ligne

Re: [..]Etablir une connexion avec un fichier csv pour requête

#8

Message 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
 
Supernatural
Niveau 2
Niveau 2
Messages : 26
Enregistré le : jeu. 06 avr. 2017 15:18
Status : Hors ligne

Re: [..]Etablir une connexion avec un fichier csv pour requête

#9

Message 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:
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2273
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R]Etablir une connexion avec un fichier csv pour requête

#10

Message par jchd »

Hé oui, comma <> semicolumn
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre