public DataSetRepresentation Build(Stream dataSetStream, bool dataContainsHeaders, int?decisionAttributeIndex) { var buildState = new DataSetRepresentationBuildState(); int attributesCount; int decisionIndex; IDictionary <int, string> attributeNames = null; using (var reader = new StreamReader(dataSetStream)) { if (dataContainsHeaders) { attributeNames = new Dictionary <int, string>(); var headers = reader.ReadLine().Split(','); for (int i = 0; i < headers.Length; i++) { attributeNames.Add(i, headers[i]); } } var firstTransaction = reader.ReadLine(); attributesCount = firstTransaction.Split(',').Length; decisionIndex = decisionAttributeIndex ?? attributesCount - 1; _transactionProcessor.AppendTransaction(1, firstTransaction, decisionIndex, buildState); for (int i = 2; !reader.EndOfStream; i++) { var transaction = reader.ReadLine(); _transactionProcessor.AppendTransaction(i, transaction, decisionIndex, buildState); } } return(new DataSetRepresentation { AttributesCount = attributesCount, DecisionAttributeIndex = decisionIndex, AttributeNames = attributeNames, DecisionIDs = buildState.DecisionIDs, TransactionDecisions = buildState.TransactionDecisions, ItemIDs = buildState.ItemIDs, ItemInfos = buildState.ItemInfos }); }