private void RunCore(IChannel ch) { Host.AssertValue(ch); IDataView data = CreateAndSaveLoader(); if (!string.IsNullOrWhiteSpace(Args.Columns)) { var args = new ChooseColumnsTransform.Arguments(); args.Column = Args.Columns .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(s => new ChooseColumnsTransform.Column() { Name = s }).ToArray(); if (Utils.Size(args.Column) > 0) { data = new ChooseColumnsTransform(Host, args, data); } } IDataSaver saver; if (Args.Saver != null) { saver = Args.Saver.CreateComponent(Host); } else { saver = new TextSaver(Host, new TextSaver.Arguments() { Dense = Args.Dense }); } var cols = new List <int>(); for (int i = 0; i < data.Schema.ColumnCount; i++) { if (!Args.KeepHidden && data.Schema.IsHidden(i)) { continue; } var type = data.Schema.GetColumnType(i); if (saver.IsColumnSavable(type)) { cols.Add(i); } else { ch.Info(MessageSensitivity.Schema, "The column '{0}' will not be written as it has unsavable column type.", data.Schema.GetColumnName(i)); } } Host.NotSensitive().Check(cols.Count > 0, "No valid columns to save"); // Send the first N lines to console. if (Args.Rows > 0) { var args = new SkipTakeFilter.TakeArguments() { Count = Args.Rows }; data = SkipTakeFilter.Create(Host, args, data); } var textSaver = saver as TextSaver; // If it is a text saver, utilize a special utility for this purpose. if (textSaver != null) { textSaver.WriteData(data, true, cols.ToArray()); } else { using (MemoryStream mem = new MemoryStream()) { using (Stream wrapStream = new SubsetStream(mem)) saver.SaveData(wrapStream, data, cols.ToArray()); mem.Seek(0, SeekOrigin.Begin); using (StreamReader reader = new StreamReader(mem)) { string result = reader.ReadToEnd(); ch.Info(MessageSensitivity.UserData | MessageSensitivity.Schema, result); } } } }
/// <summary> /// A helper method to create <see cref="SkipTakeFilter"/> transform by taking the top rows defined by the <paramref name="count"/> parameter. /// <see cref="SkipTakeFilter"/> when created with <see cref="SkipTakeFilter.TakeArguments"/> behaves as 'TakeFilter'. /// </summary> /// <param name="env">Host Environment.</param> /// <param name="input">>Input <see cref="IDataView"/>. This is the output from previous transform or loader.</param> /// <param name="count">Number of rows to take</param> public static IDataTransform Create(IHostEnvironment env, IDataView input, long count = SkipTakeFilter.Arguments.DefaultTake) => SkipTakeFilter.Create(env, new SkipTakeFilter.TakeArguments() { Count = count }, input);