Thread overview | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
December 11, 2017 Tuple Array Sorting | ||||
---|---|---|---|---|
| ||||
Hi All, Request your help in tuple array sorting, I have a function which returns tuple values as below so how do i sort this type of array based on the time stamp(Acceding order) . Eg: C:\Temp\EXPORT\dir2 2017-Sep-06 16:06:58 C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 C:\Temp\TEAM\dir1 2017-Sep-10 16:06:42 C:\Temp\USER\dir3 2017-Sep-05 16:06:57 Required Output: C:\Temp\USER\dir3 2017-Sep-05 16:06:57 C:\Temp\EXPORT\dir2 2017-Sep-06 16:06:58 C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 C:\Temp\TEAM\dir1 2017-Sep-10 16:06:42 From, Vino.B |
December 11, 2017 Re: Tuple Array Sorting | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vino | On Monday, 11 December 2017 at 13:58:49 UTC, Vino wrote:
> Hi All,
>
> Request your help in tuple array sorting, I have a function which returns tuple values as below so how do i sort this type of array based on the time stamp(Acceding order) .
>
> Eg:
> C:\Temp\EXPORT\dir2 2017-Sep-06 16:06:58
> C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11
> C:\Temp\TEAM\dir1 2017-Sep-10 16:06:42
> C:\Temp\USER\dir3 2017-Sep-05 16:06:57
>
> Required Output:
> C:\Temp\USER\dir3 2017-Sep-05 16:06:57
> C:\Temp\EXPORT\dir2 2017-Sep-06 16:06:58
> C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11
> C:\Temp\TEAM\dir1 2017-Sep-10 16:06:42
>
> From,
> Vino.B
A small additional Information
C:\Temp\EXPORT\dir2 2017-Sep-06 16:06:58 - Array!(Tuple!(string, string)) (Array 1)
C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 - Array!(Tuple!(string, string)) (Array 2)
C:\Temp\TEAM\dir1 2017-Sep-10 16:06:42 - Array!(Tuple!(string, string)) (Array 3)
C:\Temp\USER\dir3 2017-Sep-05 16:06:57 - Array!(Tuple!(string, string)) (Array 4)
Required Output:
C:\Temp\USER\dir3 2017-Sep-05 16:06:57 - Array!(Tuple!(string, string)) (Array 4)
C:\Temp\EXPORT\dir2 2017-Sep-06 16:06:58 - Array!(Tuple!(string, string)) (Array 1)
C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 - Array!(Tuple!(string, string)) (Array 2)
C:\Temp\TEAM\dir1 2017-Sep-10 16:06:42 - Array!(Tuple!(string, string)) (Array 3)
From,
Vino.B
|
December 11, 2017 Re: Tuple Array Sorting | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vino | On Monday, 11 December 2017 at 14:25:16 UTC, Vino wrote: > On Monday, 11 December 2017 at 13:58:49 UTC, Vino wrote: >> Hi All, >> >> Request your help in tuple array sorting, I have a function which returns tuple values as below so how do i sort this type of array based on the time stamp(Acceding order) . >> >> Eg: >> C:\Temp\EXPORT\dir2 2017-Sep-06 16:06:58 >> C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 >> C:\Temp\TEAM\dir1 2017-Sep-10 16:06:42 >> C:\Temp\USER\dir3 2017-Sep-05 16:06:57 >> >> Required Output: >> C:\Temp\USER\dir3 2017-Sep-05 16:06:57 >> C:\Temp\EXPORT\dir2 2017-Sep-06 16:06:58 >> C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 >> C:\Temp\TEAM\dir1 2017-Sep-10 16:06:42 >> >> From, >> Vino.B > > A small additional Information > > C:\Temp\EXPORT\dir2 2017-Sep-06 16:06:58 - Array!(Tuple!(string, string)) (Array 1) > C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 - Array!(Tuple!(string, string)) (Array 2) > C:\Temp\TEAM\dir1 2017-Sep-10 16:06:42 - Array!(Tuple!(string, string)) (Array 3) > C:\Temp\USER\dir3 2017-Sep-05 16:06:57 - Array!(Tuple!(string, string)) (Array 4) > > Required Output: > C:\Temp\USER\dir3 2017-Sep-05 16:06:57 - Array!(Tuple!(string, string)) (Array 4) > C:\Temp\EXPORT\dir2 2017-Sep-06 16:06:58 - Array!(Tuple!(string, string)) (Array 1) > C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 - Array!(Tuple!(string, string)) (Array 2) > C:\Temp\TEAM\dir1 2017-Sep-10 16:06:42 - Array!(Tuple!(string, string)) (Array 3) > > From, > Vino.B Example Program and Output import std.algorithm: filter, map, sort; import std.container.array; import std.file: SpanMode, dirEntries, isDir ; import std.range: chain; import std.stdio: writefln; import std.typecons: Tuple, tuple; void main () { auto FFs = Array!(string)("C:\\Temp\\BACKUP", "C:\\Temp\\EXPORT", "C:\\Temp\\PROD_TEAM"); int AgeSize = 2; foreach(d; FFs[]) { auto dFiles = Array!(Tuple!(string, string))(dirEntries(d, SpanMode.shallow).filter!(a => a.isDir).map!(a => tuple(a.name, a.timeCreated.toSimpleString[0 .. 20]))); writefln("%(%-(%-63s %s %)\n%)", chain(dFiles[]).sort!((a,b) => a[0] > b[0])); } } Output C:\Temp\BACKUP\DND3 2017-Sep-05 14:31:00 C:\Temp\BACKUP\dir1 2017-Sep-06 16:06:42 C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 C:\Temp\BACKUP\dir3 2017-Dec-10 06:56:07 C:\Temp\BACKUP\t1 2017-Dec-11 04:10:02 C:\Temp\EXPORT\DND6 2017-Sep-05 14:31:00 C:\Temp\PROD_TEAM\DND1 2017-Sep-05 14:31:01 Output Required C:\Temp\BACKUP\DND3 2017-Sep-05 14:31:00 C:\Temp\EXPORT\DND6 2017-Sep-05 14:31:00 C:\Temp\PROD_TEAM\DND1 2017-Sep-05 14:31:01 C:\Temp\BACKUP\dir1 2017-Sep-06 16:06:42 C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 C:\Temp\BACKUP\dir3 2017-Dec-10 06:56:07 C:\Temp\BACKUP\t1 2017-Dec-11 04:10:02 From, Vino.B |
December 11, 2017 Re: Tuple Array Sorting | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vino | On Monday, 11 December 2017 at 14:52:35 UTC, Vino wrote:
> Example Program and Output
>
> import std.algorithm: filter, map, sort;
> import std.container.array;
> import std.file: SpanMode, dirEntries, isDir ;
> import std.range: chain;
> import std.stdio: writefln;
> import std.typecons: Tuple, tuple;
>
> void main () {
> auto FFs = Array!(string)("C:\\Temp\\BACKUP", "C:\\Temp\\EXPORT", "C:\\Temp\\PROD_TEAM");
> int AgeSize = 2;
> foreach(d; FFs[]) {
> auto dFiles = Array!(Tuple!(string, string))(dirEntries(d, SpanMode.shallow).filter!(a => a.isDir).map!(a => tuple(a.name, a.timeCreated.toSimpleString[0 .. 20])));
> writefln("%(%-(%-63s %s %)\n%)", chain(dFiles[]).sort!((a,b) => a[0] > b[0]));
> }
> }
You're somewhat close. You're sorting based on the 0th element of your tuples, while you should sort on the 1st. Something like this:
import std.algorithm: filter, map, sort;
import std.array : array;
import std.file: SpanMode, dirEntries, isDir ;
import std.range: join;
import std.stdio: writefln;
import std.typecons: tuple;
void main () {
auto folders = ["D:\\Dev"];
auto sorted = folders
.map!(a => dirEntries(a, SpanMode.shallow))
.join
.filter!(a => a.isDir)
.map!(a => tuple(a.name, a.timeCreated.toSimpleString[0 .. 20]))
.array
.sort!((a,b) => a[1] > b[1]);
writefln("%( %( %-63s %s %) \n%)", sorted);
}
--
Biotronic
|
December 11, 2017 Re: Tuple Array Sorting | ||||
---|---|---|---|---|
| ||||
Posted in reply to Biotronic | On Monday, 11 December 2017 at 15:15:47 UTC, Biotronic wrote:
> On Monday, 11 December 2017 at 14:52:35 UTC, Vino wrote:
>> Example Program and Output
>>
>> import std.algorithm: filter, map, sort;
>> import std.container.array;
>> import std.file: SpanMode, dirEntries, isDir ;
>> import std.range: chain;
>> import std.stdio: writefln;
>> import std.typecons: Tuple, tuple;
>>
>> void main () {
>> auto FFs = Array!(string)("C:\\Temp\\BACKUP", "C:\\Temp\\EXPORT", "C:\\Temp\\PROD_TEAM");
>> int AgeSize = 2;
>> foreach(d; FFs[]) {
>> auto dFiles = Array!(Tuple!(string, string))(dirEntries(d, SpanMode.shallow).filter!(a => a.isDir).map!(a => tuple(a.name, a.timeCreated.toSimpleString[0 .. 20])));
>> writefln("%(%-(%-63s %s %)\n%)", chain(dFiles[]).sort!((a,b) => a[0] > b[0]));
>> }
>> }
>
> You're somewhat close. You're sorting based on the 0th element of your tuples, while you should sort on the 1st. Something like this:
>
> import std.algorithm: filter, map, sort;
> import std.array : array;
> import std.file: SpanMode, dirEntries, isDir ;
> import std.range: join;
> import std.stdio: writefln;
> import std.typecons: tuple;
>
> void main () {
> auto folders = ["D:\\Dev"];
>
> auto sorted = folders
> .map!(a => dirEntries(a, SpanMode.shallow))
> .join
> .filter!(a => a.isDir)
> .map!(a => tuple(a.name, a.timeCreated.toSimpleString[0 .. 20]))
> .array
> .sort!((a,b) => a[1] > b[1]);
>
> writefln("%( %( %-63s %s %) \n%)", sorted);
> }
>
> --
> Biotronic
Hi,
I tired that but no luck, below is the output, in your code you have one folder "auto folders = ["D:\\Dev"];" if you have multiple folder then output is not sorted.
C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11
C:\Temp\BACKUP\dir1 2017-Sep-06 16:06:42
C:\Temp\BACKUP\DND3 2017-Sep-05 14:31:00
C:\Temp\BACKUP\t1 2017-Dec-11 04:10:02
C:\Temp\BACKUP\dir3 2017-Dec-10 06:56:07
C:\Temp\EXPORT\DND6 2017-Sep-05 14:31:00
C:\Temp\PROD_TEAM\DND1 2017-Sep-05 14:31:01
From,
Vino.B
|
December 11, 2017 Re: Tuple Array Sorting | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vino | On Monday, 11 December 2017 at 15:33:08 UTC, Vino wrote:
> I tired that but no luck, below is the output, in your code you have one folder "auto folders = ["D:\\Dev"];" if you have multiple folder then output is not sorted.
Works on my machine. Of course, since time toSimpleString returns non-ISO8601, the sorting might not make perfect sense ("2017-Dec-12" < "2017-Jan-01"). Testing with multiple folders gives perfectly sorted output. If you want it sorted by date instead of by string representation of date, feel free to remove .toSimpleString[0 .. 20].
--
Biotronic
|
December 11, 2017 Re: Tuple Array Sorting | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vino | On Monday, 11 December 2017 at 15:33:08 UTC, Vino wrote:
> On Monday, 11 December 2017 at 15:15:47 UTC, Biotronic wrote:
>> On Monday, 11 December 2017 at 14:52:35 UTC, Vino wrote:
>>> Example Program and Output
>>>
>>> import std.algorithm: filter, map, sort;
>>> import std.container.array;
>>> import std.file: SpanMode, dirEntries, isDir ;
>>> import std.range: chain;
>>> import std.stdio: writefln;
>>> import std.typecons: Tuple, tuple;
>>>
>>> void main () {
>>> auto FFs = Array!(string)("C:\\Temp\\BACKUP", "C:\\Temp\\EXPORT", "C:\\Temp\\PROD_TEAM");
>>> int AgeSize = 2;
>>> foreach(d; FFs[]) {
>>> auto dFiles = Array!(Tuple!(string, string))(dirEntries(d, SpanMode.shallow).filter!(a => a.isDir).map!(a => tuple(a.name, a.timeCreated.toSimpleString[0 .. 20])));
>>> writefln("%(%-(%-63s %s %)\n%)", chain(dFiles[]).sort!((a,b) => a[0] > b[0]));
>>> }
>>> }
>>
>> You're somewhat close. You're sorting based on the 0th element of your tuples, while you should sort on the 1st. Something like this:
>>
>> import std.algorithm: filter, map, sort;
>> import std.array : array;
>> import std.file: SpanMode, dirEntries, isDir ;
>> import std.range: join;
>> import std.stdio: writefln;
>> import std.typecons: tuple;
>>
>> void main () {
>> auto folders = ["D:\\Dev"];
>>
>> auto sorted = folders
>> .map!(a => dirEntries(a, SpanMode.shallow))
>> .join
>> .filter!(a => a.isDir)
>> .map!(a => tuple(a.name, a.timeCreated.toSimpleString[0 .. 20]))
>> .array
>> .sort!((a,b) => a[1] > b[1]);
>>
>> writefln("%( %( %-63s %s %) \n%)", sorted);
>> }
>>
>> --
>> Biotronic
>
> Hi,
>
> I tired that but no luck, below is the output, in your code you have one folder "auto folders = ["D:\\Dev"];" if you have multiple folder then output is not sorted.
>
> C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11
> C:\Temp\BACKUP\dir1 2017-Sep-06 16:06:42
> C:\Temp\BACKUP\DND3 2017-Sep-05 14:31:00
> C:\Temp\BACKUP\t1 2017-Dec-11 04:10:02
> C:\Temp\BACKUP\dir3 2017-Dec-10 06:56:07
> C:\Temp\EXPORT\DND6 2017-Sep-05 14:31:00
> C:\Temp\PROD_TEAM\DND1 2017-Sep-05 14:31:01
Are you sure that's the output from my code? Let's step through the code:
// Iterating over folders:
folders
// Create a range where each element is a range of DirEntry
// in the given folder.
.map!(a => dirEntries(a, SpanMode.shallow))
// Join these together to a single range of DirEntry instead of
// a range-of-ranges-of-DirEntry.
.join
// Remove anything that's not a folder.
.filter!(a => a.isDir)
// Grab the information we actually care about.
.map!(a => tuple(a.name, a.timeCreated))
// Enumerate to an array, so we can sort it.
.array
// Sort this array by the second tuple element (timeCreated).
.sort!((a,b) => a[1] > b[1]);
If this code does not do what you're asking, there's a bug outside of the code, probably in the standard library.
If instead you are invoking the program multiple times with a single folder each time, the output you describe is to be expected.
Apart from that, I'm not sure what could be wrong.
--
Biotronic
|
December 11, 2017 Re: Tuple Array Sorting | ||||
---|---|---|---|---|
| ||||
Posted in reply to Biotronic | On Monday, 11 December 2017 at 15:54:11 UTC, Biotronic wrote: > On Monday, 11 December 2017 at 15:33:08 UTC, Vino wrote: >> On Monday, 11 December 2017 at 15:15:47 UTC, Biotronic wrote: >>> [...] >> >> Hi, >> >> I tired that but no luck, below is the output, in your code you have one folder "auto folders = ["D:\\Dev"];" if you have multiple folder then output is not sorted. >> >> C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11 >> C:\Temp\BACKUP\dir1 2017-Sep-06 16:06:42 >> C:\Temp\BACKUP\DND3 2017-Sep-05 14:31:00 >> C:\Temp\BACKUP\t1 2017-Dec-11 04:10:02 >> C:\Temp\BACKUP\dir3 2017-Dec-10 06:56:07 >> C:\Temp\EXPORT\DND6 2017-Sep-05 14:31:00 >> C:\Temp\PROD_TEAM\DND1 2017-Sep-05 14:31:01 > > Are you sure that's the output from my code? Let's step through the code: > > // Iterating over folders: > folders > // Create a range where each element is a range of DirEntry > // in the given folder. > .map!(a => dirEntries(a, SpanMode.shallow)) > // Join these together to a single range of DirEntry instead of > // a range-of-ranges-of-DirEntry. > .join > // Remove anything that's not a folder. > .filter!(a => a.isDir) > // Grab the information we actually care about. > .map!(a => tuple(a.name, a.timeCreated)) > // Enumerate to an array, so we can sort it. > .array > // Sort this array by the second tuple element (timeCreated). > .sort!((a,b) => a[1] > b[1]); > > If this code does not do what you're asking, there's a bug outside of the code, probably in the standard library. > > If instead you are invoking the program multiple times with a single folder each time, the output you describe is to be expected. > > Apart from that, I'm not sure what could be wrong. > > -- > Biotronic Hi Biotronic, I tried your code with multiple folder's , but no luck the output is not sorted. Program: import std.algorithm: filter, map, sort; import std.array; import std.file: SpanMode, dirEntries, isDir ; import std.stdio: writefln, writeln; import std.typecons: Tuple, tuple; void main () { auto FFs = ["C:\\Temp\\sapnas2\\BACKUP", "C:\\Temp\\sapnas2\\EXPORT", "C:\\Temp\\sapnas2\\PROD_TEAM"]; auto sorted = FFs .map!(a => dirEntries(a, SpanMode.shallow)) .join .filter!(a => a.isDir) .map!(a => tuple(a.name, a.timeCreated.toSimpleString[0 .. 20])) .array .sort!((a,b) => a[1] > b[1]); writefln("%( %( %-63s %s %) \n%)", sorted); } From, Vino.B |
December 11, 2017 Re: Tuple Array Sorting | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vino | On Monday, 11 December 2017 at 16:15:14 UTC, Vino wrote:
> On Monday, 11 December 2017 at 15:54:11 UTC, Biotronic wrote:
>> [...]
>
> Hi Biotronic,
>
> I tried your code with multiple folder's , but no luck the output is not sorted.
>
> Program:
> import std.algorithm: filter, map, sort;
> import std.array;
> import std.file: SpanMode, dirEntries, isDir ;
> import std.stdio: writefln, writeln;
> import std.typecons: Tuple, tuple;
>
> void main () {
> auto FFs = ["C:\\Temp\\sapnas2\\BACKUP", "C:\\Temp\\sapnas2\\EXPORT", "C:\\Temp\\sapnas2\\PROD_TEAM"];
> auto sorted = FFs
> .map!(a => dirEntries(a, SpanMode.shallow))
> .join
> .filter!(a => a.isDir)
> .map!(a => tuple(a.name, a.timeCreated.toSimpleString[0 .. 20]))
> .array
> .sort!((a,b) => a[1] > b[1]);
> writefln("%( %( %-63s %s %) \n%)", sorted);
> }
>
> From,
> Vino.B
Your program still contains toSimpleString in the sort lambda. Have you, as suggested, removed it?
As Biotronic explained, sorting on the string representation of dates can't work.
|
December 11, 2017 Re: Tuple Array Sorting | ||||
---|---|---|---|---|
| ||||
Posted in reply to Seb | On Monday, 11 December 2017 at 19:23:40 UTC, Seb wrote:
> On Monday, 11 December 2017 at 16:15:14 UTC, Vino wrote:
>> On Monday, 11 December 2017 at 15:54:11 UTC, Biotronic wrote:
>>> [...]
>>
>> Hi Biotronic,
>>
>> I tried your code with multiple folder's , but no luck the output is not sorted.
>>
>> Program:
>> import std.algorithm: filter, map, sort;
>> import std.array;
>> import std.file: SpanMode, dirEntries, isDir ;
>> import std.stdio: writefln, writeln;
>> import std.typecons: Tuple, tuple;
>>
>> void main () {
>> auto FFs = ["C:\\Temp\\sapnas2\\BACKUP", "C:\\Temp\\sapnas2\\EXPORT", "C:\\Temp\\sapnas2\\PROD_TEAM"];
>> auto sorted = FFs
>> .map!(a => dirEntries(a, SpanMode.shallow))
>> .join
>> .filter!(a => a.isDir)
>> .map!(a => tuple(a.name, a.timeCreated.toSimpleString[0 .. 20]))
>> .array
>> .sort!((a,b) => a[1] > b[1]);
>> writefln("%( %( %-63s %s %) \n%)", sorted);
>> }
>>
>> From,
>> Vino.B
>
> Your program still contains toSimpleString in the sort lambda. Have you, as suggested, removed it?
> As Biotronic explained, sorting on the string representation of dates can't work.
Hi,
Yes, I have changed the code as below, and removed the toSimpleString, even then no luck.
Code:
import std.algorithm;
import std.container.array;
import std.file: SpanMode, dirEntries, isDir ;
import std.stdio: writefln, writeln;
import std.typecons: Tuple, tuple;
import std.range: chain;
void main () {
auto FFs = ["C:\\Temp\\BACKUP", "C:\\Temp\\EXPORT", "C:\\Temp\\PROD_TEAM"];
foreach(d; FFs[]) {
auto dFiles = Array!(Tuple!(string, SysTime))(dirEntries(d, SpanMode.shallow).filter!(a => a.isDir).map!(a => tuple(a.name, a.timeCreated)));
writefln("%(%-(%-63s %s %)\n%)", chain(dFiles[]).sort!((a, b) => a[1] < b[1]));
}
}
Output
C:\Temp\BACKUP\DND3 2017-Sep-05 14:31:00.7037169
C:\Temp\BACKUP\dir1 2017-Sep-06 16:06:42.7223837
C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11.7604069
C:\Temp\BACKUP\dir3 2017-Dec-10 06:56:07.5122231
C:\Temp\BACKUP\t1 2017-Dec-11 04:10:02.6413853
C:\Temp\EXPORT\DND6 2017-Sep-05 14:31:00.8909172
C:\Temp\PROD_TEAM\DND1 2017-Sep-05 14:31:01.8269189
Required Output:
C:\Temp\BACKUP\DND3 2017-Sep-05 14:31:00.7037169
C:\Temp\EXPORT\DND6 2017-Sep-05 14:31:00.8909172
C:\Temp\PROD_TEAM\DND1 2017-Sep-05 14:31:01.8269189
C:\Temp\BACKUP\dir1 2017-Sep-06 16:06:42.7223837
C:\Temp\BACKUP\dir2 2017-Sep-09 22:44:11.7604069
C:\Temp\BACKUP\dir3 2017-Dec-10 06:56:07.5122231
C:\Temp\BACKUP\t1 2017-Dec-11 04:10:02.6413853
From,
Vino.B
|
Copyright © 1999-2021 by the D Language Foundation