Statistics
| Revision:

root / tmp / org.txm.core / src / groovy / org / txm / importer / Factiva2XmlTxm.groovy @ 187

History | View | Annotate | Download (8.3 kB)

1
/**
2
 * Main.
3
 *
4
 * @param args the args
5
 */
6
// script de recherche de contenus entre balises dans un fichier xml
7

    
8
/**
9
 *  @author Daniel Marin, Florent Bédécarrats
10
 *  @author Matthieu Decorde
11
 *  @copyright 2011 Daniel Marin &  Florent Bédécarrats, for original Perl version
12
 *  @copyright 2011 ENS de Lyon, for translation in Groovy
13
 *  This software is licensed under the GNU GPL version 3.0 or later. 
14
 */
15
package org.txm.importer;
16

    
17
public run(File rootDir, String rep_final ) {
18

    
19
        // A RENSEIGNER #########################################
20
        
21
        def fich_xml = rootDir.listFiles().grep(~/.*\.xml/)
22
        println "$rootDir : $fich_xml"
23

    
24
        def ext = ".xml"
25
        //def rep_final = rootDir.getAbsolutePath()+"/out" // le nom du répertoire dans lequel on va créer les fichiers txm
26

    
27
        List<String> Balises = ["<baseLanguage>","<date>","<sourceName>","<name>","<name>"] // balises XML à détecter
28
        List<String> FinBalises = ["</baseLanguage>","</date>","</sourceName>","</name>","</name>"]
29

    
30
        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)
31
        List<String> FinSections = ["</ppsarticle>","</industry>","</region>","</headline>","</tailParagraphs>"]
32

    
33
        def Headline = [] // le tableau dans lequel on va stocker le contenu de <headline>
34
        def TailPara = [] // le tableau dans lequel on va stocker le contenu de <tailParagraphs>
35

    
36
        def NomsMeta = ["language=","date=","source=","subject=","country="] // les noms qui interviennent dans les méta-données du fichier final
37
        // FIN A RENSEIGNER #####################################
38

    
39
        def TestMeta = [0,0,0,0,0] // Tableau qui indique si les métadonnées sont disponibles dans le fichier
40
        def MetaData = [] //le tableau des metadonnées
41
        def metaData = "" // la chaine dans laquelle on va stocker les métadonnées
42
        String temp = ""
43
        def fich_out = ">"
44
        def nom_in = ""
45

    
46
        def new_fich=0 // variable booleenne qui indique si on doit créer un nouveau txm
47
        def industry=0 // variable booleenne qui indique qu'on est dans la section <industry> pour renseigner "subject"
48
        def premIndustry=0 // variable booleenne qui indique qu'on a passé le 1er <industry> pour renseigner "subject"
49
        def region=0 // variable booleenne qui indique qu'on est dans la section <region> pour renseigner "country"
50
        def premRegion=0 // variable booleenne qui indique qu'on a passé le 1er <region> pour renseigner "country"
51
        def copie=0 // variable booleenne qui indique si l'on doit copier le contenu de la ligne dans le fichier txm
52
        def copieSec3=0 // variable qui indique si on est à l'intérieur de la section 3
53
        def copieSec4=0 // variable qui indique si on est à l'intérieur de la section 4
54

    
55
        def num_fich=0 // le numéro du fichier traité
56
        def char_num_fich="" // pour numéroter les fichiers fich_001 pour garder l'ordre alphabétique
57

    
58
        def i = 1
59

    
60
        println "Création du répertoire dans lequel on va mettre les fichiers finaux txm"
61
        if (new File(rep_final).exists()) {
62
                println "Le répertoire $rep_final existe"
63
        }
64
        else {
65
                if (!new File(rep_final).mkdir()) {
66
                        println "Echec de la création du répertoire: $rep_final"
67
                        return
68
                }
69
                if (!new File(rep_final).canWrite()) {
70
                        println "Le répertoire '$rep_final' final est read-only"
71
                        return
72
                }
73
        }
