Requête SQL sur fichier TXT

Le
FdeCourt
Bonjour,

Avec Excel je me connecte avec différentes base de données pour
récupérer des informations que je mets dans un fichier texte.
Il y a plus de 3 millions d'enregistrements.
Cela marche nickel.
Par contre, ensuite, j'aimerais pouvoir faire des requêtes sur ce
fichier texte, comme si c'était une base de données.

J'arrive à ouvrir mon fichier texte avec ODBC :

cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source==
"
& Chemin & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited;IMEX
=1"";"

La requête que je souhaiterai lancer est celle-ci :
sqlString = "select count(*), FULL from DONNEES.txt group by FULL
having count(*) = 1"

Or ca refuse (L
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
michdenis
Le #18381251
Un petit exemple :

Requete = "SELECT toto1, count(*) FROM denis.txt GROUP BY toto1 having count(*)=1"

toto1 -> est un nom de champ du fichier
denis.txt -> nom du fichier texte

Ton séparateur de ton fichier doit être la virgule
L'extension du fichier .txt ... csv n'est pas important !

Tu obtiendras dans excel 2 champs :
A ) le nom de chacun des items où l'entrée est unique
B ) la valeur 1 pour chacun de ces champs.

Voici un exemple complet d'une petite procédure :

'------------------------------------------------------
Sub Exemple()
'Doit ajouter la bibliothèque
'Activex Data Object 2.x Librairy

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, Rg As Range
Dim Chemin As String, File As String
'Où est situé le fichier
Chemin = "C:UsersPowerUser"
'Nom du fichier
File = "Denis.txt"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & ";" & _
"Extended Properties=""text;HDR=Yes;FMTÞlimited"""

Requete = "SELECT toto1, count(*) FROM " & File & _
" GROUP BY toto1 having count(*)=1"

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie des données vers la "Feuil2") nom à adapter ...
Set Rg = Worksheets("Feuil2").Range("A1")
Rg.CopyFromRecordset Rst
Rst.Close: Conn.Close
Set Rg = Nothing
End Sub
'------------------------------------------------------



"FdeCourt"
Bonjour,

Avec Excel je me connecte avec différentes base de données pour
récupérer des informations que je mets dans un fichier texte.
Il y a plus de 3 millions d'enregistrements.
Cela marche nickel.
Par contre, ensuite, j'aimerais pouvoir faire des requêtes sur ce
fichier texte, comme si c'était une base de données.

J'arrive à ouvrir mon fichier texte avec ODBC :

cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
& Chemin & ";" & _
"Extended Properties=""text;HDR=YES;FMTÞlimited;IMEX
=1"";"

La requête que je souhaiterai lancer est celle-ci :
sqlString = "select count(*), FULL from DONNEES.txt group by FULL
having count(*) = 1"

Or ca refuse (L
FdeCourt
Le #18382741
Hello Michdenis,

Merci pour ton aide, mais cela ne fonctionne pas non plus.
Le chemin d'accès vers mon fichier est correct, de même que son nom.

Par contre j'y arrive avec DAO :

Dim strPath As String
Dim strTable As String
Dim strFolder As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim xx As String
strPath = ThisWorkbook.Path & "DONNEES.txt"
strTable = Right(strPath, Len(strPath) - InStrRev(strPath, ""))
strFolder = Left(strPath, InStrRev(strPath, "") - 1)

Set db = DAO.OpenDatabase(strFolder, False, False, _
"Text;Database=" & strFolder & ";HDR=NO;Table=" & strTable)
' F1 = Field numéro 1
Set rs = db.OpenRecordset("SELECT count(*), F1 from [" & strTable &
"] group by F1 having count(*) = 1", DAO.dbOpenSnapshot, _
DAO.dbReadOnly, DAO.dbReadOnly)

Cordialement,

F.



On 14 jan, 00:44, "michdenis"
Un petit exemple :

Requete = "SELECT toto1, count(*) FROM denis.txt GROUP BY toto1 having count(*)=1"

toto1 -> est un nom de champ du fichier
denis.txt -> nom du fichier texte

Ton séparateur de ton fichier doit être la virgule
L'extension du fichier .txt ... csv n'est pas important !

Tu obtiendras dans excel 2 champs :
A ) le nom de chacun des items où l'entrée est unique
B ) la valeur 1 pour chacun de ces champs.

