Aller au contenu

RESOLU Récupérer des infos d'un doc vers une BDD


SIrlink

Messages recommandés

Bonjour à tous !

Je suis un INpactien de longue durée mais je crois n'avoir jamais posté. :byebye:

Je suis actuellement en stage de 1ère année de BTS IG, et mon tuteur m'a demandé une tâche pour laquelle je ne sais par où commencer.

Il y a une base de données existante et en ligne qui contient des références de bouquins.

Et un fichier word comprenant des infos sur les bouquins et qui se présente sous cette forme :

Code : 1234

Intitule : Le bio c'est bien

Description du bouquin

etc...

J'aimerai donc pouvoir récupérer les données en rouge pour les insérer dans la base de données. Le code étant la clé primaire.

Le problème est que je ne sais pas quel outil utilisé ni quoi comment :p .

Il faudrait rechercher dans le texte ce qui est après "Code :" et ce qui est après "Intitule :"... puis le mettre en forme pour l'importer dans la base.

Je cherche juste des pistes et un "plan" pour démarrer, et non pas bien sûr un code tout cuit !

Merci d'avance :keskidit: .

RESOLUTION

Code en PHP

	function update_function($id, $nombrepage, $dimension, $description)
{
  $reponse=mysql_query("UPDATE livre SET nombrepage='$nombrepage', dimension='$dimension', description='$description' where codelivre=$id") or die(mysql_error());
}

//Je change le nom du fichier à chaque fois (il y en a que quelques uns)
$file = "Jardin.txt";
$code = "Code : ";
$edition = "Editions";
$prix = "Prix";
$id = -1;

$fp = fopen($file, "r");
$tableau = file($file);
$i=0;
while  (($buf = fgets($fp)))
//Je crée la description, elle se trouve entre Editions et Prix (donc je regarde sur les 4 lignes suivantes si il y a Prix)
{	if (!strncmp($buf, $edition, strlen($edition)))
{	if(strncmp($tableau[$i+1], $prix, strlen($prix)))	
	{$description = substr($tableau[$i+1], 0);
	if(strncmp($tableau[$i+2], $prix, strlen($prix)))
	{$description .= substr($tableau[$i+2], 0);
	if(strncmp($tableau[$i+3], $prix, strlen($prix)))
	{$description .= substr($tableau[$i+3], 0);
	if(strncmp($tableau[$i+4], $prix, strlen($prix)))
	$description .= substr($tableau[$i+4], 0);
}
}
}
}
if (!strncmp($buf, $code, strlen($code)))
{
	$buf3 = $tableau[$i];
	$id = substr($buf3, strlen($code));

	$buf2 = $tableau[$i+1];
	$nombrepage = substr($buf2, 0);

	$buf2 = $tableau[$i+2];
	$dimension = substr($buf2, 0);
	if ($id >= 0)
		update_function($id, $nombrepage, $dimension, $description);
}
$i++;
}

fclose($fp);
?>

Lien vers le commentaire
Partager sur d’autres sites

un bon conseil : commence par un copier coller de ton .doc dans un .txt

ou, si quelqu'un a une doc sur ce format de fichier... mais ca sent le truc relou/useless

ensuite, ca peut se faire en shellscript, en C, en peusheupeu, ... sois plus precis :

- ca doit s'utiliser dans quelles conditions (OS, type d'utilisateur, quid de la "lisibilite" du code, ...) ?

- un langage de predilection (impose, ou qu tu maitrises plus) ?

Lien vers le commentaire
Partager sur d’autres sites

Alors pour être plus précis, j'ai fait un catalogue en ligne pour mon entreprise, c'est des bouquins qui sont affichés en php depuis la base de données.

Mais ils manquent des informations dans quelques champs, ces infos sont dans le .doc (ou le .txt), je veux juste prendre les infos et les mettre dans la base de données en complétant les enregistrements selon le code du livre.

Donc ma mission c'est de remplir la base de données automatiquement depuis un fichier texte pas formaté pour être importé dans une base de données.

Comme langage je pratique (à un niveau relativement faible) le PHP, le C, visual basic et je connais bien la suite office.

Lien vers le commentaire
Partager sur d’autres sites

