www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - file io

reply hridyansh thakur <hridyanshthakur gmail.com> writes:
how to read a file line by line in D
Sep 06 2018
parent reply Arun Chandrasekaran <aruncxy gmail.com> writes:
On Thursday, 6 September 2018 at 16:13:42 UTC, hridyansh thakur 
wrote:
 how to read a file line by line in D
std.stdio.File.byLine() Refer the doc here: https://dlang.org/library/std/stdio/file.by_line.html An example from the doc: ``` import std.algorithm, std.stdio, std.string; // Count words in a file using ranges. void main() { auto file = File("file.txt"); // Open for reading const wordCount = file.byLine() // Read lines .map!split // Split into words .map!(a => a.length) // Count words per line .sum(); // Total word count writeln(wordCount); } ```
Sep 06 2018
parent reply rikki cattermole <rikki cattermole.co.nz> writes:
On 07/09/2018 4:17 AM, Arun Chandrasekaran wrote:
 On Thursday, 6 September 2018 at 16:13:42 UTC, hridyansh thakur wrote:
 how to read a file line by line in D
std.stdio.File.byLine() Refer the doc here: https://dlang.org/library/std/stdio/file.by_line.html An example from the doc: ``` import std.algorithm, std.stdio, std.string; // Count words in a file using ranges. void main() {     auto file = File("file.txt"); // Open for reading     const wordCount = file.byLine()            // Read lines                           .map!split           // Split into words                           .map!(a => a.length) // Count words per line                           .sum();              // Total word count     writeln(wordCount); } ```
Ranges will be far too advanced of a topic to bring up at this stage. So something a little more conventional might be a better option: --- import std.file : readText; import std.array : split; import std.string : strip; string text = readText("file.txt"); string[] onlyWords = text.split(" "); uint countWords; foreach(ref word; onlyWords) { word = word.strip(); if (word.length > 0) countWords++; } ---
Sep 06 2018
parent reply Steven Schveighoffer <schveiguy gmail.com> writes:
On 9/6/18 1:07 PM, rikki cattermole wrote:
 On 07/09/2018 4:17 AM, Arun Chandrasekaran wrote:
 On Thursday, 6 September 2018 at 16:13:42 UTC, hridyansh thakur wrote:
 how to read a file line by line in D
std.stdio.File.byLine() Refer the doc here: https://dlang.org/library/std/stdio/file.by_line.html An example from the doc: ``` import std.algorithm, std.stdio, std.string; // Count words in a file using ranges. void main() {      auto file = File("file.txt"); // Open for reading      const wordCount = file.byLine()            // Read lines                            .map!split           // Split into words                            .map!(a => a.length) // Count words per line                            .sum();              // Total word count      writeln(wordCount); } ```
Ranges will be far too advanced of a topic to bring up at this stage. So something a little more conventional might be a better option: --- import std.file : readText; import std.array : split; import std.string : strip; string text = readText("file.txt"); string[] onlyWords = text.split(" "); uint countWords; foreach(ref word; onlyWords) {     word = word.strip();     if (word.length > 0)         countWords++; } ---
Ugh, don't do that, it will read the unknown-length file into RAM all at once. foreach(word; File("file.txt").byLine) { word = word.strip(); if(word.length > 0) countWords++; } That will buffer one line at a time and achieve the same results. -Steve
Sep 06 2018
parent Steven Schveighoffer <schveiguy gmail.com> writes:
On 9/6/18 2:30 PM, Steven Schveighoffer wrote:
 On 9/6/18 1:07 PM, rikki cattermole wrote:
 On 07/09/2018 4:17 AM, Arun Chandrasekaran wrote:
 On Thursday, 6 September 2018 at 16:13:42 UTC, hridyansh thakur wrote:
 how to read a file line by line in D
std.stdio.File.byLine() Refer the doc here: https://dlang.org/library/std/stdio/file.by_line.html An example from the doc: ``` import std.algorithm, std.stdio, std.string; // Count words in a file using ranges. void main() {      auto file = File("file.txt"); // Open for reading      const wordCount = file.byLine()            // Read lines                            .map!split           // Split into words                            .map!(a => a.length) // Count words per line                            .sum();              // Total word count      writeln(wordCount); } ```
Ranges will be far too advanced of a topic to bring up at this stage. So something a little more conventional might be a better option: --- import std.file : readText; import std.array : split; import std.string : strip; string text = readText("file.txt"); string[] onlyWords = text.split(" "); uint countWords; foreach(ref word; onlyWords) {      word = word.strip();      if (word.length > 0)          countWords++; } ---
Ugh, don't do that, it will read the unknown-length file into RAM all at once. foreach(word; File("file.txt").byLine) {    word = word.strip();    if(word.length > 0) countWords++; } That will buffer one line at a time and achieve the same results.
ugh, I didn't think this through. This works: foreach(line; File("file.txt").byLine) { foreach(word; line.split(" ")) { word = word.strip(); if(word.length > 0) countWords++; } } -Steve
Sep 06 2018