Voici un exemple complet d'une petite procédure :

'------------------------------------------------------
Sub Exemple()
'Doit ajouter la bibliothèque
'Activex Data Object 2.x Librairy

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, Rg As Range
Dim Chemin As String, File As String
'Où est situé le fichier
Chemin = "C:UsersPowerUser"
'Nom du fichier
File = "Denis.txt"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & Chemin & ";" & _
    "Extended Properties=""text;HDR=Yes;FMTÞlimited"""

Requete = "SELECT toto1, count(*) FROM " & File & _
             " GROUP BY toto1 having count(*)=1"

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie des données vers la "Feuil2") nom à adapter ...
Set Rg = Worksheets("Feuil2").Range("A1")
Rg.CopyFromRecordset Rst
Rst.Close: Conn.Close
Set Rg = Nothing
End Sub
'------------------------------------------------------

"FdeCourt"
Bonjour,

Avec Excel je me connecte avec différentes base de données pour
récupérer des informations que je mets dans un fichier texte.
Il y a plus de 3 millions d'enregistrements.
Cela marche nickel.
Par contre, ensuite, j'aimerais pouvoir faire des requêtes sur ce
fichier texte, comme si c'était une base de données.

J'arrive à ouvrir mon fichier texte avec ODBC :

cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="
& Chemin & ";" & _
          "Extended Properties=""text;HDR=YES;FMTÞlimit ed;IMEX
=1"";"

La requête que je souhaiterai lancer est celle-ci :
sqlString = "select  count(*), FULL from DONNEES.txt group by FULL
having count(*) = 1"

Or ca refuse (L


michdenis
Le #18383761
La macro suivante fonctionne rondement... si ton fichier texte
n'a pas de lignes d'en-tête déterminé par HDR=NO dans la
ligne de code de connexion, on doit alors remplacer le champ
"toto1" du texte de la requête de mon exemple par F1 qui
représente le premier champ du fichier texte.

IL EST ESSENTIEL QUE TU METTES À JOUR LA RÉFÉRENCE LE MDAC

Pour ce faire, tu vas sur le site de Microsoft et tu télécharges
MDAC 2.8 qui elle-même a une mise à jour MDAC 2.8 (sp1)

Doté de cette dernière mise à jour, le code qui suit s'exécute sans ambages !

'----------------------------------------------------
Sub Exemple()
'Doit ajouter la bibliothèque
'Activex Data Object 2.8 Librairy

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, Rg As Range
Dim Chemin As String, File As String
'Où est situé le fichier
Chemin = "C:UsersPowerUser"
'Nom du fichier
File = "Denis.txt"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & ";" & _
"Extended Properties=""text;HDR=NO;FMTÞlimited"""

Requete = "SELECT F1 FROM " & File & _
" GROUP BY F1 having count(*)=1"

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie des données vers la "Feuil2") nom à adapter ...
Set Rg = Worksheets("Feuil2").Range("A1")
Rg.CopyFromRecordset Rst
Rst.Close: Conn.Close
Set Rg = Nothing
End Sub
'----------------------------------------------------






"FdeCourt"
Hello Michdenis,

Merci pour ton aide, mais cela ne fonctionne pas non plus.
Le chemin d'accès vers mon fichier est correct, de même que son nom.

Par contre j'y arrive avec DAO :

Dim strPath As String
Dim strTable As String
Dim strFolder As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim xx As String
strPath = ThisWorkbook.Path & "DONNEES.txt"
strTable = Right(strPath, Len(strPath) - InStrRev(strPath, ""))
strFolder = Left(strPath, InStrRev(strPath, "") - 1)

Set db = DAO.OpenDatabase(strFolder, False, False, _
"Text;Database=" & strFolder & ";HDR=NO;Table=" & strTable)
' F1 = Field numéro 1
Set rs = db.OpenRecordset("SELECT count(*), F1 from [" & strTable &
"] group by F1 having count(*) = 1", DAO.dbOpenSnapshot, _
DAO.dbReadOnly, DAO.dbReadOnly)

Cordialement,

F.



On 14 jan, 00:44, "michdenis"
Un petit exemple :

Requete = "SELECT toto1, count(*) FROM denis.txt GROUP BY toto1 having count(*)=1"

