reading file byLine

Namal via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Sep 3 17:18:14 PDT 2015


On Thursday, 3 September 2015 at 23:54:44 UTC, H. S. Teoh wrote:
> On Thu, Sep 03, 2015 at 11:38:54PM +0000, Namal via 
> Digitalmars-d-learn wrote:
>> On Thursday, 3 September 2015 at 23:31:27 UTC, Jordan Wilson 
>> wrote:
>> >On Thursday, 3 September 2015 at 23:28:37 UTC, Namal wrote:
>> >>On Thursday, 3 September 2015 at 23:25:52 UTC, Jordan Wilson 
>> >>wrote:
>> >>>And also:
>> >>>import std.algorithm
>> >>>
>> >>>Sorry, I should have taken the time to answer properly and 
>> >>>fully.
>> >>
>> >>import std.file, std.stdio, std.string, std.conv, 
>> >>std.algorithm;
>> >>
>> >>void main(){
>> >>
>> >>	auto file = File("text.txt");
>> >>	auto numbers = file.byLine()
>> >>                 .map!(a => a.split)
>> >>                 .map!(a => map!(a => to!int(a))(a))
>> >>                 .array();
>> >>
>> >>	writeln(numbers);
>> >>}
>> >>
>> >>Error: no property 'array' for type 'MapResult!(__lambda2,
>> >>MapResult!(__lambda1, ByLine!(char, char)))'
>> >>
>> >>Still an error.
>> >
>> >import std.array
>> 
>> Thx, finaly, this is so much harder to understand than c++ 
>> iostream
>
> I would have written it slightly differently, to emphasize what 
> exactly is going on:
>
> 	auto numbers = File("text.txt")	// read file
> 		.byLine()		// line by line
> 		.map!(a => a.split	// split each line into words
> 			    .map!(a => to!int(a)) // convert each word into int
> 			    .array)	// collect the ints into an array (per line)
> 		.array;			// collect all line arrays into one big array
>
> This is the functional way of doing it, of course. If you're 
> more comfortable with the C++-style imperative approach, you 
> could do this instead:
>
> 	auto file = File("text.txt");
> 	int[][] numbers;
> 	foreach (line; file.byLine) {
> 		auto words = line.split;
>
> 		int[] lineNums;
> 		foreach (word; words) {
> 			lineNums ~= word.to!int;
> 		}
> 		numbers ~= lineNums;
> 	}
>
> The functional approach is admittedly a bit harder to 
> understand at first, but it's extremely powerful because it 
> processes everything in a pipeline, and you can compose 
> operators on the pipeline easily, rearrange the sequence of 
> operations, etc..
>
> In the imperative nested-loop approach, things quickly get out 
> of hand once the loop is nested about 2-3 levels deep. A nested 
> loop of 6-7 levels deep would be basically impossible to 
> understand, maintain, or debug without major refactoring into 
> smaller functions. (In fact, split() is a library-provided 
> function that basically encapsulates one of those nested 
> loops.) But if you take the refactoring to its logical 
> conclusion, you'll eventually end up with a whole bunch of tiny 
> functions with only a single loop each, each calling the next 
> function in a chain -- in other words, you arrive at the 
> functional pipeline approach.  :-)
>
> D allows you to do it either way, but the superior approach IMO 
> is to learn the functional pipeline approach.
>
>
> T

Thx Theo, this and the lack of foolproof tutorials were the 
reason why I gave up on D 2 years ago and went instead to C++. 
But I am not giving up this time. That being said, when do I have 
to import std.array and std.string? Every time I use std.array? I 
can obviously use arrays and strings without those libs.


More information about the Digitalmars-d-learn mailing list