108 lines
2.1 KiB
Go
108 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"time"
|
|
"internal/replace"
|
|
)
|
|
|
|
func main() {
|
|
run, err := getArgs()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
return
|
|
}
|
|
|
|
corpusBytes, err := os.ReadFile("./csv/corpus.csv")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
return
|
|
}
|
|
|
|
// Read the CSV file containing replacement key-value pairs
|
|
pairsHandle, err := os.Open("./csv/pairs.csv")
|
|
if err != nil {
|
|
fmt.Println("Error opening pairs:", err)
|
|
return
|
|
}
|
|
defer pairsHandle.Close()
|
|
|
|
replacements, err := csv.NewReader(pairsHandle).ReadAll()
|
|
if err != nil {
|
|
fmt.Println("Error reading pairs:", err)
|
|
return
|
|
}
|
|
|
|
corpus := string(corpusBytes)
|
|
|
|
var pairs []string
|
|
var replaced string
|
|
var startTime time.Time
|
|
var elapsedTime time.Duration
|
|
for _, algo := range run {
|
|
switch algo {
|
|
case "cw":
|
|
// Prepare
|
|
cw := replace.NewCommentzWalter()
|
|
for _, record := range replacements {
|
|
cw.AddPattern(record[0], record[1])
|
|
}
|
|
cw.BuildMatchingMachine()
|
|
|
|
// Replace
|
|
startTime = time.Now()
|
|
replaced = cw.CommentzWalterReplace(corpus)
|
|
elapsedTime = time.Since(startTime)
|
|
case "bm":
|
|
// Prepare...
|
|
for _, record := range replacements {
|
|
pairs = append(pairs, record[0], record[1])
|
|
}
|
|
|
|
// Replace
|
|
startTime = time.Now()
|
|
replaced = replace.BoyerMooreReplace(corpus, pairs)
|
|
elapsedTime = time.Since(startTime)
|
|
}
|
|
fmt.Printf("\n%s: %s\n", algo, elapsedTime)
|
|
}
|
|
|
|
// Write replaced text to a file
|
|
outputHandle, err := os.OpenFile("./csv/replaced.csv", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755)
|
|
if err != nil {
|
|
fmt.Println("Error creating output file:", err)
|
|
return
|
|
}
|
|
defer outputHandle.Close()
|
|
|
|
// Write replaced text to the file
|
|
_, err = outputHandle.WriteString(replaced)
|
|
if err != nil {
|
|
fmt.Println("Error writing to file:", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
func getArgs() ([]string, error) {
|
|
var run = []string{"bm", "cw"}
|
|
|
|
if len(os.Args) > 1 {
|
|
switch os.Args[1] {
|
|
case "all":
|
|
run = []string{"bm", "cw"}
|
|
case "cw":
|
|
run = []string{"cw"}
|
|
case "bm":
|
|
run = []string{"bm"}
|
|
default:
|
|
return []string{}, errors.New("Invalid argument.")
|
|
}
|
|
}
|
|
|
|
return run, nil
|
|
}
|