Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requête SQL sur fichier TXT

7 réponses
Avatar
FdeCourt
Bonjour,

Avec Excel je me connecte avec diff=E9rentes base de donn=E9es pour
r=E9cup=E9rer 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=EAtes sur ce
fichier texte, comme si c'=E9tait une base de donn=E9es.

J'arrive =E0 ouvrir mon fichier texte avec ODBC :

cnx.ConnectionString =3D "Provider=3DMicrosoft.Jet.OLEDB.4.0;Data Source=3D=
"
& Chemin & ";" & _
"Extended Properties=3D""text;HDR=3DYES;FMT=3DDelimited;IMEX
=3D1"";"

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

Or ca refuse (L

7 réponses

Avatar
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" a écrit dans le message de groupe de discussion :

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
Avatar
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" wrote:
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" a écrit dans le message de groupe de di scussion :

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


Avatar
michdenis
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" a écrit dans le message de groupe de discussion :

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" wrote:
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" a écrit dans le message de groupe de discussion :

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


Avatar
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.
Avatar
michdenis
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" a écrit dans le message de groupe de discussion :

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.
Avatar
michdenis
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" a écrit dans le message de groupe de discussion :

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.
Avatar
FdeCourt
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.