Appending data to array results in duplicate's.

Vino.B via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Aug 25 10:41:31 PDT 2017


On Friday, 25 August 2017 at 17:02:53 UTC, Jonathan M Davis wrote:
> On Friday, August 25, 2017 16:45:16 Vino.B via 
> Digitalmars-d-learn wrote:
>> Hi,
>>
>>   Request your help on the below issue,
>>
>> Issue : While appending data to a array the data is getting 
>> duplicated.
>>
>> Program:
>> import std.file: dirEntries, isFile, SpanMode;
>> import std.stdio: writeln, writefln;
>> import std.algorithm: filter, map;
>> import std.array: array;
>> import std.typecons: tuple;
>>
>> string[] Subdata;
>> void main ()
>> {
>>   auto dFiles = dirEntries("C:\\Temp\\TEAM",
>> SpanMode.shallow).filter!(a => a.isFile).map!(a => 
>> tuple(a.name ,
>> a.timeCreated)).array;
>>   foreach (d; dFiles)
>>        {
>>         Subdata ~= d[0];
>>         Subdata ~= d[1].toSimpleString;
>>         writeln(Subdata);
>>         }
>> }
>>
>> Output:
>>
>> ["C:\\Temp\\TEAM\\test1.pdf", "2017-Aug-24 18:23:00.8946851"]  
>> -
>> duplicate line
>> ["C:\\Temp\\TEAM\\test1.pdf", "2017-Aug-24 18:23:00.8946851",
>> "C:\\Temp\\\\TEAM\\test5.xlsx", "2017-Aug-25 23:38:14.486421"]
>
> You keep printing out the entire array on every iteration of 
> the loop, so of course, you're going to see stuff output 
> multiple times. If you did something like
>
>     import std.stdio;
>
>     void main()
>     {
>         int[] arr;
>         foreach(i; 0 .. 5)
>         {
>             arr ~= i * 10;
>             writeln(arr);
>         }
>     }
>
> then you'd get the output
>
> [0]
> [0, 10]
> [0, 10, 20]
> [0, 10, 20, 30]
> [0, 10, 20, 30, 40]
>
> whereas if you did
>
>     import std.stdio;
>
>     void main()
>     {
>         int[] arr;
>         foreach(i; 0 .. 5)
>             arr ~= i * 10;
>         writeln(arr);
>     }
>
> then you'd just get
>
> [0, 10, 20, 30, 40]
>
> - Jonathan M Davis

Hi All,

  Thank you very much, that was my mistake. The main idea is to 
implement parallelism and now i get only single data as there are 
2 files in each of the folders, but it is listing only 1 per 
folder.

import std.file: dirEntries, isFile, SpanMode;
import std.stdio: writeln, writefln;
import std.algorithm: filter, map;
import std.array: array;
import std.typecons: tuple;
import std.parallelism;
string[] Subdata;

auto Dirlst = [ "C:\\Temp\\TEAM", "C:\\Temp\\PROD_TEAM"];

string[] Test (string Fs)
{
     auto dFiles = dirEntries(Fs, SpanMode.shallow).filter!(a => 
a.isFile).map!(a => tuple(a.name , a.timeCreated)).array;
	foreach (d; dFiles)
	     {	Subdata ~=  d[0]; Subdata ~= d[1].toSimpleString; }
		return Subdata;
			
}
void main ()
{
  foreach (string Fs; Dirlst[0 .. $])
     {
                auto TestTask = task(&Test, Fs);
		TestTask.executeInNewThread();
		auto TestTaskData = TestTask.yieldForce;
		writefln("%-63s %.20s", TestTaskData[0], TestTaskData[1]);
	}
}

Output:

C:\Temp\TEAM\Test.pdf                                    
2017-Aug-24 18:23:00
C:\Temp\\PROD_TEAM\DND1.pdf                              
2017-Aug-25 23:38:04


The folder C:\Temp\TEAM contains 2 files and folder 
C:\Temp\\PROD_TEAM contain 4 files but it display only 1 file per 
folder.


More information about the Digitalmars-d-learn mailing list