OVH Cloud OVH Cloud

lecture de fichier Oracle

1 réponse
Avatar
pmanet
j'ai besoin d'une aide

j'ai à récupérer dans FilemakerPro (6) des données venant d'une base
Oracle. J'imagine que le problème est commun, mais c'est la première
fois que je le rencontre sous cette forme.

la table toto est fournie sous forme de 2 fichiers, l'un en toto.txt
contenant les datas séparées par un pipe (mais pas de fin de ligne),
l'autre toto.ind contenant la longeur de chaque enregistrement, seul
moyen de repérer les fins de ligne. C'est probablement une structure
classique, mais c'est pénible. (NB : on me fournit aussi un fichier
Oracle global, mais c'est encore pire...)

je saurais exploiter ça dans FMP avec des scripts et quelques
bidouillages, sauf que là, il y a 600 tables... Je dois donc envisager
une méthode universelle pour transformer ces tables en quelques chose
d'utilisable par FMP, par exemple un fichier tabulé avec des vraies fon
de ligne.

J'hésite entre :
- Applescript ; j'ai su faire sous MacOS7, mais je me souviens que
c'était pénible et mal documenté, et il fallait beaucoup expérimenter
pour les formules d'ouverture et d'éciture de fichier. Avantage : permet
de travailler en droppant un dossier dessus, et facilité d'interfaçage
avec FMP.
- perl : je ne connais pas du tout, mais on dit souvent ici que c'est
assez facile et puissant ; de plus, c'est portable sur des PC, ce qui
pourrait rendre service à des collègues (ce n'est pas indispensable).

le principe de l'algorithme ressemblerait à :

**********************

"fin_ligne" : séparateur des lignes du fichier index
"fin_ligne2" : séparateur des lignes du fichier tab
"separateur_initial" : séparateur de rubrique dans le .txt init (|)
"separateur_final" : séparateur de rubrique dans le .tab final (tab)

désignation d'un dossier

pour chaque fichier du dossier avec l'extension .ind

>- fichier suivant

mettre "nom_fichier" à nom du fichier sauf .ind

mettre "index", "debut_index", "fin_index", "debut_texte" à 0
"texte_en_cours" à vide
mettre "fin_fichier" à taille de "nom_fichier".ind
si "fin_fichier" = 0 fichier suivant->
fin si

créer fichier "nom_fichier".tab


>- boucle tab
mettre "fin_index" à position du caractère "fin_ligne" à partir de
"debut_index" du fichier "nom_fichier".ind
mettre "index" à valeur numérique de extrait "debut_index", "fin_index"
du fichier "nom_fichier".ind
mettre "debut_index" à "fin_index"+1

mettre "texte_en_cours" à extrait "debut_texte", "debut_texte"+"index"
du fichier "nom_fichier".txt (à ajuster en fonction de problèmes de
bornes...)
remplacer toutes les occurences de "separateur_initial" par
"separateur_final" dans "texte_en_cours"
ajouter "texte_en_cours" et "fin_ligne2" à "nom_fichier".tab

mettre "debut_texte" à "debut_texte"+"index"
si "fin_index"<"fin_fichier", boucle tab->
fin si (à bricoler selon langage utilisé)

fermer "nom_fichier".tab
si plus de fichier : fin
fichier suivant->

**********************


quels conseils pour ce petit utilitaire ?

merci de votre attention...

1 réponse

Avatar
kurtz le pirate
In article <2005063019143321771@[10.0.0.1]>, (manet)
wrote:

::j'ai besoin d'une aide
::
::j'ai à récupérer dans FilemakerPro (6) des données venant d'une base
::Oracle. J'imagine que le problème est commun, mais c'est la première
::fois que je le rencontre sous cette forme.
::
::la table toto est fournie sous forme de 2 fichiers, l'un en toto.txt
::contenant les datas séparées par un pipe (mais pas de fin de ligne),
::l'autre toto.ind contenant la longeur de chaque enregistrement, seul
::moyen de repérer les fins de ligne. C'est probablement une structure
::classique, mais c'est pénible. (NB : on me fournit aussi un fichier
::Oracle global, mais c'est encore pire...)
::
::je saurais exploiter ça dans FMP avec des scripts et quelques
::bidouillages, sauf que là, il y a 600 tables... Je dois donc envisager
::une méthode universelle pour transformer ces tables en quelques chose
::d'utilisable par FMP, par exemple un fichier tabulé avec des vraies fon
::de ligne.
::
::J'hésite entre :
::- Applescript ; j'ai su faire sous MacOS7, mais je me souviens que
::c'était pénible et mal documenté, et il fallait beaucoup expérimenter
::pour les formules d'ouverture et d'éciture de fichier. Avantage : permet
::de travailler en droppant un dossier dessus, et facilité d'interfaçage
::avec FMP.
::- perl : je ne connais pas du tout, mais on dit souvent ici que c'est
::assez facile et puissant ; de plus, c'est portable sur des PC, ce qui
::pourrait rendre service à des collègues (ce n'est pas indispensable).
::
::le principe de l'algorithme ressemblerait à :
::
::**********************
::
::"fin_ligne" : séparateur des lignes du fichier index
::"fin_ligne2" : séparateur des lignes du fichier tab
::"separateur_initial" : séparateur de rubrique dans le .txt init (|)
::"separateur_final" : séparateur de rubrique dans le .tab final (tab)
::
::désignation d'un dossier
::
::pour chaque fichier du dossier avec l'extension .ind
::
::>- fichier suivant
::
::mettre "nom_fichier" à nom du fichier sauf .ind
::
::mettre "index", "debut_index", "fin_index", "debut_texte" à 0
::"texte_en_cours" à vide
::mettre "fin_fichier" à taille de "nom_fichier".ind
::si "fin_fichier" = 0 fichier suivant->
::fin si
::
::créer fichier "nom_fichier".tab
::
::
::>- boucle tab
::mettre "fin_index" à position du caractère "fin_ligne" à partir de
::"debut_index" du fichier "nom_fichier".ind
::mettre "index" à valeur numérique de extrait "debut_index", "fin_index"
::du fichier "nom_fichier".ind
::mettre "debut_index" à "fin_index"+1
::
::mettre "texte_en_cours" à extrait "debut_texte", "debut_texte"+"index"
::du fichier "nom_fichier".txt (à ajuster en fonction de problèmes de
::bornes...)
::remplacer toutes les occurences de "separateur_initial" par
::"separateur_final" dans "texte_en_cours"
::ajouter "texte_en_cours" et "fin_ligne2" à "nom_fichier".tab
::
::mettre "debut_texte" à "debut_texte"+"index"
::si "fin_index"<"fin_fichier", boucle tab->
::fin si (à bricoler selon langage utilisé)
::
::fermer "nom_fichier".tab
::si plus de fichier : fin
::fichier suivant->
::
::**********************
::
::
::quels conseils pour ce petit utilitaire ?
::
::merci de votre attention...

ben déja, pour convertir "|" en "retour a la ligne" tu peux faire un
truc du genre :

perl -p -e 's/|/r/g' < source.txt > macfile.txt

pour le reste, faudrait un peu plus creuser. j'ai pas trop le temps (et
je ne suis pas expert) mais lire, toujours en perl, le fichier qui
contient la longueur de chaque champs et insérer dans chaque "ligne" du
fichier /t/ à la bonne position, ne doit pas être bien compliqué...

perl restant à mon avis le moyen le plus simple.