Multi Commander > Script

Script to rearrange files based on weeknumber into folders with weeknumber

<< < (2/2)

Jungle:
Here comes The Magic! :) Below is the script function calculating week number in accordance with ISO 8601. The code was taken here and converted to MultiScript. MC v7.x is required.

I haven't done much testing, but results for all days in 2001-2010 are the same as in Excel.


--- Code: ---function IsLeapYear( $year )
{
  return IsAnyTrue( IsAllTrue( mod( $year, 4 ) == 0, !( mod( $year, 100 ) == 0 ) ), mod( $year, 400 ) == 0 );
}

function WeekNumIso8601( $day, $month, $year )
{
  @var  $YY, $C, $G, $I, $J, $DayOfYearNumber, $Jan1Weekday, $Weekday, $YearNumber;
  @var  $LeapYear = 0, $precLeapYear = 0, $WeekNumber = 0;
  @var  $Mnth = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };

  // 1. Find if Y is LeapYear
  if ( IsLeapYear( $year ) )
  {
    $LeapYear = 1;
  }

  // 2. Find if Y-1 is LeapYear
  if ( IsLeapYear( $year - 1 ) )
  {
    $precLeapYear = 1;
  }

  //3. Find the DayOfYearNumber for Y M D
  $DayOfYearNumber = ( $day ) + ( $Mnth[ $month - 1 ] );
  if ( IsAllTrue( $LeapYear > 0 , $month > 2 ) )
  {
    $DayOfYearNumber++;
  }

  // 4. Find the Jan1Weekday for Y (Monday=1, Sunday=7)
  $YY = mod( $year - 1, 100 );
  $C = ( $year - 1 ) - $YY;
  $G = $YY + ( $YY / 4 );
  $I = mod( $C / 100, 4 );
  $Jan1Weekday = 1 + mod( ( $I * 5 ) + $G, 7 );

  // 5. Find the Weekday for Y M D
  $I = $DayOfYearNumber + ( $Jan1Weekday - 1 );
  $Weekday = 1 + mod( $I - 1, 7 );

  if ( $Weekday == 0 )
  {
    $Weekday = 7;
  }

  // 6. Find if Y M D falls in YearNumber Y-1, WeekNumber 52 or 53
  if ( IsAllTrue( $DayOfYearNumber <= ( 8 - $Jan1Weekday ), $Jan1Weekday > 4 ) )
  {
    $YearNumber = $year - 1;
   
    if ( IsAnyTrue( $Jan1Weekday == 5, IsAllTrue( $Jan1Weekday == 6, $precLeapYear == 1 ) ) )
    {
      $WeekNumber = 53;
    }
    else
    {
      $WeekNumber = 52;
    }
  }
  else
  {
    $YearNumber = $year;
  }

  // 7. Find if Y M D falls in YearNumber Y+1, WeekNumber 1
  if ( $YearNumber == $year )
  {
    if ( $LeapYear == 1 )
    {
      $I = 366;
    }
    else
    {
      $I = 365;
    }
    if ( ( $I - $DayOfYearNumber ) < ( 4 - $Weekday ) )
    {
      $YearNumber = $year + 1;
      $WeekNumber = 1;
    }
  }

  // 8. Find if Y M D falls in YearNumber Y, WeekNumber 1 through 53
  if ( $YearNumber == $year )
  {
    $J = $DayOfYearNumber + ( 7 - $Weekday ) + ( $Jan1Weekday - 1 );
    $WeekNumber = $J / 7;

    if ( $Jan1Weekday > 4 )
    {
      $WeekNumber--;
    }
  }
 
  return $WeekNumber;
}
--- End code ---

Mathias (Author):

--- Quote from: Jungle on April 10, 2017, 18:42:34 ---Here comes The Magic! :) Below is the script function calculating week number in accordance with ISO 8601. The code was taken here and converted to MultiScript. MC v7.x is required.

I haven't done much testing, but results for all days in 2001-2010 are the same as in Excel.


--- End quote ---

Wow I'm impressed, You really use the script engine more than I every indented it for.
Not sure I would have the patience to write all that. very cool

Herrie:
Although the function  looks K, I still wonder how to embed it in a script that:

runs through all files in a folder, moives them to a new folder, created beforehand
e.g.
:mainFolder\ file_x.txt date= 10-10-2017
should land in folder w41 (being the weeknumber)
OR
run through the filelist in a folder and ADD the weeknumber attribute (?) to the file

Navigation

[0] Message Index

[*] Previous page

Go to full version