dommage que tu ne connaisse pas bash, c'aurait ete l'occasion pour un bout d'awk :)

autrement, php, c'est bien faisable aussi (un truc comme ca, faut scripter, tu vas pas t'amuser a calculer/allouer la memoire a la main...)

function unsert_or_update_function($id, $title, $com)
{
echo "INSERT INTO table (filed0, field1, field2) VALUES ($id, '$title', '$com')";
}

$file = "/path/de/ton/truc";
$code = "Code : ";
$titre = "Intitule : ";
$id = -1;

$fp = fopen($file, "r");

while  (($buf = fgets($fp)))
{
if (!strncmp($buf, $code, strlen($code)))
{
	if ($id >= 0)
		insert_or_update_function($id, $tt, $comm);
	$id = substr($buf, strlen($code));
else if (!strncmp($buf, $titre, strlen($titre)))
{
	$tt = substr($buf, strlen($titre));
	$comm = "";
}
else
	$comm .= (strlen($comm) ? " " : "").$buf;
}
if ($id >= 0)
insert_or_update_function($id, $tt, $comm);
fclose($fp);

une fois que t'en es la, que ca "fonctionne", regarde :

- quel type de base (mysql, postgres, oracle, sqlite, mssql, .... ?)

- comment te connecter a ta base (php.net le sait certainement)

- adapte l'insert pour le faire passer (dans l'ideal, coder de quoi basher les simples quotes sur $title et $com)

Lien vers le commentaire
Partager sur d’autres sites

Donc ma mission c'est de remplir la base de données automatiquement depuis un fichier texte pas formaté pour être importé dans une base de données.

En gros, tu dois faire une sorte d’interface (ou pas).

Du coup, avant de te poser des questions sur la partie techno à utiliser, t’as une partie spécification à définir.

  • La pérennité de ton développement ?
    • Est-ce que ce sera utilisé une seule fois pour initialiser ton catalogue ?
    • Ou est ce qu’il verra son utilisation étalée dans le temps (avec la possibilité de faire des mises à jour des données en base avec ton script)

    [*]Qui va utiliser ton développement ?

    • N’importe quel utilisateur du catalogue ?
    • Une liste d’utilisateur / éditeur ?
    • Un admin unique ?
    • Toi ?
    • Dois-tu prévoir des mécanismes d’accès concurrent aux données ?

    [*]Comment est produit ton fichier ?

    • Est-ce que les fichiers à intégrer existent déjà ?
    • Proviennent-ils d’une autre application ?
    • N’est-il pas préférable de prévoir une page d’administration (type formulaire) pour permettre à un utilisateur/éditeur de faire les mises à jour manuellement ?

    [*]Quelle est la structure du fichier contenant les données à intégrer ?

    • Est un simple fichier plat, un fichier xml, … ?
    • Est-ce que les champs sont de longueur fixe, fichier CSV, autre ?
    • Est-ce que ton fichier peut contenir des informations relative à un seul bouquin (et donc avoir autant de fichiers que de bouquins), ou un seul fichier pour l’intégralité des bouquins, ou N fichiers contenant les infos de M bouquins…
    • Est-ce que le fichier peut contenir des mises à jour de données ?

    [*]Quelle est la volumétrie des données à importer ?

    • Combien de fichier ?
    • Combien de bouquins à mettre à jour ?

    [*]…

Même si ca peut te paraître superflu tout ça, c’est une bonne manière d’appréhender un développement, définir précisément comment doit fonctionner ton développement.

Et laisse tomber le format Word. C’est n’est pas « lisible simplement » par un programme, du coup t’es obligé de passer par des API spécifiques pour manipuler ces fichiers…

Alors qu’un fichier texte tout bête, t’en fait ce que tu veux simplement…

Pour le langage, pour faire simple, prend celui que t’as a disposition et avec lequel tu es le plus à l’aise.

Même s’il y a des langages plus adaptés a certaines situations que d’autres, si tu n’y a jamais touché tu risques de faire du code buggés, et perdre du temps sur des questions purement technique liés au langage utilisé…

