public IEnumerable<Volume> GetVolumes() { using (var stream = Open()) { var parser = new VolumeParser { Log = Log }; Date created; using (var reader = parser.Open(stream, out created)) return parser.GetVolumes(reader).ToArray(); } }
public void Convert(CatalogParser parser, XmlReader reader, Date created, Stream bookStream, Stream volumeStream) { // There are almost 42,000 books and 520,000 files in the project Gutenberg. We set // up 59 * 10,000 steps here to have the progress bar stretching quite good and still // having a little space to grow for the project content. var progress = Log.Action(59, "Converting catalog..."); int bookCount = 0, skippedCount = 0, volumeCount = 0, totalCount = 0; var bookParser = new BookParser { Log = Log }; var volumeParser = new VolumeParser { Log = Log }; using (var bookWriter = bookParser.Create(bookStream, created)) using (var volumeWriter = volumeParser.Create(volumeStream, created)) { foreach (var item in parser.GetItems(reader)) { var book = item as Book; if (book != null) { // Book 9140 and a couple of others are invalid. if (string.IsNullOrEmpty(book.Title)) { Log.Verbose("Skipping book {0} with no title.", book.Number); ++skippedCount; } else { bookParser.Write(bookWriter, book); } ++bookCount; } else { volumeParser.Write(volumeWriter, (Volume) item); ++volumeCount; } // One step after every 10,000 items run nicely on my laptop; less loaded the // CPU with constant reporting and more made the console wait for too long. if (++totalCount % 10000 == 0) progress.Continue("{0} items processed...", totalCount); } bookParser.Finalize(bookWriter); volumeParser.Finalize(volumeWriter); } Log.Verbose("{0} books and {1} volumes were processed, {2} books skipped.", bookCount, volumeCount, skippedCount); progress.Finish(); }