in arrow/csv/writer.go [61:195]
func (w *Writer) Write(record array.Record) error {
if !record.Schema().Equal(w.schema) {
return ErrMismatchFields
}
var err error
if w.header {
w.once.Do(func() {
err = w.writeHeader()
})
if err != nil {
return err
}
}
recs := make([][]string, record.NumRows())
for i := range recs {
recs[i] = make([]string, record.NumCols())
}
for j, col := range record.Columns() {
switch w.schema.Field(j).Type.(type) {
case *arrow.BooleanType:
arr := col.(*array.Boolean)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatBool(arr.Value(i))
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.Int8Type:
arr := col.(*array.Int8)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatInt(int64(arr.Value(i)), 10)
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.Int16Type:
arr := col.(*array.Int16)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatInt(int64(arr.Value(i)), 10)
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.Int32Type:
arr := col.(*array.Int32)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatInt(int64(arr.Value(i)), 10)
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.Int64Type:
arr := col.(*array.Int64)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatInt(int64(arr.Value(i)), 10)
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.Uint8Type:
arr := col.(*array.Uint8)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatUint(uint64(arr.Value(i)), 10)
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.Uint16Type:
arr := col.(*array.Uint16)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatUint(uint64(arr.Value(i)), 10)
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.Uint32Type:
arr := col.(*array.Uint32)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatUint(uint64(arr.Value(i)), 10)
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.Uint64Type:
arr := col.(*array.Uint64)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatUint(uint64(arr.Value(i)), 10)
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.Float32Type:
arr := col.(*array.Float32)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatFloat(float64(arr.Value(i)), 'g', -1, 32)
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.Float64Type:
arr := col.(*array.Float64)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = strconv.FormatFloat(float64(arr.Value(i)), 'g', -1, 64)
} else {
recs[i][j] = w.nullValue
}
}
case *arrow.StringType:
arr := col.(*array.String)
for i := 0; i < arr.Len(); i++ {
if arr.IsValid(i) {
recs[i][j] = arr.Value(i)
} else {
recs[i][j] = w.nullValue
}
}
}
}
return w.w.WriteAll(recs)
}