Créer un fichier avec une partie du contenu d'un schema.ini

[Résolu]
Signaler
Messages postés
13
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
27 janvier 2010
-
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
-
Bonjour,

J'ai un schema.ini qui contient des blocs du type

[fichier1.txt]
textdelimited
col1=ID integer
col2=TRUC Text Width 6
col3=CHOSE Text Width 6

[fichier2.txt]

textdelimited

col1=ID Integer

col2=TRUC Text Width 6

col12=CHOSE Text Width 6

et je voudrai créer un fichier file_col.ini avec
[fichier1.txt]
ID
TRUC
CHOSE

 [fichier2.txt]

ID

TRUC

CHOSE

Es ce que c'est possible? Je suis pas vraiment un grand utilisateur de vb.

Merci pour l'aide que vous pourrez m'apporter.

10 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,

ATTENTION dans la déclaration,Dim intFilRead, intFilWrite As Integer
intFilRead n'est pas de type Integer mais Variant.
pour avoir deux integer sur la même ligne

Dim intFilRead As Integer, intFilWrite As Integer

Un peu de couleur
Sub file_transform()
'Variable pour l'attribution du numéro auto pour les ouvertures de nouveaux canaux
'Utilisés lors de la lecture et l'écriture dans des fichiers
Dim intFilRead As Integer
Dim intFilWrite As Integer

'Variable d'accès au fichier
Dim strFic_entree As String
'Variable contenant la ligne du fichier tester
Dim strLine As String

   'Chemin pour accéder aux fichiers
   strFic_entree = "C:\Documents and Settings\projet\"
   
   On Error Resume Next 'si il a une erreur on continu
   'Initialisation des numéros et ouverture du fichier en lecture
   intFilRead = FreeFile
   Open strFic_entree & "schema.ini" For Input As #intFilRead
   'Initialisation des numéros et ouverture du fichier en écriture
   intFilWrite = FreeFile
   Open strFic_entree & "schema2.ini" For Output As #intFilWrite
   'Test sur l'ouverture des fichiers :
   If Err.Number <> 0 Then
       Call MsgBox(Err.Number & Chr(13) & Err.Description)
       Call Err.Clear
   End If

   'On boucle la lecture du fichier jusqu'à la fin
   Do While Not EOF(intFilRead)
       Line Input #intFilRead, strLine
       'Si la ligne commence par [ alors
       If Left(strLine, 1) = "[" Then
           'On l'écrit dans le fichier
           Print #intFilWrite, strLine
       'Sinon si la ligne commence par col alors
       ElseIf Left(strLine, 3) = "Col" Then
           'On récupère l'élément après le = puis avant " "
           strLine = Mid$(strLine, InStr(1, strLine, "=") + 1)
           strLine = Mid$(strLine, 1, InStr(1, strLine, " ") - 1)
           'On l'écrit dans le fichier
           Print #intFilWrite, strLine
       'Sinon si la ligne est vide alors
       ElseIf strLine = Empty Then
           'On l'écrit dans le fichier
           Print #intFilWrite, strLine
       End If
   Loop
   
   'Fermeture des canaux
   Close #intFilWrite
   Close #intFilRead

End Sub , ----
[../code.aspx?ID=41455 By Renfield]
PS:Si tu estimes que ton problème est résolu,
penses à appuyer sur réponse acceptée sur le OU les posts qui t'ont aider à avancer.

@+: Ju£i€n
Pensez: Réponse acceptée
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Re,

"mais c'est juste le numéro d'un canal!" Il prend la valeur d'un Integer en retour de FreeFile mais avant il est déclaré en Variant.

Pour la couleu direct j'utilise l'AddIn de VB6 posté par [../code.aspx?ID=41455 Renfield]
suffit de cliquer sur le lien
@+: Ju£i€n
Pensez: Réponse acceptée
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
46
salut,

peux-tu indiquer le but?

INI est une structure, utilisable par API

