// Sets field value by name func (dt *DbfTable) SetFieldValue(row int, fieldIndex int, value string) (err error) { e := mahonia.NewEncoder(dt.fileEncoding) b := []byte(e.ConvertString(value)) fieldLength := int(dt.fields[fieldIndex].fieldLength) //DEBUG //fmt.Printf("dt.numberOfBytesInHeader=%v\n\n", dt.numberOfBytesInHeader) //fmt.Printf("dt.lengthOfEachRecord=%v\n\n", dt.lengthOfEachRecord) // locate the offset of the field in DbfTable dataStore offset := int(dt.numberOfBytesInHeader) lengthOfRecord := int(dt.lengthOfEachRecord) offset = offset + (row * lengthOfRecord) recordOffset := 1 for i := 0; i < len(dt.fields); i++ { if i == fieldIndex { break } else { recordOffset += int(dt.fields[i].fieldLength) } } // first fill the field with space values for i := 0; i < fieldLength; i++ { dt.dataStore[offset+recordOffset+i] = 0x20 } // write new value switch dt.fields[fieldIndex].fieldType { case "C", "L", "D": for i := 0; i < len(b) && i < fieldLength; i++ { dt.dataStore[offset+recordOffset+i] = b[i] } case "N": for i := 0; i < fieldLength; i++ { // fmt.Printf("i:%v\n", i) if i < len(b) { dt.dataStore[offset+recordOffset+(fieldLength-i-1)] = b[(len(b)-1)-i] } else { break } } } return //fmt.Printf("field value:%#v\n", []byte(value)) //fmt.Printf("field index:%#v\n", fieldIndex) //fmt.Printf("field length:%v\n", dt.Fields[fieldIndex].fieldLength) //fmt.Printf("string to byte:%#v\n", b) }
/* getByteSlice converts value to byte slice according to given encoding and return a slice that is length equals to numberOfBytes or less if the string is shorter than numberOfBytes */ func (dt *DbfTable) convertToByteSlice(value string, numberOfBytes int) (s []byte) { e := mahonia.NewEncoder(dt.fileEncoding) b := []byte(e.ConvertString(value)) if len(b) <= numberOfBytes { s = b } else { s = b[0:numberOfBytes] } return }
func (dt *DbfTable) getNormalizedFieldName(name string) (s string) { e := mahonia.NewEncoder(dt.fileEncoding) b := []byte(e.ConvertString(name)) if len(b) > 10 { b = b[0:10] } d := mahonia.NewDecoder(dt.fileEncoding) s = d.ConvertString(string(b)) return }