Et le type de base utilisé peut également changer pas mal de truc (comme l'utilisation de sql*loader pour oracle par exemple)

Lien vers le commentaire
Partager sur d’autres sites

dommage que tu ne connaisse pas bash, c'aurait ete l'occasion pour un bout d'awk :)

autrement, php, c'est bien faisable aussi (un truc comme ca, faut scripter, tu vas pas t'amuser a calculer/allouer la memoire a la main...)

...

une fois que t'en es la, que ca "fonctionne", regarde :

- quel type de base (mysql, postgres, oracle, sqlite, mssql, .... ?)

- comment te connecter a ta base (php.net le sait certainement)

- adapte l'insert pour le faire passer (dans l'ideal, coder de quoi basher les simples quotes sur $title et $com)

Merci pour ce code !

Je vais le regarder plus en détails.

C'est une base MySQL que je manipule déjà avec des pages php.

En gros, tu dois faire une sorte d’interface (ou pas).

Du coup, avant de te poser des questions sur la partie techno à utiliser, t’as une partie spécification à définir.

  • La pérennité de ton développement ?
    • Est-ce que ce sera utilisé une seule fois pour initialiser ton catalogue ?
    • Ou est ce qu’il verra son utilisation étalée dans le temps (avec la possibilité de faire des mises à jour des données en base avec ton script)

C'est une utilisation unique pour initialiser (ou plutôt faire une grosse mise à jour)

[*]Qui va utiliser ton développement ?

  • N’importe quel utilisateur du catalogue ?
  • Une liste d’utilisateur / éditeur ?
  • Un admin unique ?
  • Toi ?
  • Dois-tu prévoir des mécanismes d’accès concurrent aux données ?

Le développement du script pour mettre la base de données à jour ne sera utilisé que par moi, le catalogue est à destination des clients (professionnels).

[*]Comment est produit ton fichier ?

  • Est-ce que les fichiers à intégrer existent déjà ?
  • Proviennent-ils d’une autre application ?
  • N’est-il pas préférable de prévoir une page d’administration (type formulaire) pour permettre à un utilisateur/éditeur de faire les mises à jour manuellement ?

C'est en fait le catalogue papier en version texte fait par le designer du catalogue, et c'est les seul fichier où se trouvent certaines informations par fichier.

[*]Quelle est la structure du fichier contenant les données à intégrer ?

  • Est un simple fichier plat, un fichier xml, … ?
  • Est-ce que les champs sont de longueur fixe, fichier CSV, autre ?
  • Est-ce que ton fichier peut contenir des informations relative à un seul bouquin (et donc avoir autant de fichiers que de bouquins), ou un seul fichier pour l’intégralité des bouquins, ou N fichiers contenant les infos de M bouquins…
  • Est-ce que le fichier peut contenir des mises à jour de données ?

C'est plusieurs fichiers texte qui sont prévu pour s'intégrer dans un catalogue papier. Il y a un fichier par catégorie de livre (catégorie qui est déjà attribuée aux livres dans la BDD)

Je met un extrait du doc :

PETITE BOTTE DE PAILLE

Bill Steen, Athena Swentzell, Wayne J. Bingham

Editions Goutte de Sable

L’objectif est de stimuler l’imagination pour faire naître des idées à ceux qui rêvent d’une maison en paille, et de donner un point de départ à ceux qui sont déjà prêts à construire.

Prix : 29.00¤

Code : 74003

261 pages

22 x 22 cm

LA PAILLE, DU CHAMP A LA CONSTRUCTION Pour une performance énergétique du bâtiment

Kandé Hamadou

Editions Nature et Progres

Tout ce qu’il faut savoir pour construire une maison en paille. Les règles permettant d’assurer la pérennité du bâtiment dans le temps, les techniques spécifiques de recouvrement extérieur et intérieur des murs en ballots de paille pressée...

Prix : 5.90¤

Code : 59013

32 pages

21 x 15 cm

En rouge encore une fois les 3 données que je dois récupérer par livre selon le code (vert).

Ce sont des champs texte de longueur variable dans la base de données.

[*]Quelle est la volumétrie des données à importer ?

  • Combien de fichier ?
  • Combien de bouquins à mettre à jour ?

[*]…

24 fichiers de quelques ko chacun pour environ 1400 livres.

