86 lines
2.0 KiB
Go
86 lines
2.0 KiB
Go
package comtrade
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
// Parse ASCIIData ASCIIData is the ascii data of a comtrade data file.
|
|
|
|
func init() {
|
|
Add(TypeASCII, func() Parser {
|
|
return &ASCIIData{}
|
|
})
|
|
}
|
|
|
|
type ASCIIData struct{}
|
|
|
|
func (a *ASCIIData) Parse(filePath string, analogNum, digitalNum, endSamp uint32) (*Data, error) {
|
|
comtradeData := &Data{}
|
|
datFile, err := os.Open(filePath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer datFile.Close()
|
|
|
|
content, err := io.ReadAll(datFile)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
lines := bytes.Split(content, []byte("\n"))
|
|
if len(lines)-1 != int(endSamp) {
|
|
return nil, ErrInvalidFile
|
|
}
|
|
|
|
comtradeData.AnalogData = make([]AnalogData, int(endSamp))
|
|
comtradeData.DigitalData = make([]DigitalData, int(endSamp))
|
|
|
|
for i := 0; i < int(endSamp); i++ {
|
|
comtradeData.AnalogData[i].Data = make([]int32, analogNum)
|
|
comtradeData.DigitalData[i].Data = make([]uint8, digitalNum)
|
|
}
|
|
|
|
total := 1 + 1 + int(analogNum) + int(digitalNum)
|
|
var tempList [][]byte
|
|
for i := 0; i < int(endSamp); i++ {
|
|
tempList = bytes.Split(lines[i], []byte(","))
|
|
if len(tempList) != total {
|
|
return nil, ErrReadFirstLine
|
|
}
|
|
|
|
if value, err := strconv.Atoi(ByteToString(tempList[0])); err != nil {
|
|
return nil, err
|
|
} else {
|
|
comtradeData.AnalogData[i].N = uint32(value)
|
|
comtradeData.DigitalData[i].N = uint32(value)
|
|
}
|
|
|
|
if value, err := strconv.Atoi(ByteToString(tempList[1])); err != nil {
|
|
return nil, err
|
|
} else {
|
|
comtradeData.AnalogData[i].Timestamp = uint32(value)
|
|
comtradeData.DigitalData[i].Timestamp = uint32(value)
|
|
}
|
|
|
|
for j := 0; j < int(analogNum); j++ {
|
|
if value, err := strconv.ParseInt(ByteToString(tempList[j+2]), 10, 64); err != nil {
|
|
return nil, err
|
|
} else {
|
|
comtradeData.AnalogData[i].Data[j] = int32(value)
|
|
}
|
|
}
|
|
|
|
for j := 0; j < int(digitalNum); j++ {
|
|
if value, err := strconv.ParseInt(ByteToString(tempList[j+2+int(analogNum)]), 10, 64); err != nil {
|
|
return nil, err
|
|
} else {
|
|
comtradeData.DigitalData[i].Data[j] = uint8(value)
|
|
}
|
|
}
|
|
}
|
|
|
|
return comtradeData, nil
|
|
}
|