# Sorting an array of dates as strings

**URL:** <https://discourse.processing.org/t/sorting-an-array-of-dates-as-strings/7487>\
**Category:** Coding Questions\
**Created:** [January 14, 2019, 1:37am UTC](https://discourse.processing.org/t/sorting-an-array-of-dates-as-strings/7487 "2019-01-14T01:37:20Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![epicwyvern](https://avatars.discourse-cdn.com/v4/letter/e/aca169/32.png) [@epicwyvern](https://discourse.processing.org/u/epicwyvern)\
**Post date:** [January 14, 2019, 1:37am UTC](https://discourse.processing.org/t/sorting-an-array-of-dates-as-strings/7487/1 "2019-01-14T01:37:20Z")

</div>

Hello guys, i need help with a specific problem regarding sorting i have run into for my program.

say i have the following text file that contains first and last names, with the third row consisting of dates

```auto
Carrie,Williamson,29/06/2028
Alejandro,Bell,07/11/1997
Christina,Wise,27/01/1988
Charlotte,Stephens,14/08/1977
May,Andrews,27/05/1955
Elnora,Porter,03/12/1933
Cory,Morris,19/01/1966
Travis,Thompson,12/05/2070
Lizzie,Holland,10/01/2062
Charlotte,Jensen,09/06/1915
Dennis,Coleman,12/10/2054
Chris,Osborne,03/09/1908
...

```

the output i get currently would be :

```auto
Chris,Osborne,03/09/1908
Elnora,Porter,03/12/1933
Alejandro,Bell,07/11/1997
Charlotte,Jensen,09/06/1915
Lizzie,Holland,10/01/2062
Travis,Thompson,12/05/2070
Dennis,Coleman,12/10/2054
Charlotte,Stephens,14/08/1977
Cory,Morris,19/01/1966
Christina,Wise,27/01/1988
May,Andrews,27/05/1955
Carrie,Williamson,29/06/2028

```

i want to know if there is a way to sort the last row in this file using the Table function in processing, or if there is another way to sort the last row in this text file

---

<div class="post-metadata">

**Author:** ![kll](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/kll/32/964_2.png) [@kll](https://discourse.processing.org/u/kll)\
**Post date:** [January 14, 2019, 4:08am UTC](https://discourse.processing.org/t/sorting-an-array-of-dates-as-strings/7487/2 "2019-01-14T04:08:35Z")

</div>

as the file is of type  
CSV  
and there is a

> **[sort() / Reference](https://processing.org/reference/Table_sort_.html)**
>
> Sorts (orders) a table based on the values in a column.

available your idea might be good,  
still as

> **[addColumn() / Reference](https://processing.org/reference/Table_addColumn_.html)**
>
> Use addColumn() to add a new column to a Table object. Typically, you will want to specify a title, so the column may be easily referenced later by name. (If no title is specified, the n…

only know column types

> |type|int: the type to be used for the new column: INT, LONG, FLOAT, DOUBLE, or STRING

and not DATE  
it might not matter too much if you use table or string

the whole line as string ( array of )  
and use

> **[splitTokens() / Reference](https://processing.org/reference/splitTokens_.html)**
>
> The splitTokens() function splits a String at one or many character delimiters or "tokens". The delim parameter specifies the character or characters to be used as a boundary.

on “,/” might give you 5 columns  
OR  
now the main question is what DATE functions on string are available?  
i not find anything snappy so i play:

```auto
import java.text.SimpleDateFormat;
import java.util.*;
// string to date format

String indate = "07/11/1997"; // month/day/year thinking
Date makedate = new Date();

Date conv_datestring(String indate) {
  Date pdate = new Date();
  try {
    pdate = new SimpleDateFormat("MM/dd/yyyy").parse(indate);
  }
  catch (Exception e) {
  }
  print(indate+" : ");
  println(new SimpleDateFormat("yyyy:MM:dd HH:mm:ss").format(pdate));
  
  return pdate;
}

void setup() {
  size(200,200);
  makedate = conv_datestring(indate);
}

```

can also convert to EPOCH millis ( store as LONG, sort, calc… and back)

```auto
long oneday = 1000*24*60*60,onehour = 1000*60*60,datemillis;

void setup() {
  size(200, 200);
  // You can simply parse it to java.util.Date using java.text.SimpleDateFormat 
  // and call it's getTime() function.
  // It will return the number of milliseconds since Jan 01 1970.
  makedate = conv_datestring(indate);
  println("date: "+makedate);
  datemillis = makedate.getTime(); // can save and sort as LONG
  //println("as Long EPOCH millis "+datemillis);
  datemillis+=oneday+onehour; // calc next day +1 hour
  makedate = new Date(datemillis); // convert back
  println("date++: "+makedate);

}

```

> **example**
>
> ```auto
> // https://discourse.processing.org/t/sorting-an-array-of-dates-as-strings/7487
> // not same like
> // https://discourse.processing.org/t/processing-3-0-how-to-sort-string-array-by-value-of-substrings/6436
> 
> /*
> Carrie,Williamson,29/06/2028
> Alejandro,Bell,07/11/1997
> Christina,Wise,27/01/1988
> Charlotte,Stephens,14/08/1977
> May,Andrews,27/05/1955
> Elnora,Porter,03/12/1933
> Cory,Morris,19/01/1966
> Travis,Thompson,12/05/2070
> Lizzie,Holland,10/01/2062
> Charlotte,Jensen,09/06/1915
> Dennis,Coleman,12/10/2054
> Chris,Osborne,03/09/1908
> */
> // in data/mylist.csv
> 
> // get the java date tools
> import java.text.SimpleDateFormat;
> import java.util.*;
> String indate = "28/11/1997"; // day/month/year thinking
> String informat = "dd/MM/yyyy";
> String outformat= "yyyy:MM:dd HH:mm:ss";
> Date makedate = new Date();
> 
> String infilename = "data/mylist.csv";
> String outfilename = "data/mylist_sort.csv";
> Table mytable;
> TableRow row;
> int tcols, trows;
> boolean dprint = true;
> 
> void getfile_tabledata() { // get tabledata from file
> mytable = loadTable(infilename);//, "header, csv");
> print_table();
> }
> 
> void make_new_sortcolumn() {
> // idea is that the date are string type date and need to make a new column what convert that date to a standard numeric form what can be sorted.
> mytable.addColumn();
> tcols = mytable.getColumnCount();
> trows = mytable.getRowCount();
> if (dprint) println("new: total cols in table: "+tcols);
> mytable.setColumnType(tcols-1, Table.LONG); // for millis sinze 1970 need LONG
> for ( int i = 0; i < trows; i++ ) {
> TableRow thisrow = mytable.getRow(i);
> String datestring = thisrow.getString(2);
> thisrow.setLong(3,conv_datestring_to_millis(datestring,dprint));
> }
> }
> 
> long conv_datestring_to_millis(String indate, boolean diag) {
> Date pdate = new Date();
> try {
> pdate = new SimpleDateFormat(informat).parse(indate);
> }
> catch (Exception e) {
> }
> if (diag) println(indate+" : "+new SimpleDateFormat(outformat).format(pdate));
> return pdate.getTime();
> }
> 
> void sort_tabledata(int numcol) { // sort numerically a specific column
> //mytable.setColumnType(numcol, Table.INT); 
> mytable.sort(numcol);  
> if (dprint) println("list all rows column "+numcol+" sorted ");
> print_table();
> }
> 
> void remove_new_sortcolumn(int delcol) {
> mytable.removeColumn(delcol);  
> }
> 
> void print_table() {
> tcols = mytable.getColumnCount();
> if (dprint) println("total cols in table: "+tcols);
> trows = mytable.getRowCount();
> if (dprint) println("total rows in table: "+trows);
> 
> for ( int i = 0; i < trows; i++ ) {
> TableRow thisrow = mytable.getRow(i);
> if (dprint) print("["+i+"] ");
> for ( int j = 0; j < tcols; j++ ) {      
> if (dprint) print(thisrow.getString(j)+", ");
> }
> if (dprint) println();
> }
> }
> 
> void save_tabledata() { // save to other file
> saveTable(mytable, outfilename);//, "csv");
> }
> 
> void setup() {
> getfile_tabledata();
> make_new_sortcolumn(); // column 2 date to column 3 millis 
> sort_tabledata(3); // column sort 0,1,2
> remove_new_sortcolumn(3);
> save_tabledata();
> exit();
> }
> 
> ```