Et laisse tomber le format Word. C’est n’est pas « lisible simplement » par un programme, du coup t’es obligé de passer par des API spécifiques pour manipuler ces fichiers…

Alors qu’un fichier texte tout bête, t’en fait ce que tu veux simplement…

Pour le langage, pour faire simple, prend celui que t’as a disposition et avec lequel tu es le plus à l’aise.

Même s’il y a des langages plus adaptés a certaines situations que d’autres, si tu n’y a jamais touché tu risques de faire du code buggés, et perdre du temps sur des questions purement technique liés au langage utilisé…

Et le type de base utilisé peut également changer pas mal de truc (comme l'utilisation de sql*loader pour oracle par exemple)

Oui merci je l'ai mis en .txt, pour le langage c'est le PHP que je maîtrise le mieux donc je vais me lancer là dedans.

Merci à vous deux, je regarde le code de Mephisto et j'reviens ! :transpi:

Lien vers le commentaire
Partager sur d’autres sites

Bonjour !!

J'ai travaillé le code de Mephisto et je suis proche du résultat !!

Je rappelle la structure des infos que je dois récupérer :

PETITE BOTTE DE PAILLE

Bill Steen, Athena Swentzell, Wayne J. Bingham

Editions Goutte de Sable

L’objectif est de stimuler l’imagination pour faire naître des idées à ceux qui rêvent d’une maison en paille, et de donner un point de départ à ceux qui sont déjà prêts à construire.

Prix : 29.00€

Code : 74003

261 pages

22 x 22 cm

LA PAILLE, DU CHAMP A LA CONSTRUCTION Pour une performance énergétique du bâtiment

Kandé Hamadou

Editions Nature et Progres

Tout ce qu’il faut savoir pour construire une maison en paille. Les règles permettant d’assurer la pérennité du bâtiment dans le temps, les techniques spécifiques de recouvrement extérieur et intérieur des murs en ballots de paille pressée...

Prix : 5.90€

Code : 59013

32 pages

21 x 15 cm

CONSTRUIRE EN PAILLE AUJOURD’HUI

A et H. Gruber

Editions Terre Vivante

Matériaux économique et durable, elle est facile à protéger contre l’humidité, elle est de plus un merveilleux isolant. Permettant de bâtir des maisons solides avec des outils simples.

Prix : 16.50€

Code : 7051

128 pages

15 x 21 cm

Voilà où en est le code :

function update_function($id, $nombrepage, $dimension, $description)
{//Fonction de mise à jour selon le code du livre
  $reponse=mysql_query("UPDATE livre SET nombrepage='$nombrepage', dimension='$dimension', description='$description' where codelivre=$id") or die(mysql_error());
}

$file = "habitat.txt";
$code = "Code : ";
$id = -1;

$fp = fopen($file, "r");
while  (($buf = fgets($fp)))
{
if (!strncmp($buf, $code, strlen($code)))
{//Si on est sur la ligne du code
//Récupération du code
	$position=ftell($fp);
	$id = substr($buf, strlen($code));

//Récupération du nombre de page (qui est sur la ligne en dessous)
	$position2=$position+1;
	fseek($fp, $position2);
	$buf2 = fgets($fp);
	$nombrepage = substr($buf2, 0);
//Récupération du nombre de page (qui est 2 lignes en dessous du code)
	$position2=$position+2;
	fseek($fp, $position2);
	$buf2 = fgets($fp);
	$dimension = substr($buf2, 0);

//Récupération de la description(qui est 2 lignes au dessus du code)
	$position2=$position-2;
	fseek($fp, $position2);
	$buf2 = fgets($fp);
	$description = substr($buf2, 0);

	if ($id >= 0)
//envoi
		update_function($id, $nombrepage, $dimension, $description);
//Repositionnement
	fseek($fp, $position);
}
}

fclose($fp);
?>

Il y a plusieurs problème dans ce code :

-Le nombre de pages est enregistré mais il manque le premier caractère de la ligne à chaque fois (soit le premier chiffre)

-Pour les dimensions il me reprend le nombre de pages mais cette fois avec les 2 premiers caractères manquants...

-Pour la description il prend le dernier chiffre du code du livre :dd:

Donc je comprend vraiment pas ! Si vous avez des pistes merci !!

:D

EDIT : J'ai en fait compris que le problème venait du pointeur, il augmente de caractere en caractere et non pas ligne par ligne, donc il faudrait que je trouve un moyen de lui dire que c'est la ligne suivante ou précédente.

Comment faire ?

Merci !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Je ne doute pas que quelqu'un te donne la réponse pour corriger les problèmes de positionnement du pointeur, et que donc tu atteignes l'objectif annoncé de compléter la base (à un instant T donné), mais je tenais juste à appuyer sur ce que te disait Sarx sur la définition de ton développement.

Quand tu réponds ça :

Le développement du script pour mettre la base de données à jour ne sera utilisé que par moi, le catalogue est à destination des clients (professionnels).

Ca me fait douter de la pérennité de la chose.

1/ Que se passera-t'il quand tu auras fini ton stage en entreprise (si c'est un stage) ?