on retrouvera donc des SECTIONS [
fichier1.txt

]

et des libellés et valeurs attachées
col1=ID integer




mais dans ton exemple, aucune des 2 ne respecte cette norme

1 => un libellé dans rien :
textdelimited


2 => tu veux en sortir aussi des libellé sans rien :
TRUC




si tu veux faire TRUC=
là c'est possible par API
sinon faut le faire à la par code (open / print) mais la question du but final se pose ;)

tu as tout le code nécessaire sur CODYX.ORG
++

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
"....1 = > un libellé dans rien : textdelimited ..."

Ce fichier est correctement construit ( enfin presque, le textdelimiter me pose aussi un problème, normalement ça devrai etre Format=FixedLength ), il ne s'agit pas d'un fichier ini classique.
C'est un fichier Schema, c'est à dire un fichier qui est utiliser pour indiquer le schéma d'une base de donnée, lorsque celle-ci est concrétisée par des fichiers textes.

On peut effectivement très bien utiliser des fichiers textes correctement structuré avec les outils de bases de données comme s'il s'agissait d'une réelle base. Dans ce cas, la base est caractérisée par le dossier contenant les fichiers, les tables étant les fichiers eux-même.

Une description complète de ce type de fichier est consultable ici --> http://msdn.microsoft.com/en-us/library/ms709353.aspx

Pour en revenir à la question, extraire le nom des colonnes, oui. Faut en voir l'interet, mais c'est possible. Il faut, comme dit PCPT, lire chaque ligne et en extraire manuellement l'information souhaitée pour en reconstruire, manuellement aussi un autre fichier.

---- Sevyc64  (alias Casy) ----<hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
Il y a surement plus simple mais voici une possiblité pour passer
de col1= ID Integer à ID
Dim P As String
   P = "col1=ID Integer"
   P = Mid$(P, InStr(1, P, "=") + 1)
   P = Mid$(P, 1, InStr(1, P, " ") - 1)
   Call MsgBox(P), ----
