@@ -1195,6 +1195,46 @@ where
1195
1195
Ok ( ( ) )
1196
1196
}
1197
1197
1198
+ fn split_into_n_chunks_by_line_round_robin < R > (
1199
+ settings : & Settings ,
1200
+ reader : & mut R ,
1201
+ num_chunks : u64 ,
1202
+ ) -> UResult < ( ) >
1203
+ where
1204
+ R : BufRead ,
1205
+ {
1206
+ // This object is responsible for creating the filename for each chunk.
1207
+ let mut filename_iterator = FilenameIterator :: new (
1208
+ & settings. prefix ,
1209
+ & settings. additional_suffix ,
1210
+ settings. suffix_length ,
1211
+ settings. suffix_type ,
1212
+ ) ;
1213
+
1214
+ // Create one writer for each chunk. This will create each
1215
+ // of the underlying files (if not in `--filter` mode).
1216
+ let mut writers = vec ! [ ] ;
1217
+ for _ in 0 ..num_chunks {
1218
+ let filename = filename_iterator
1219
+ . next ( )
1220
+ . ok_or_else ( || USimpleError :: new ( 1 , "output file suffixes exhausted" ) ) ?;
1221
+ let writer = settings. instantiate_current_writer ( filename. as_str ( ) ) ?;
1222
+ writers. push ( writer) ;
1223
+ }
1224
+
1225
+ let num_chunks: usize = num_chunks. try_into ( ) . unwrap ( ) ;
1226
+ for ( i, line_result) in reader. lines ( ) . enumerate ( ) {
1227
+ let line = line_result. unwrap ( ) ;
1228
+ let maybe_writer = writers. get_mut ( i % num_chunks) ;
1229
+ let writer = maybe_writer. unwrap ( ) ;
1230
+ let bytes = line. as_bytes ( ) ;
1231
+ writer. write_all ( bytes) ?;
1232
+ writer. write_all ( b"\n " ) ?;
1233
+ }
1234
+
1235
+ Ok ( ( ) )
1236
+ }
1237
+
1198
1238
fn split ( settings : & Settings ) -> UResult < ( ) > {
1199
1239
let mut reader = BufReader :: new ( if settings. input == "-" {
1200
1240
Box :: new ( stdin ( ) ) as Box < dyn Read >
@@ -1221,6 +1261,9 @@ fn split(settings: &Settings) -> UResult<()> {
1221
1261
let chunk_number = chunk_number - 1 ;
1222
1262
kth_chunk_by_line ( settings, & mut reader, chunk_number, num_chunks)
1223
1263
}
1264
+ Strategy :: Number ( NumberType :: RoundRobin ( num_chunks) ) => {
1265
+ split_into_n_chunks_by_line_round_robin ( settings, & mut reader, num_chunks)
1266
+ }
1224
1267
Strategy :: Number ( _) => Err ( USimpleError :: new ( 1 , "-n mode not yet fully implemented" ) ) ,
1225
1268
Strategy :: Lines ( chunk_size) => {
1226
1269
let mut writer = LineChunkWriter :: new ( chunk_size, settings) ?;
0 commit comments