2/ Comment ton patron complétera-t'il la BDD que tu es en train d'enrichir quand tu seras parti et que l'entreprise continuera à vivre sa vie ? Est-ce que les nouveaux bouquins dans le futur seront directement saisis dans la BDD ? Ou toujours dans un fichier txt/word ? Dans le 2eme cas, il faudra que tu crées une routine pour automatiser l'export des infos du txt vers la BDD.

Etc etc

3/ En fait, si ce n'est pas déjà fait, il faudrait que tu crées une mini spécification des besoins de ton patron (avec ou sans lui, ou alors tu lui présentes une ébauche, et tu lui demandes de compléter avec ce qu'il souhaite en +). Et toi, tu écris ensuite dans un document logiciel comment tu réponds à chaque besoin/exigence.

Je pousse peut-être le bouchon un peu loin, mais les petits programmes qu'ont fait sur un coin de table ont tendance à rester et durer en entreprise, d'où la nécessité de bien tracer/réaliser le tout...

Lien vers le commentaire
Partager sur d’autres sites

1/ Que se passera-t'il quand tu auras fini ton stage en entreprise (si c'est un stage) ?

J'ai créé une interface pour rajouter les nouveaux donc de ce côté là pas de problème. :transpi:

Sinon j'ai enfin réussi à faire un code qui marche le voici :

	function update_function($id, $nombrepage, $dimension, $description)
{
  $reponse=mysql_query("UPDATE livre SET nombrepage='$nombrepage', dimension='$dimension', description='$description' where codelivre=$id") or die(mysql_error());
}

//Je change le nom du fichier à chaque fois (il y en a que quelques uns)
$file = "Jardin.txt";
$code = "Code : ";
$edition = "Editions";
$prix = "Prix";
$id = -1;

$fp = fopen($file, "r");
$tableau = file($file);
$i=0;
while  (($buf = fgets($fp)))
//Je crée la description, elle se trouve entre Editions et Prix (donc je regarde sur les 4 lignes suivantes si il y a Prix)
{	if (!strncmp($buf, $edition, strlen($edition)))
{	if(strncmp($tableau[$i+1], $prix, strlen($prix)))	
	{$description = substr($tableau[$i+1], 0);
	if(strncmp($tableau[$i+2], $prix, strlen($prix)))
	{$description .= substr($tableau[$i+2], 0);
	if(strncmp($tableau[$i+3], $prix, strlen($prix)))
	{$description .= substr($tableau[$i+3], 0);
	if(strncmp($tableau[$i+4], $prix, strlen($prix)))
	$description .= substr($tableau[$i+4], 0);
}
}
}
}
if (!strncmp($buf, $code, strlen($code)))
{
	$buf3 = $tableau[$i];
	$id = substr($buf3, strlen($code));

	$buf2 = $tableau[$i+1];
	$nombrepage = substr($buf2, 0);

	$buf2 = $tableau[$i+2];
	$dimension = substr($buf2, 0);
	if ($id >= 0)
		update_function($id, $nombrepage, $dimension, $description);
}
$i++;
}

fclose($fp);
?>

Merci à tous et en particulier à Mephisto pour votre aide :D !

A bientot !! :youhou:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...