2015-01-06 2 views
-2

Предполагая следующий пример:Разделите io.Reader - используйте ReadWriter?

func Execute(r io.Reader) { 
    // do soemthing 
} 

func BatchFromCSV(cr csv.Reader, batchSize int) { 
    n := 0 
    for { 
     r, err := cr.Read() 
     if err != nil { 
      if err != io.EOF { 
       panic(err) 
      } 
      break 
     } 

     n = n + 1 

     // Execute() when batchSize == n 
    } 
} 

Есть ли способ, чтобы дробить поступающую читателя, не создавая буфер какой-то, а затем, используя байты/string.NewReader()? Это место для ReadWriter? Если да, то каким образом я могу реализовать readWriter?

+1

Что вы подразумеваете под словом «входящий читатель»? – JimB

+0

вызов Выполнить для каждой партии. Csv из 300 строк с размером партии 200 приведет к тому, что вызов вызывается дважды. Эта часть тривиальна, мне интересен наиболее эффективный способ дать Execute читателю. Я не был уверен, если это то, где входят ReadWriters. – kwolfe

+1

«io.ReadWriter» предназначен для чтения и записи, я не вижу, где вы собираетесь что-либо писать? (также, 'csv.Reader' не является' io.Reader', если это вас путает). – JimB

ответ

-1

Если файл csv помещается в память, просто вызовите ReadAll() и разделите кусочек записей, как вы считаете нужным.

Если вы не хотите потреблять весь файл сразу, аккумулируйте все количество записей, которые хотите обработать, вызывая Read() для каждого из них.

+1

Если кто-то не согласен с этим ответом, пожалуйста, дайте мне знать, почему. Невозможно прочитать записи N csv без разбора по одному. – JimB

Смежные вопросы