Statistics
| Revision:

root / tmp / org.txm.core / src / java / org / txm / scripts / importer / Factiva2XmlTxm.groovy @ 2473

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());