digitalmars.D.learn - Help required on Array appender
- Vino.B (19/19) Sep 02 2017 Hi All,
- Nicholas Wilson (17/40) Sep 02 2017 If you're wanting to use appender just make an appender and
- Azi Hassan (8/10) Sep 02 2017 Just making Subdata an Appender!(string[][]) (or
- Vino.B (37/80) Sep 02 2017 Hi,
- Vino.B (8/13) Sep 02 2017 Hi,
- Nicholas Wilson (2/18) Sep 02 2017 You want `Appender!(string[])`
- Vino.B (4/27) Sep 02 2017 Hi,
Hi All, Can you please guide me how can i use array appender for the below piece of code string[][] cleanFiles (string FFs, string Step) { auto dFiles = dirEntries(FFs, SpanMode.shallow).filter!(a => a.isFile).map!(a => tuple(a.name , a.timeCreated)).array; foreach (d; dFiles) { if (Step == "dryrun") { Subdata ~= [d[0], d[1].toSimpleString[0 .. 20]]; } else if (Step == "run") { remove(d[0]); if (!d[0].exists) Subdata ~= [d[0], d[1].toSimpleString[0 .. 20]]; } } return Subdata; } From, Vino.B
Sep 02 2017
On Saturday, 2 September 2017 at 10:15:04 UTC, Vino.B wrote:Hi All, Can you please guide me how can i use array appender for the below piece of code string[][] cleanFiles (string FFs, string Step) { auto dFiles = dirEntries(FFs, SpanMode.shallow).filter!(a => a.isFile).map!(a => tuple(a.name , a.timeCreated)).array; foreach (d; dFiles) { if (Step == "dryrun") { Subdata ~= [d[0], d[1].toSimpleString[0 .. 20]]; } else if (Step == "run") { remove(d[0]); if (!d[0].exists) Subdata ~= [d[0], d[1].toSimpleString[0 .. 20]]; } } return Subdata; } From, Vino.BIf you're wanting to use appender just make an appender and replace the ~= to calls to appender.put(data); if you're trying to make it faster, consider that Step could be a bool, your return type could be string[2][], the `if (!d[0].exists)` is redundant since `remove` will throw if it fails. That leaves you with string[2][] cleanFiles(string FFs, bool dryrun) { auto dFiles = dirEntries(FFs, SpanMode.shallow) .filter!(a => a.isFile) .map!(a =>[a.name , a.timeCreated.toSimpleString[0 .. 20]) .array; if (! dryrun) dFiles.each!(f => f[0].remove); }
Sep 02 2017
On Saturday, 2 September 2017 at 12:54:48 UTC, Nicholas Wilson wrote:If you're wanting to use appender just make an appender and replace the ~= to calls to appender.put(data);Just making Subdata an Appender!(string[][]) (or Appender!(Tuple!(string, string)[])) is enough since it already overloads the ~= operator. Performance aside, a small nitpick is that it's possible to write filter!isFile instead of filter!(a => a.isFile) since isFile only accepts one argument.
Sep 02 2017
On Saturday, 2 September 2017 at 12:54:48 UTC, Nicholas Wilson wrote:On Saturday, 2 September 2017 at 10:15:04 UTC, Vino.B wrote:Hi, Thank you very much, and your idea help a lot, and the reason to use appender is for both faster and performance as my program use's many ~= function and found that using appender is the best way when compared with the ~= e.g;(MCresult.get ~= MCleanTaskData;) void mCleanFiles (string[] Dirlist, File logF, File logE, string Step) { try { string[][] MCtext; string[][] MCEresult; auto MCresult = taskPool.workerLocalStorage(MCtext); logF.writeln("Function \t : List of the File's which are not placed in correct Location and list those deleted"); logF.writeln("Dir. Scanned \t :", Dirlist); logF.writeln("************************************************************************************"); logF.writefln("%-63s %.20s", "File Name", "CreationTime"); logF.writeln("************************************************************************************"); foreach (string Fs; parallel(Dirlist[0 .. $], 1)) { auto FFs = Fs.strip; auto MCleanTask = task(&cleanFiles, FFs, Step); MCleanTask.executeInNewThread(); auto MCleanTaskData = MCleanTask.workForce; MCresult.get ~= MCleanTaskData; } foreach(i; MCresult.toRange) logF.writefln("%(%-(%-63s %)\n%)", i.sort!((a,b) => a[0] < b[0]).uniq); logF.writeln("************************************************************************************"); } catch (Exception e) { logE.writeln(e.msg); } } From, Vino.BHi All, Can you please guide me how can i use array appender for the below piece of code string[][] cleanFiles (string FFs, string Step) { auto dFiles = dirEntries(FFs, SpanMode.shallow).filter!(a => a.isFile).map!(a => tuple(a.name , a.timeCreated)).array; foreach (d; dFiles) { if (Step == "dryrun") { Subdata ~= [d[0], d[1].toSimpleString[0 .. 20]]; } else if (Step == "run") { remove(d[0]); if (!d[0].exists) Subdata ~= [d[0], d[1].toSimpleString[0 .. 20]]; } } return Subdata; } From, Vino.BIf you're wanting to use appender just make an appender and replace the ~= to calls to appender.put(data); if you're trying to make it faster, consider that Step could be a bool, your return type could be string[2][], the `if (!d[0].exists)` is redundant since `remove` will throw if it fails. That leaves you with string[2][] cleanFiles(string FFs, bool dryrun) { auto dFiles = dirEntries(FFs, SpanMode.shallow) .filter!(a => a.isFile) .map!(a =>[a.name , a.timeCreated.toSimpleString[0 .. 20]) .array; if (! dryrun) dFiles.each!(f => f[0].remove); }
Sep 02 2017
On Saturday, 2 September 2017 at 15:47:31 UTC, Vino.B wrote:On Saturday, 2 September 2017 at 12:54:48 UTC, Nicholas Wilson wrote:Hi, Was able to resolve the above issue, but again getting the same for other lines such as below when i tried to add the appender. auto CleanDirlst = appender([]); CleanDirlst ~= PVStore[1][i].to!string.split(","); Error: cannot implicitly convert expression appender([]) of type Appender!(void[]) to string[].[...]Hi, [...]
Sep 02 2017
On Saturday, 2 September 2017 at 21:11:17 UTC, Vino.B wrote:On Saturday, 2 September 2017 at 15:47:31 UTC, Vino.B wrote:You want `Appender!(string[])`On Saturday, 2 September 2017 at 12:54:48 UTC, Nicholas Wilson wrote:Hi, Was able to resolve the above issue, but again getting the same for other lines such as below when i tried to add the appender. auto CleanDirlst = appender([]); CleanDirlst ~= PVStore[1][i].to!string.split(","); Error: cannot implicitly convert expression appender([]) of type Appender!(void[]) to string[].[...]Hi, [...]
Sep 02 2017
On Saturday, 2 September 2017 at 22:39:33 UTC, Nicholas Wilson wrote:On Saturday, 2 September 2017 at 21:11:17 UTC, Vino.B wrote:Hi, Thank you very much, was able to resolve the issue.On Saturday, 2 September 2017 at 15:47:31 UTC, Vino.B wrote:You want `Appender!(string[])`On Saturday, 2 September 2017 at 12:54:48 UTC, Nicholas Wilson wrote:Hi, Was able to resolve the above issue, but again getting the same for other lines such as below when i tried to add the appender. auto CleanDirlst = appender([]); CleanDirlst ~= PVStore[1][i].to!string.split(","); Error: cannot implicitly convert expression appender([]) of type Appender!(void[]) to string[].[...]Hi, [...]
Sep 02 2017