74

    
75
        FileWriter ECRITURE
76
        for (File fich_in : fich_xml) {
77
                if (fich_in.getName() == "import.xml") continue;
78
                println "Validate $fich_in...";
79
                if (!ValidateXml.test(fich_in)) {
80
                        println "skip $fich_in"
81
                        continue;
82
                }
83
                // open(LECTURE, fich_in) || die("erreur d'ouverture de $fich_in")
84
                println "on parcourt l'ensemble de $fich_in"
85
                def reader = new FileReader(fich_in)
86
                String line = reader.readLine()
87
                while (line != null)
88
                {
89
                        // on stocke le contenu de la ligne (et on efface le retour chariot à la fin)
90
                        temp = line
91
                        temp = temp.trim()
92
                        temp = (temp =~ /^\s+/).replaceAll("")
93
                        temp = (temp =~ /^\t/).replaceAll("")
94
                        temp = temp.replaceAll("</paragraph>", "</paragraph><br/>")
95

    
96
                        // On indique si on est dans la 1ère section de industry ou region pour prélever <name>
97
                        if ((temp =~ Sections[1]) && (premIndustry==0)){
98
                                industry=1
99
                                premIndustry=1
100
                        }
101
                        else if (temp =~ FinSections[1]){
102
                                industry=0
103
                        }
104

    
105
                        if ((temp =~ Sections[2]) && (premRegion==0)){
106
                                region = 1
107
                                premRegion = 1
108
                        }
109
                        else if (temp =~ FinSections[2]){
110
                                region = 0
111
                        }
112

    
113
                        // on regarde si la balise de création de nouveau fichier est présente
114
                        if (temp =~ Sections[0]){
115
                                new_fich=1
116
                                num_fich = num_fich+1
117
                                nom_in = fich_in.getName()
118
                                nom_in = (nom_in =~ /$ext/).replaceAll("")
119
                                // Petit test pour numéroter les fichiers en 001, 002 plutôt que 1, 2 (ordre alphabétique)
120
                                if (num_fich < 10){
121
                                        char_num_fich = "00"+num_fich
122
                                } else if (num_fich<100) {
123
                                        char_num_fich = "0"+num_fich
124
                                } else {
125
                                        char_num_fich = num_fich
126
                                }
127
                                fich_out = new File(rep_final, nom_in + "_" + char_num_fich + ext)
128
                                //open(ECRITURE,"> $fich_out") || die("erreur d'ouverture de $fich_out ! $! \n")
129
                                println("new file : "+fich_out)
130
                                if (ECRITURE != null) ECRITURE.close()
131
                                ECRITURE = new FileWriter(fich_out)
132
                        }
133

    
134
                        // Remplissage des métadonnées : ####################################################
135
                        // Language
136
                        if (temp =~ Balises[0]){
137
                                temp = (temp =~ Balises[0]).replaceAll("")
138
                                temp = (temp =~ FinBalises[0]).replaceAll("")
139

    
140
                                MetaData[0]=temp
141
                                print " language trouve : "+MetaData[0]+" \n"
142
                                TestMeta[0]=1
143

    
144
                        }
145
                        // date
146
                        if (temp =~ Balises[1]) {
147
                                temp = (temp =~ Balises[1]).replaceAll("")
148
                                temp = (temp =~ FinBalises[1]).replaceAll("")
149
                                MetaData[1]=temp
150
                                print " date trouvee : "+MetaData[1]+" \n"
151
                                TestMeta[1]=1
152
                        }
153
                        // source
154
                        if (temp =~ Balises[2]){
155
                                temp = (temp =~ Balises[2]).replaceAll("")
156
                                temp = (temp =~ FinBalises[2]).replaceAll("")
157
                                MetaData[2]=temp
158
                                print " source trouvee : "+MetaData[2]+" \n"
159
                                TestMeta[2]=1
160
                        }
161
                        // subject (on doit être dans la 1ère section <industry>)
162
                        if ((temp =~ Balises[3]) && (industry==1)){
163
                                temp = (temp =~ Balises[3]).replaceAll("")
164
                                temp = (temp =~ FinBalises[3]).replaceAll("")
165
                                MetaData[3]=temp
166
                                industry=0
167
                                print " Sujet trouve : "+MetaData[3]+" \n"
168
                                TestMeta[3]=1
169
                        }
170
                        // country
171
                        if ((temp =~ Balises[4]) && (region==1)){
172
                                temp = (temp =~ Balises[4]).replaceAll("")
173
                                temp = (temp =~ FinBalises[4]).replaceAll("")
174
                                MetaData[4]=temp
175
                                region=0
176
                                print " Pays trouve : "+MetaData[4]+" \n"
177
                                TestMeta[4]=1
178

    
179
                                // Toutes les méta-données ont été trouvées, on assemble la chaîne
180
                                metaData = "<article "
181
                                for (i=0;i<(NomsMeta.size()+1);i++){
182
                                        if (TestMeta[i]==1){
183
                                                metaData = metaData+NomsMeta[i]+"\""+MetaData[i]+"\" "
184
                                        }
185
                                        else if (TestMeta[i]==0){
186
                                                metaData = metaData +NomsMeta[i]+"\"\" "
187
                                        }
188
                                }
189
                                metaData = "$metaData>\n"
190
                                print " metaData : $metaData \n"
191
                        }
192
                        // FIN Remplissage des métadonnées : #################################################
193

    
194
                        // On copie ou pas si on est ou pas dans <headline> ou <tailParagraphs>
195
                        if (temp =~ Sections[3]){
196
                                copieSec3=1
197
                        }
198
                        if (temp =~ FinSections[3]){
199
                                Headline.add(temp)
200
                                copieSec3=0
201
                        }
202
                        if (temp =~ Sections[4]){
203
                                copieSec4=1
204
                        }
205
                        if (temp =~ FinSections[4]){
206
                                TailPara.add(temp)
207
                                copieSec4=0
208
                        }
209

    
210
                        if (copieSec3 == 1){
211
                                Headline.add(temp)
212
                        }
213
                        if (copieSec4 == 1){
214
                                TailPara.add(temp)
215
                        }
216

    
217
                        if (temp =~ FinSections[0]){
218
                                ECRITURE.write("$metaData\n")
219
                                for (i=0;i<(Headline.size());i++){
220
                                        if (i==0 || i==Headline){
221
                                                ECRITURE.write(Headline[i].toString()+"\n")
222
                                        }
223
                                        else{
224
                                                ECRITURE.write("\t"+Headline[i]+"\n")
225
                                        }
226
                                }
227
                                for (i=0;i<(TailPara.size());i++){
228
                                        if (i==0 || i==TailPara){
229
                                                ECRITURE.write(TailPara[i].toString()+"\n")
230
                                        }
231
                                        else{
232
                                                ECRITURE.write("\t"+TailPara[i]+"\n")
233
                                        }
234
                                }
235
                                ECRITURE.write("</article>")
236

    
237
                                new_fich=0
238
                                industry=0
239
                                region=0
240
                                premIndustry=0
241
                                premRegion=0
242
                                MetaData=[]
243
                                TestMeta=[0,0,0,0,0]
244
                                Headline=[]
245
                                TailPara=[]
246

    
247
                                ECRITURE.close()
248
                                print "fichier $char_num_fich traite.\n"
249
                        }
250
                        line = reader.readLine()
251
                }
252
                ECRITURE.close()
253
                reader.close()
254
                num_fich = 0
255
        }
256
}
257

    
258
String userDir = System.getProperty("user.home");
259
File rootDir = new File(userDir, "xml/factiva")
260
File outdir = new File(rootDir, "out2")
261
run(rootDir, outdir.getAbsolutePath());