[../code.aspx?ID=41455 By Renfield]
Après suffit de suivre les indications de [../auteur/CASY/333139.aspx casy] et [../auteur/PCPT/401740.aspx PCPT] ('luuut a vous deux)

@+: Ju£i€n
Pensez: Réponse acceptée
Messages postés
13
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
27 janvier 2010

Bonjour à vous tous et merci de votre aide
la structure du fichier ini source n'est pas à modifier et elle est bonne. Elle permet en effet de définir une structure d'une table mais dans un fichier externe.

>>Format=FixedLength n'est pas conforme pour mon logiciel.

j'ai besoin de créer un fichier temporaire contenant la même chose que le précédent pour définir la liste des titre de champs existant dans chaque fichier et qui sera pré chargé.

Pour l'instant le fichier existe mais dois être rempli à la main (inutile). c'est pour ça que je veux le générer. au lancement de l'application et le détruire à la fin du traitement.

Le but c'est ouvrir mon fichier 1 en lecture
ouvir un fichier 2 en écriture
on boucle la lecture jusqu'a la fin du fichier
si la ligne commence par un [ on écrit la lignesinon si la ligne commence par colon split  sur le on prend le deuxième morceau que l'
on re split sur l'espace on récupère le premier morceau
on l'écrit

sinon rien
on ferme l'écriture du fichier 2
on ferme la lecture du fichier 1

Voilà ce que je voudrais faire.

vous en pensez quoi?
Merci
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
Etant donné que tu as une idée très claire de ce que tu souhaites faire, je pense que tu seras en mesure d'utiliserwww.codyx.orgcorrectement.
Ensuite si tu as un problème sur l'utilisation de tel ou tel code, reviens nous voir.

@+: Ju£i€n
Pensez: Réponse acceptée
Messages postés
13
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
27 janvier 2010

[../auteur/JRIVET/89254.aspx jrivet]
a répondu à une bonne partie ;) merci

c'est un élément de ma boucle. ca marche comme le split c'est bien
maintenant je vais faire mais boucles et je vous remet le code après

Merci à vous encore une fois
Messages postés
13
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
27 janvier 2010

<meta http-equiv= "Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 10" />
<meta name="Originator" content="Microsoft Word 10" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5C8209553c%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
<o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="place">
</o:smarttagtype>
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:HyphenationZone>21</w:HyphenationZone>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]-->
<!--[if !mso]><object
classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui></object>
<style>
st1\:*{behavior:url(#ieooui) }
</style>
<![endif]-->
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Courier;
panose-1:2 7 4 9 2 2 5 2 4 4;
mso-font-charset:0;
mso-generic-font-family:modern;
mso-font-format:other;
mso-font-pitch:fixed;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:ComicSansMS;
panose-1:0 0 0 0 0 0 0 0 0 0;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-format:other;
mso-font-pitch:auto;
mso-font-signature:3 0 0 0 1 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
@page Section1
{size:595.3pt 841.9pt;
margin:70.85pt 70.85pt 70.85pt 70.85pt;
mso-header-margin:35.4pt;
mso-footer-margin:35.4pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Tableau Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->


Voilà ce que j'ai fait et c'est parfait ;) merci


encore.












______________________________________________________




Option Explicit












Sub
file_transform()












'Variable pour l'attribution du numéro auto pour les ouvertures de
nouveaux canaux





'Utilisés lors de la lecture et l'écriture dans des fichiers





Dim
intFilRead , intFilWrite
As Integer





'Variable d'accès au fichier





Dim
strFic_entree
As String





'Variable contenant la ligne du fichier tester





Dim
strLine
As String












'Chemin pour accéder aux fichiers





strFic_entree =
"C:\Documents and
Settings\projet"












On Error Resume Next
'si il a
une erreur on continu












'Initialisation des numéros et ouverture du fichier en lecture





intFilRead = FreeFile





Open strFic_entree &
"schema.ini"
For
Input
As
#intFilRead





'Initialisation des numéros et ouverture du fichier en écriture





intFilWrite = FreeFile





Open strFic_entree &
"schema2.ini"
For
Output
As
#intFilWrite













'Test sur l'ouverture des fichiers :





If
Err.Number <>

0

Then





    MsgBox Err.Number & Chr(

13


) &

Err.Description





End If













'On boucle la lecture du fichier jusqu'à la fin





Do While Not
EOF(intFilRead)





    Line Input #intFilRead, strLine





            'Si la ligne commence par [ alors





    If
Left(strLine,

1


) =

"["
Then





           'On l'écrit dans le fichier





    Print #intFilWrite, strLine












           'Sinon si la ligne commence par col alors









    ElseIf
Left ( strLine,

3


) =

"Col"
Then





           'On récupère l'élément après le = puis avant " "





        strLine =
Mid$

(

strLine , InStr(

1


,

strLine,
" ="

) +


1


)






        strLine =
Mid$

(

strLine ,

1


,

InStr(

1


,

strLine,
" "

) -


1


)






                      'On l'écrit dans le fichier





        Print #intFilWrite, strLine





           'Sinon si la ligne est vide alors





    ElseIf
strLine = Empty
Then





           'On l'écrit dans le fichier





        Print #intFilWrite, strLine





    End If





<st1:place>
Loop
</st1:place>





<st1:place>


</st1:place>








'Fermeture des canaux





Close #intFilWrite





Close #intFilRead













End Sub
Messages postés
13
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
27 janvier 2010

Salut [auteur/JRIVET/89254.aspx jrivet],

ATTENTION dans la déclaration, Dim intFilRead, intFilWrite As Integer
intFilRead n'est pas de type Integer mais Variant.
A bon ?! mais c'est juste le numéro d'un canal!!! Pourquoi l'un serait de type variant et pas l'autre dans ce cas?

Et comment puis-je mettre le code en couleur directement?

Merci