@@ -428,6 +428,21 @@ impl DataFrame {
428
428
Ok ( ( ) )
429
429
}
430
430
431
+ pub fn to_csv ( & self , path : & str ) -> Result < ( ) , arrow:: error:: ArrowError > {
432
+ // use csv::error::Error;
433
+ use arrow:: csv:: Writer ;
434
+
435
+ let file = File :: create ( path) ?;
436
+
437
+ let wrt = Writer :: new ( file) ;
438
+
439
+ let batches = self . to_record_batches ( ) ;
440
+ let batches_ref: Vec < & RecordBatch > = batches. iter ( ) . map ( |b| b) . collect ( ) ;
441
+
442
+ wrt. write ( batches_ref) ?;
443
+
444
+ Ok ( ( ) )
445
+ }
431
446
}
432
447
433
448
mod tests {
@@ -536,4 +551,37 @@ mod tests {
536
551
let write = dataframe. to_feather ( "./test/data/uk_cities" ) ;
537
552
assert ! ( write. is_ok( ) ) ;
538
553
}
554
+
555
+ #[ test]
556
+ fn csv_io ( ) {
557
+ let mut dataframe = DataFrame :: from_csv ( "./test/data/uk_cities_with_headers.csv" , None ) ;
558
+ let a = dataframe. column_by_name ( "lat" ) ;
559
+ let b = dataframe. column_by_name ( "lng" ) ;
560
+ let sum = ScalarFunctions :: add ( column_to_arrays_f64 ( a) , column_to_arrays_f64 ( b) ) ;
561
+ // TODO, make this better
562
+ let sum: Vec < ArrayRef > = sum
563
+ . unwrap ( )
564
+ . into_iter ( )
565
+ . map ( |p| Arc :: new ( p) as ArrayRef )
566
+ . collect ( ) ;
567
+ dataframe = dataframe. with_column (
568
+ "lat_lng_sum" ,
569
+ Column :: from_arrays ( sum, Field :: new ( "lat_lng_sum" , DataType :: Float64 , true ) ) ,
570
+ ) ;
571
+
572
+ let city = dataframe. column_by_name ( "city" ) ;
573
+ let lowercase = ScalarFunctions :: lower ( column_to_arrays_str ( city) ) ;
574
+ let lowercase: Vec < ArrayRef > = lowercase
575
+ . unwrap ( )
576
+ . into_iter ( )
577
+ . map ( |p| Arc :: new ( p) as ArrayRef )
578
+ . collect ( ) ;
579
+ dataframe = dataframe. with_column (
580
+ "city_lower" ,
581
+ Column :: from_arrays ( lowercase, Field :: new ( "city_lower" , DataType :: Utf8 , true ) ) ,
582
+ ) ;
583
+
584
+ let write = dataframe. to_csv ( "/tmp/uk_cities_out.csv" ) ;
585
+ assert ! ( write. is_ok( ) ) ;
586
+ }
539
587
}
0 commit comments