toto1 -> est un nom de champ du fichier
denis.txt -> nom du fichier texte

Ton séparateur de ton fichier doit être la virgule
L'extension du fichier .txt ... csv n'est pas important !

Tu obtiendras dans excel 2 champs :
A ) le nom de chacun des items où l'entrée est unique
B ) la valeur 1 pour chacun de ces champs.

Voici un exemple complet d'une petite procédure :

'------------------------------------------------------
Sub Exemple()
'Doit ajouter la bibliothèque
'Activex Data Object 2.x Librairy

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, Rg As Range
Dim Chemin As String, File As String
'Où est situé le fichier
Chemin = "C:UsersPowerUser"
'Nom du fichier
File = "Denis.txt"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & ";" & _
"Extended Properties=""text;HDR=Yes;FMTÞlimited"""

Requete = "SELECT toto1, count(*) FROM " & File & _
" GROUP BY toto1 having count(*)=1"

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

'Copie des données vers la "Feuil2") nom à adapter ...
Set Rg = Worksheets("Feuil2").Range("A1")
Rg.CopyFromRecordset Rst
Rst.Close: Conn.Close
Set Rg = Nothing
End Sub
'------------------------------------------------------

"FdeCourt"
Bonjour,

Avec Excel je me connecte avec différentes base de données pour
récupérer des informations que je mets dans un fichier texte.
Il y a plus de 3 millions d'enregistrements.
Cela marche nickel.
Par contre, ensuite, j'aimerais pouvoir faire des requêtes sur ce
fichier texte, comme si c'était une base de données.

J'arrive à ouvrir mon fichier texte avec ODBC :

cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
& Chemin & ";" & _
"Extended Properties=""text;HDR=YES;FMTÞlimited;IMEX
=1"";"

La requête que je souhaiterai lancer est celle-ci :
sqlString = "select count(*), FULL from DONNEES.txt group by FULL
having count(*) = 1"

Or ca refuse (L


FdeCourt
Le #18395761
Michdenis,

Cela ne fonctionne toujours pas.
Le problème est qu'avec ma solution, je n'arrive pas a sélectionner 2
champs de mon fichier texte (F1 et F2). Il me le ressort en erreur.
Il est tard, j'étudierais ca demain matin.

Merci pour ton aide.

Cordialement,

F.
michdenis
Le #18397951
Dans l'exemple que je t'ai donné, si tu veux utilisé (affiché 2 champs)
dans la requête, cette dernière s'écrirait de cette manière :

Tu nommes tes 2 champs dans le Select et aussi dans la
clause Group By

Requete = "SELECT count(*),toto1,bozo1 FROM " & File & _
" GROUP BY toto1,bozo1 having count(*)=1"

Si tu as besoin de trucs plus élaborés... il y a le forum sur Access
où les répondants sont sûrement plus ferrés en SQL.




"FdeCourt"
Michdenis,

Cela ne fonctionne toujours pas.
Le problème est qu'avec ma solution, je n'arrive pas a sélectionner 2
champs de mon fichier texte (F1 et F2). Il me le ressort en erreur.
Il est tard, j'étudierais ca demain matin.

Merci pour ton aide.

Cordialement,

F.
michdenis
Le #18396581
Pour pouvoir utiliser 2 champs dans la requête, tu dois
modifier le texte de la requête de mon exemple comme suit :

Requete = "SELECT count(*),toto1,bozo1 FROM " & File & _
" GROUP BY toto1,bozo1 having count(*)=1"

Le nom des 2 champs doivent apparaître dans la clause Select
ainsi que dans la clause Group By.

Si besoin, consulte le forum... il doit bien y avoir quelques gurus
en SQL.




"FdeCourt"
Michdenis,

Cela ne fonctionne toujours pas.
Le problème est qu'avec ma solution, je n'arrive pas a sélectionner 2
champs de mon fichier texte (F1 et F2). Il me le ressort en erreur.
Il est tard, j'étudierais ca demain matin.

Merci pour ton aide.

Cordialement,

F.
FdeCourt
Le #18401101
Salut Michdenis,

Cela ne fonctionnait pas car mes fichiers textes n'étaient pas bon.
Maintenant que je les ai corrigé, tout roule comme un charme.

Je te remercie pour ton aide.

Cordialement

F.
Publicité
Poster une réponse
Anonyme