root / tmp / org.txm.core / src / java / org / txm / scripts / importer / Factiva2XmlTxm.groovy @ 1688
History | View | Annotate | Download (8.3 kB)
1 | 881 | mdecorde | /**
|
---|---|---|---|
2 | 881 | mdecorde | * Main.
|
3 | 881 | mdecorde | *
|
4 | 881 | mdecorde | * @param args the args
|
5 | 881 | mdecorde | */
|
6 | 881 | mdecorde | // script de recherche de contenus entre balises dans un fichier xml
|
7 | 881 | mdecorde | |
8 | 881 | mdecorde | /**
|
9 | 881 | mdecorde | * @author Daniel Marin, Florent Bédécarrats
|
10 | 881 | mdecorde | * @author Matthieu Decorde
|
11 | 881 | mdecorde | * @copyright 2011 Daniel Marin & Florent Bédécarrats, for original Perl version
|
12 | 881 | mdecorde | * @copyright 2011 ENS de Lyon, for translation in Groovy
|
13 | 881 | mdecorde | * This software is licensed under the GNU GPL version 3.0 or later.
|
14 | 881 | mdecorde | */
|
15 | 1000 | mdecorde | package org.txm.scripts.importer;
|
16 | 881 | mdecorde | |
17 | 1000 | mdecorde | import org.txm.importer.ValidateXml |
18 | 1000 | mdecorde | |
19 | 881 | mdecorde | public run(File rootDir, String rep_final ) { |
20 | 881 | mdecorde | |
21 | 881 | mdecorde | // A RENSEIGNER #########################################
|
22 | 881 | mdecorde | |
23 | 881 | mdecorde | def fich_xml = rootDir.listFiles().grep(~/.*\.xml/) |
24 | 881 | mdecorde | println "$rootDir : $fich_xml"
|
25 | 881 | mdecorde | |
26 | 881 | mdecorde | def ext = ".xml" |
27 | 881 | mdecorde | //def rep_final = rootDir.getAbsolutePath()+"/out" // le nom du répertoire dans lequel on va créer les fichiers txm
|
28 | 881 | mdecorde | |
29 | 881 | mdecorde | List<String> Balises = ["<baseLanguage>","<date>","<sourceName>","<name>","<name>"] // balises XML à détecter |
30 | 881 | mdecorde | List<String> FinBalises = ["</baseLanguage>","</date>","</sourceName>","</name>","</name>"] |
31 | 881 | mdecorde | |
32 | 881 | mdecorde | List<String> Sections = ["<ppsarticle>","<industry ","<region ","<headline>","<tailParagraphs>"] // Balises indiquant qu'à 'intérieur de la section se trouvent les infos (sur plusieurs lignes contrairement à @Balises) |
33 | 881 | mdecorde | List<String> FinSections = ["</ppsarticle>","</industry>","</region>","</headline>","</tailParagraphs>"] |
34 | 881 | mdecorde | |
35 | 881 | mdecorde | def Headline = [] // le tableau dans lequel on va stocker le contenu de <headline> |
36 | 881 | mdecorde | def TailPara = [] // le tableau dans lequel on va stocker le contenu de <tailParagraphs> |
37 | 881 | mdecorde | |
38 | 881 | mdecorde | def NomsMeta = ["language=","date=","source=","subject=","country="] // les noms qui interviennent dans les méta-données du fichier final |
39 | 881 | mdecorde | // FIN A RENSEIGNER #####################################
|
40 | 881 | mdecorde | |
41 | 881 | mdecorde | def TestMeta = [0,0,0,0,0] // Tableau qui indique si les métadonnées sont disponibles dans le fichier |
42 | 881 | mdecorde | def MetaData = [] //le tableau des metadonnées |
43 | 881 | mdecorde | def metaData = "" // la chaine dans laquelle on va stocker les métadonnées |
44 | 881 | mdecorde | String temp = "" |
45 | 881 | mdecorde | def fich_out = ">" |
46 | 881 | mdecorde | def nom_in = "" |
47 | 881 | mdecorde | |
48 | 881 | mdecorde | def new_fich=0 // variable booleenne qui indique si on doit créer un nouveau txm |
49 | 881 | mdecorde | def industry=0 // variable booleenne qui indique qu'on est dans la section <industry> pour renseigner "subject" |
50 | 881 | mdecorde | def premIndustry=0 // variable booleenne qui indique qu'on a passé le 1er <industry> pour renseigner "subject" |
51 | 881 | mdecorde | def region=0 // variable booleenne qui indique qu'on est dans la section <region> pour renseigner "country" |
52 | 881 | mdecorde | def premRegion=0 // variable booleenne qui indique qu'on a passé le 1er <region> pour renseigner "country" |
53 | 881 | mdecorde | def copie=0 // variable booleenne qui indique si l'on doit copier le contenu de la ligne dans le fichier txm |
54 | 881 | mdecorde | def copieSec3=0 // variable qui indique si on est à l'intérieur de la section 3 |
55 | 881 | mdecorde | def copieSec4=0 // variable qui indique si on est à l'intérieur de la section 4 |
56 | 881 | mdecorde | |
57 | 881 | mdecorde | def num_fich=0 // le numéro du fichier traité |
58 | 881 | mdecorde | def char_num_fich="" // pour numéroter les fichiers fich_001 pour garder l'ordre alphabétique |
59 | 881 | mdecorde | |
60 | 881 | mdecorde | def i = 1 |
61 | 881 | mdecorde | |
62 | 881 | mdecorde | println "Création du répertoire dans lequel on va mettre les fichiers finaux txm"
|
63 | 881 | mdecorde | if (new File(rep_final).exists()) { |
64 | 881 | mdecorde | println "Le répertoire $rep_final existe"
|
65 | 881 | mdecorde | } |
66 | 881 | mdecorde | else {
|
67 | 881 | mdecorde | if (!new File(rep_final).mkdir()) { |
68 | 881 | mdecorde | println "Echec de la création du répertoire: $rep_final"
|
69 | 881 | mdecorde | return
|
70 | 881 | mdecorde | } |
71 | 881 | mdecorde | if (!new File(rep_final).canWrite()) { |
72 | 881 | mdecorde | println "Le répertoire '$rep_final' final est read-only"
|
73 | 881 | mdecorde | return
|
74 | 881 | mdecorde | } |
75 | 881 | mdecorde | } |
76 | 881 | mdecorde | |
77 | 881 | mdecorde | FileWriter ECRITURE
|
78 | 881 | mdecorde | for (File fich_in : fich_xml) { |
79 | 881 | mdecorde | if (fich_in.getName() == "import.xml") continue; |
80 | 881 | mdecorde | println "Validate $fich_in...";
|
81 | 881 | mdecorde | if (!ValidateXml.test(fich_in)) {
|
82 | 881 | mdecorde | println "skip $fich_in"
|
83 | 881 | mdecorde | continue;
|
84 | 881 | mdecorde | } |
85 | 881 | mdecorde | // open(LECTURE, fich_in) || die("erreur d'ouverture de $fich_in")
|
86 | 881 | mdecorde | println "on parcourt l'ensemble de $fich_in"
|
87 | 881 | mdecorde | def reader = new FileReader(fich_in) |
88 | 881 | mdecorde | String line = reader.readLine()
|
89 | 881 | mdecorde | while (line != null) |
90 | 881 | mdecorde | { |
91 | 881 | mdecorde | // on stocke le contenu de la ligne (et on efface le retour chariot à la fin)
|
92 | 881 | mdecorde | temp = line |
93 | 881 | mdecorde | temp = temp.trim() |
94 | 881 | mdecorde | temp = (temp =~ /^\s+/).replaceAll("") |
95 | 881 | mdecorde | temp = (temp =~ /^\t/).replaceAll("") |
96 | 881 | mdecorde | temp = temp.replaceAll("</paragraph>", "</paragraph><br/>") |
97 | 881 | mdecorde | |
98 | 881 | mdecorde | // On indique si on est dans la 1ère section de industry ou region pour prélever <name>
|
99 | 881 | mdecorde | if ((temp =~ Sections[1]) && (premIndustry==0)){ |
100 | 881 | mdecorde | industry=1
|
101 | 881 | mdecorde | premIndustry=1
|
102 | 881 | mdecorde | } |
103 | 881 | mdecorde | else if (temp =~ FinSections[1]){ |
104 | 881 | mdecorde | industry=0
|
105 | 881 | mdecorde | } |
106 | 881 | mdecorde | |
107 | 881 | mdecorde | if ((temp =~ Sections[2]) && (premRegion==0)){ |
108 | 881 | mdecorde | region = 1
|
109 | 881 | mdecorde | premRegion = 1
|
110 | 881 | mdecorde | } |
111 | 881 | mdecorde | else if (temp =~ FinSections[2]){ |
112 | 881 | mdecorde | region = 0
|
113 | 881 | mdecorde | } |
114 | 881 | mdecorde | |
115 | 881 | mdecorde | // on regarde si la balise de création de nouveau fichier est présente
|
116 | 881 | mdecorde | if (temp =~ Sections[0]){ |
117 | 881 | mdecorde | new_fich=1
|
118 | 881 | mdecorde | num_fich = num_fich+1
|
119 | 881 | mdecorde | nom_in = fich_in.getName() |
120 | 881 | mdecorde | nom_in = (nom_in =~ /$ext/).replaceAll("") |
121 | 881 | mdecorde | // Petit test pour numéroter les fichiers en 001, 002 plutôt que 1, 2 (ordre alphabétique)
|
122 | 881 | mdecorde | if (num_fich < 10){ |
123 | 881 | mdecorde | char_num_fich = "00"+num_fich
|
124 | 881 | mdecorde | } else if (num_fich<100) { |
125 | 881 | mdecorde | char_num_fich = "0"+num_fich
|
126 | 881 | mdecorde | } else {
|
127 | 881 | mdecorde | char_num_fich = num_fich |
128 | 881 | mdecorde | } |
129 | 881 | mdecorde | fich_out = new File(rep_final, nom_in + "_" + char_num_fich + ext) |
130 | 881 | mdecorde | //open(ECRITURE,"> $fich_out") || die("erreur d'ouverture de $fich_out ! $! \n")
|
131 | 881 | mdecorde | println("new file : "+fich_out)
|
132 | 881 | mdecorde | if (ECRITURE != null) ECRITURE.close() |
133 | 881 | mdecorde | ECRITURE = new FileWriter(fich_out) |
134 | 881 | mdecorde | } |
135 | 881 | mdecorde | |
136 | 881 | mdecorde | // Remplissage des métadonnées : ####################################################
|
137 | 881 | mdecorde | // Language
|
138 | 881 | mdecorde | if (temp =~ Balises[0]){ |
139 | 881 | mdecorde | temp = (temp =~ Balises[0]).replaceAll("") |
140 | 881 | mdecorde | temp = (temp =~ FinBalises[0]).replaceAll("") |
141 | 881 | mdecorde | |
142 | 881 | mdecorde | MetaData[0]=temp
|
143 | 881 | mdecorde | print " language trouve : "+MetaData[0]+" \n" |
144 | 881 | mdecorde | TestMeta[0]=1 |
145 | 881 | mdecorde | |
146 | 881 | mdecorde | } |
147 | 881 | mdecorde | // date
|
148 | 881 | mdecorde | if (temp =~ Balises[1]) { |
149 | 881 | mdecorde | temp = (temp =~ Balises[1]).replaceAll("") |
150 | 881 | mdecorde | temp = (temp =~ FinBalises[1]).replaceAll("") |
151 | 881 | mdecorde | MetaData[1]=temp
|
152 | 881 | mdecorde | print " date trouvee : "+MetaData[1]+" \n" |
153 | 881 | mdecorde | TestMeta[1]=1 |
154 | 881 | mdecorde | } |
155 | 881 | mdecorde | // source
|
156 | 881 | mdecorde | if (temp =~ Balises[2]){ |
157 | 881 | mdecorde | temp = (temp =~ Balises[2]).replaceAll("") |
158 | 881 | mdecorde | temp = (temp =~ FinBalises[2]).replaceAll("") |
159 | 881 | mdecorde | MetaData[2]=temp
|
160 | 881 | mdecorde | print " source trouvee : "+MetaData[2]+" \n" |
161 | 881 | mdecorde | TestMeta[2]=1 |
162 | 881 | mdecorde | } |
163 | 881 | mdecorde | // subject (on doit être dans la 1ère section <industry>)
|
164 | 881 | mdecorde | if ((temp =~ Balises[3]) && (industry==1)){ |
165 | 881 | mdecorde | temp = (temp =~ Balises[3]).replaceAll("") |
166 | 881 | mdecorde | temp = (temp =~ FinBalises[3]).replaceAll("") |
167 | 881 | mdecorde | MetaData[3]=temp
|
168 | 881 | mdecorde | industry=0
|
169 | 881 | mdecorde | print " Sujet trouve : "+MetaData[3]+" \n" |
170 | 881 | mdecorde | TestMeta[3]=1 |
171 | 881 | mdecorde | } |
172 | 881 | mdecorde | // country
|
173 | 881 | mdecorde | if ((temp =~ Balises[4]) && (region==1)){ |
174 | 881 | mdecorde | temp = (temp =~ Balises[4]).replaceAll("") |
175 | 881 | mdecorde | temp = (temp =~ FinBalises[4]).replaceAll("") |
176 | 881 | mdecorde | MetaData[4]=temp
|
177 | 881 | mdecorde | region=0
|
178 | 881 | mdecorde | print " Pays trouve : "+MetaData[4]+" \n" |
179 | 881 | mdecorde | TestMeta[4]=1 |
180 | 881 | mdecorde | |
181 | 881 | mdecorde | // Toutes les méta-données ont été trouvées, on assemble la chaîne
|
182 | 881 | mdecorde | metaData = "<article "
|
183 | 881 | mdecorde | for (i=0;i<(NomsMeta.size()+1);i++){ |
184 | 881 | mdecorde | if (TestMeta[i]==1){ |
185 | 881 | mdecorde | metaData = metaData+NomsMeta[i]+"\""+MetaData[i]+"\" " |
186 | 881 | mdecorde | } |
187 | 881 | mdecorde | else if (TestMeta[i]==0){ |
188 | 881 | mdecorde | metaData = metaData +NomsMeta[i]+"\"\" "
|
189 | 881 | mdecorde | } |
190 | 881 | mdecorde | } |
191 | 881 | mdecorde | metaData = "$metaData>\n"
|
192 | 881 | mdecorde | print " metaData : $metaData \n"
|
193 | 881 | mdecorde | } |
194 | 881 | mdecorde | // FIN Remplissage des métadonnées : #################################################
|
195 | 881 | mdecorde | |
196 | 881 | mdecorde | // On copie ou pas si on est ou pas dans <headline> ou <tailParagraphs>
|
197 | 881 | mdecorde | if (temp =~ Sections[3]){ |
198 | 881 | mdecorde | copieSec3=1
|
199 | 881 | mdecorde | } |
200 | 881 | mdecorde | if (temp =~ FinSections[3]){ |
201 | 881 | mdecorde | Headline.add(temp) |
202 | 881 | mdecorde | copieSec3=0
|
203 | 881 | mdecorde | } |
204 | 881 | mdecorde | if (temp =~ Sections[4]){ |
205 | 881 | mdecorde | copieSec4=1
|
206 | 881 | mdecorde | } |
207 | 881 | mdecorde | if (temp =~ FinSections[4]){ |
208 | 881 | mdecorde | TailPara.add(temp) |
209 | 881 | mdecorde | copieSec4=0
|
210 | 881 | mdecorde | } |
211 | 881 | mdecorde | |
212 | 881 | mdecorde | if (copieSec3 == 1){ |
213 | 881 | mdecorde | Headline.add(temp) |
214 | 881 | mdecorde | } |
215 | 881 | mdecorde | if (copieSec4 == 1){ |
216 | 881 | mdecorde | TailPara.add(temp) |
217 | 881 | mdecorde | } |
218 | 881 | mdecorde | |
219 | 881 | mdecorde | if (temp =~ FinSections[0]){ |
220 | 881 | mdecorde | ECRITURE.write("$metaData\n")
|
221 | 881 | mdecorde | for (i=0;i<(Headline.size());i++){ |
222 | 881 | mdecorde | if (i==0 || i==Headline){ |
223 | 881 | mdecorde | ECRITURE.write(Headline[i].toString()+"\n")
|
224 | 881 | mdecorde | } |
225 | 881 | mdecorde | else{
|
226 | 881 | mdecorde | ECRITURE.write("\t"+Headline[i]+"\n") |
227 | 881 | mdecorde | } |
228 | 881 | mdecorde | } |
229 | 881 | mdecorde | for (i=0;i<(TailPara.size());i++){ |
230 | 881 | mdecorde | if (i==0 || i==TailPara){ |
231 | 881 | mdecorde | ECRITURE.write(TailPara[i].toString()+"\n")
|
232 | 881 | mdecorde | } |
233 | 881 | mdecorde | else{
|
234 | 881 | mdecorde | ECRITURE.write("\t"+TailPara[i]+"\n") |
235 | 881 | mdecorde | } |
236 | 881 | mdecorde | } |
237 | 881 | mdecorde | ECRITURE.write("</article>")
|
238 | 881 | mdecorde | |
239 | 881 | mdecorde | new_fich=0
|
240 | 881 | mdecorde | industry=0
|
241 | 881 | mdecorde | region=0
|
242 | 881 | mdecorde | premIndustry=0
|
243 | 881 | mdecorde | premRegion=0
|
244 | 881 | mdecorde | MetaData=[]
|
245 | 881 | mdecorde | TestMeta=[0,0,0,0,0] |
246 | 881 | mdecorde | Headline=[]
|
247 | 881 | mdecorde | TailPara=[]
|
248 | 881 | mdecorde | |
249 | 881 | mdecorde | ECRITURE.close() |
250 | 881 | mdecorde | print "fichier $char_num_fich traite.\n"
|
251 | 881 | mdecorde | } |
252 | 881 | mdecorde | line = reader.readLine() |
253 | 881 | mdecorde | } |
254 | 881 | mdecorde | ECRITURE.close() |
255 | 881 | mdecorde | reader.close() |
256 | 881 | mdecorde | num_fich = 0
|
257 | 881 | mdecorde | } |
258 | 881 | mdecorde | } |
259 | 881 | mdecorde | |
260 | 881 | mdecorde | String userDir = System.getProperty("user.home"); |
261 | 881 | mdecorde | File rootDir = new File(userDir, "xml/factiva") |
262 | 881 | mdecorde | File outdir = new File(rootDir, "out2") |
263 | 881 | mdecorde | run(rootDir, outdir.getAbsolutePath()); |