Task

Write a simple tool to track a small set of data.

The tool should have a command-line interface to enter at least two different values.

The entered data should be stored in a structured format and saved to disk.

It does not matter what kind of data is being tracked.   It could be a collection (CDs, coins, baseball cards, books), a diary, an electronic organizer (birthdays/anniversaries/phone numbers/addresses), etc.



You should track the following details:

 A description of the item. (e.g., title, name)
 A category or tag (genre, topic, relationship such as “friend” or “family”)
 A date (either the date when the entry was made or some other date that is meaningful, like the birthday); the date may be generated or entered manually
 Other optional fields


The command should support the following Command-line arguments to run:

 Add a new entry
 Print the latest entry
 Print the latest entry for each category
 Print all entries sorted by a date


The category may be realized as a tag or as structure (by making all entries in that category subitems)

The file format on disk should be human readable, but it need not be standardized.   A natively available format that doesn't need an external library is preferred.   Avoid developing your own format if you can use an already existing one.   If there is no existing format available, pick one of:

   JSON
   S-Expressions
   YAML
   others


Related task

   Take notes on the command line 


/* REXX ---------------------------------------------------------------
* 05.10.2014
*--------------------------------------------------------------------*/
x05='05'x
mydb='sidb.txt'
Say 'Enter your commands, ?, or end'
Do Forever
  Parse Pull l
  Parse Var l command text
  Select
    When command='?' Then
      Call help
    When command='add' Then Do
      Parse Var text item ',' category ',' date
      If date='' Then
        date=date('S') /*yyyymmdd*/
      Say 'adding item' item'/'category 'dated' date
      Call lineout mydb,date item x05 category
      End
    When command='latest' Then Do
      Call lineout mydb
      Parse Var text category
      hidt='00000000'
      ol=''
      Do While lines(mydb)>0
        l=linein(mydb)
        Parse Var l dt a (x05) b
        If category=''|,
           category='-' & b='' |,
           b=category Then Do
          If dt>>hidt Then Do
            ol=l
            hidt=dt
            End
          End
        End
        If ol>'' Then
          Call o ol
        Else
          Say 'no matching item found'
      End
    When command='all' Then Do
      Call lineout mydb
      Parse Var text category
      Do While lines(mydb)>0
        l=linein(mydb)
        Parse Var l a (x05) b
        If category=''|,
           category='-' & b=''|,
           b=category Then
          Call o l
        End
      End
    When command='end' Then
      Leave
    Otherwise Do
      Say 'invalid command ('command')'
      Call help
      End
    End
  End
Say 'Bye'
Exit
 
o: Parse Value arg(1) With dt text
   Say left(dt,8) text
   Return
 
help:
  Say 'add item[,[category][,date]] to add an item'
  Say 'latest category to list the latest item of a category'
  Say 'latest to list the latest item'
  Say 'all category to list all items of a category'
  Say 'all to list all items'
  Say 'end to end this program'
  Say 'Use category - to list items without category'
  Return