Problème de reconnaissance des champs ?
This commit is contained in:
parent
f9b8ec213a
commit
892e9a62ec
47
csvparser.go
47
csvparser.go
|
@ -6,13 +6,13 @@ import (
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Parser struct {
|
type CsvParser struct {
|
||||||
enclosers []string
|
enclosers []string
|
||||||
delimiter rune
|
delimiter rune
|
||||||
fields []string
|
fields []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Parser) Initialize(delimiter string, enclosers []string, lineFormat string) error {
|
func (p *CsvParser) Initialize(delimiter string, enclosers []string, lineFormat string) error {
|
||||||
if utf8.RuneCountInString(delimiter) != 1 {
|
if utf8.RuneCountInString(delimiter) != 1 {
|
||||||
return fmt.Errorf("delimiter shoud be one character")
|
return fmt.Errorf("delimiter shoud be one character")
|
||||||
}
|
}
|
||||||
|
@ -36,23 +36,40 @@ func (p *Parser) Initialize(delimiter string, enclosers []string, lineFormat str
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Parser) Parse(line string) (map[string]string, error) {
|
func (p *CsvParser) Parse(line string) (map[string]string, error) {
|
||||||
|
inEnclosedField := false
|
||||||
|
currentEncloserEnd := ' '
|
||||||
|
escape := false
|
||||||
currentFieldIndex := 0
|
currentFieldIndex := 0
|
||||||
|
|
||||||
ret := make(map[string]string)
|
ret := make(map[string]string)
|
||||||
value := ""
|
valueStart := 0
|
||||||
|
valueEnd := 0
|
||||||
for index, r := range line {
|
for index, r := range line {
|
||||||
if r == p.delimiter {
|
if r == '\\' {
|
||||||
|
escape = !escape
|
||||||
|
} else if inEnclosedField {
|
||||||
|
if r == currentEncloserEnd && !escape {
|
||||||
|
if currentFieldIndex < len(p.fields) {
|
||||||
|
ret[p.fields[currentFieldIndex]] = line[valueStart : valueEnd-valueStart]
|
||||||
|
}
|
||||||
|
currentFieldIndex++
|
||||||
|
inEnclosedField = false
|
||||||
|
}
|
||||||
|
} else if r == p.delimiter {
|
||||||
|
valueEnd = index
|
||||||
|
if currentFieldIndex < len(p.fields) {
|
||||||
|
ret[p.fields[currentFieldIndex]] = line[valueStart : valueEnd-valueStart]
|
||||||
|
}
|
||||||
currentFieldIndex++
|
currentFieldIndex++
|
||||||
ret[p.fields[currentFieldIndex]] = value
|
} else {
|
||||||
continue
|
for _, encloser := range p.enclosers {
|
||||||
}
|
runes := []rune(encloser)
|
||||||
for _, encloser := range p.enclosers {
|
if r == runes[0] {
|
||||||
runes := []rune(encloser)
|
// opening encloser
|
||||||
if r == runes[0] {
|
inEnclosedField = true
|
||||||
// opening encloser
|
currentEncloserEnd = runes[1]
|
||||||
tmpStr := line[index:]
|
break
|
||||||
for tmpIndex, tmpR := range tmpStr {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
package csvparser
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCorrectLines(t *testing.T) {
|
||||||
|
var csvParser CsvParser
|
||||||
|
csvParser.Initialize(" ", []string{"\"\"", "[]"}, "firstname lastname complete_name")
|
||||||
|
line := ""
|
||||||
|
fmt.Println("parsing:", line)
|
||||||
|
event, err := csvParser.Parse(line)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Parsing of empty line failed %v %v", err, event)
|
||||||
|
}
|
||||||
|
fmt.Println("event is", event)
|
||||||
|
line = "John Doe \"John Doe\""
|
||||||
|
fmt.Println("parsing:", line)
|
||||||
|
event, err = csvParser.Parse(line)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Parsing of empty line failed %v %v", err, event)
|
||||||
|
}
|
||||||
|
fmt.Println("event is", event)
|
||||||
|
line = "John Doe"
|
||||||
|
fmt.Println("parsing:", line)
|
||||||
|
event, err = csvParser.Parse(line)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Parsing of empty line failed %v %v", err, event)
|
||||||
|
}
|
||||||
|
fmt.Println("event is", event)
|
||||||
|
line = "John Doe I don't know him"
|
||||||
|
fmt.Println("parsing:", line)
|
||||||
|
event, err = csvParser.Parse(line)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Parsing of empty line failed %v %v", err, event)
|
||||||
|
}
|
||||||
|
fmt.Println("event is", event)
|
||||||
|
}
|
Loading…
Reference in New Issue