-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathlinefile.go
More file actions
116 lines (98 loc) · 2.68 KB
/
Copy pathlinefile.go
File metadata and controls
116 lines (98 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// +build ignore
package main
import (
"compress/bzip2"
"flag"
"io"
"log"
"os"
"runtime"
"strings"
"time"
"github.com/dustin/go-humanize"
"github.com/dustin/go-wikiparse"
)
var numWorkers = flag.Int("numWorkers", 8, "Number of page workers")
var benchTimeStampFormat = "02-Jan-2006 15:04:05.000"
func doHeader(f *os.File) {
f.WriteString("FIELDS_HEADER_INDICATOR###\tdoctitle\tdocdate\tbody\n")
}
func doPage(of *os.File, cf *os.File, p *wikiparse.Page) {
f := of
if strings.HasPrefix(p.Title, "Category:") {
f = cf
}
startTextEnd := len(p.Revisions[0].Text)
if startTextEnd > 9 {
startTextEnd = 9
}
startText := strings.ToLower(p.Revisions[0].Text[0:startTextEnd])
if startText == "#redirect" {
return
}
f.WriteString(p.Title)
f.WriteString("\t")
t, err := time.Parse(time.RFC3339, p.Revisions[0].Timestamp)
if err != nil {
log.Printf("error parsing time: %v", err)
}
f.WriteString(t.Format(benchTimeStampFormat[0:3]))
f.WriteString(strings.ToUpper(t.Format(benchTimeStampFormat[3:6])))
f.WriteString(t.Format(benchTimeStampFormat[6:]))
f.WriteString("\t")
textTrim := strings.Trim(p.Revisions[0].Text, "\n\t ")
textWithoutNewlines := strings.Replace(textTrim, "\n", " ", -1)
textWithoutNewlinesOrTabs := strings.Replace(textWithoutNewlines, "\t", " ", -1)
f.WriteString(textWithoutNewlinesOrTabs)
f.WriteString("\n")
}
func main() {
procs := flag.Int("cpus", runtime.NumCPU(), "Number of CPUS to use")
flag.Parse()
var input io.Reader
input, err := os.Open(flag.Arg(0))
if err != nil {
log.Fatalf("Error opening input file: %v", err)
}
if strings.HasSuffix(flag.Arg(0), ".bz2") {
input = bzip2.NewReader(input)
}
output, err := os.OpenFile(flag.Arg(1), os.O_CREATE|os.O_RDWR, 0666)
if err != nil {
log.Fatalf("Error opening output file: %v", err)
}
defer output.Close()
doHeader(output)
catoutput, err := os.OpenFile(flag.Arg(2), os.O_CREATE|os.O_RDWR, 0666)
if err != nil {
log.Fatalf("Error opening categories output file: %v", err)
}
defer catoutput.Close()
doHeader(catoutput)
runtime.GOMAXPROCS(*procs)
p, err := wikiparse.NewParser(input)
if err != nil {
log.Fatalf("Error initializing parser: %v", err)
}
pages := int64(0)
start := time.Now()
prev := start
reportfreq := int64(1000)
for err == nil {
var page *wikiparse.Page
page, err = p.Next()
if err == nil {
doPage(output, catoutput, page)
}
pages++
if pages%reportfreq == 0 {
now := time.Now()
d := now.Sub(prev)
log.Printf("Processed %s pages total (%.2f/s)",
humanize.Comma(pages), float64(reportfreq)/d.Seconds())
prev = now
}
}
log.Printf("Ended with err after %v: %v after %s pages",
time.Now().Sub(start), err, humanize.Comma(pages))
}