Jd tutorials Jd Tutorials (version 4.25)
Jd wiki is the Jd reference. A user with Jd installed can use interactive tutorials to learn and explore. This document is a listing of running all tutorials.
basic
  intro_a
  intro_b
  intro_c
  pairs
  stock_data
  table_from_pairs
  epochdt
  admin
op
  createcol
  createdcol
  createtable
  delete
  gen
  info
  insert
  intx
  key
  read
  reads
    reads_basic
    reads_clauses
    reads_from
    reads_join
    reads_aggregation
    reads_option_table
  setget
  sort
  tablecopy
  tableinsert
  tablemove
  update
    update_basic
    update_advanced
  upsert
    upsert_basic
    upsert_advanced
csv
  intro_csv
  bus_lic
  quandl_ibm
  csv_advanced
demo
  northwind
  sandp
  sed
  vr
server
  jcs
  jhs
xtra
  custom
  dropstop
  link
  log
  performance
  ptable
  replicate
  table_table

intro_a
create db, table, columns
read - select, where, aggregation
   jdadminnew'test' NB. create new db (~temp/jd/test)
   c=: ' year int, sales int, product byte 5,team byte 4'
   jd'createtable t1 ',c
   jd'reads from t1'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
└────┴─────┴───────┴────┘
   d=: (4#2002 2003 2001);(?12$1000);(>12$2#'shoes';'hats');>12$'blue';'red'
   d=: ('year';'sales';'product';'team'),.d
   ,d NB. list of pairs
┌────┬───────────────────────────────────────────────────────────┬─────┬────────────────────────────────────────────┬───────┬─────┬────┬────┐
│year│2002 2002 2002 2002 2003 2003 2003 2003 2001 2001 2001 2001│sales│990 56 6 644 535 619 723 435 130 717 609 246│product│shoes│team│blue│
│    │                                                           │     │                                            │       │shoes│    │red │
│    │                                                           │     │                                            │       │hats │    │blue│
│    │                                                           │     │                                            │       │hats │    │red │
│    │                                                           │     │                                            │       │shoes│    │blue│
│    │                                                           │     │                                            │       │shoes│    │red │
│    │                                                           │     │                                            │       │hats │    │blue│
│    │                                                           │     │                                            │       │hats │    │red │
│    │                                                           │     │                                            │       │shoes│    │blue│
│    │                                                           │     │                                            │       │shoes│    │red │
│    │                                                           │     │                                            │       │hats │    │blue│
│    │                                                           │     │                                            │       │hats │    │red │
└────┴───────────────────────────────────────────────────────────┴─────┴────────────────────────────────────────────┴───────┴─────┴────┴────┘
   jd'insert t1';,d  NB. insert list of pairs
   jd'reads from t1' NB. names on top
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│990  │shoes  │blue│
│2002│ 56  │shoes  │red │
│2002│  6  │hats   │blue│
│2002│644  │hats   │red │
│2003│535  │shoes  │blue│
│2003│619  │shoes  │red │
│2003│723  │hats   │blue│
│2003│435  │hats   │red │
│2001│130  │shoes  │blue│
│2001│717  │shoes  │red │
│2001│609  │hats   │blue│
│2001│246  │hats   │red │
└────┴─────┴───────┴────┘
   jd'read  from t1' NB. names on left
┌───────┬───────────────────────────────────────────────────────────┐
│year   │2002 2002 2002 2002 2003 2003 2003 2003 2001 2001 2001 2001│
├───────┼───────────────────────────────────────────────────────────┤
│sales  │990 56 6 644 535 619 723 435 130 717 609 246               │
├───────┼───────────────────────────────────────────────────────────┤
│product│shoes                                                      │
│       │shoes                                                      │
│       │hats                                                       │
│       │hats                                                       │
│       │shoes                                                      │
│       │shoes                                                      │
│       │hats                                                       │
│       │hats                                                       │
│       │shoes                                                      │
│       │shoes                                                      │
│       │hats                                                       │
│       │hats                                                       │
├───────┼───────────────────────────────────────────────────────────┤
│team   │blue                                                       │
│       │red                                                        │
│       │blue                                                       │
│       │red                                                        │
│       │blue                                                       │
│       │red                                                        │
│       │blue                                                       │
│       │red                                                        │
│       │blue                                                       │
│       │red                                                        │
│       │blue                                                       │
│       │red                                                        │
└───────┴───────────────────────────────────────────────────────────┘
   jd'info table'
┌─────┐
│table│
├─────┤
│t1   │
└─────┘
   jd'info schema'
┌─────┬───────┬────┬─────┐
│table│column │type│shape│
├─────┼───────┼────┼─────┤
│t1   │year   │int │_    │
│t1   │sales  │int │_    │
│t1   │product│byte│5    │
│t1   │team   │byte│4    │
└─────┴───────┴────┴─────┘

   ''jdae'reads from t7' NB. jdae - accept expected error
Not found: table t7
   jdlast  NB. last error
┌────────────────────────┐
│Jd error                │
├────────────────────────┤
│Not found: table t7     │
├────────────────────────┤
│op:reads db:test user:u │
└────────────────────────┘
   jdlasty NB. last jd arg 
reads from t7

   jd'reads from t1'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│990  │shoes  │blue│
│2002│ 56  │shoes  │red │
│2002│  6  │hats   │blue│
│2002│644  │hats   │red │
│2003│535  │shoes  │blue│
│2003│619  │shoes  │red │
│2003│723  │hats   │blue│
│2003│435  │hats   │red │
│2001│130  │shoes  │blue│
│2001│717  │shoes  │red │
│2001│609  │hats   │blue│
│2001│246  │hats   │red │
└────┴─────┴───────┴────┘
   jd'reads year,sales from t1'
┌────┬─────┐
│year│sales│
├────┼─────┤
│2002│990  │
│2002│ 56  │
│2002│  6  │
│2002│644  │
│2003│535  │
│2003│619  │
│2003│723  │
│2003│435  │
│2001│130  │
│2001│717  │
│2001│609  │
│2001│246  │
└────┴─────┘
   jd'reads from t1 order by year'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2001│130  │shoes  │blue│
│2001│717  │shoes  │red │
│2001│609  │hats   │blue│
│2001│246  │hats   │red │
│2002│990  │shoes  │blue│
│2002│ 56  │shoes  │red │
│2002│  6  │hats   │blue│
│2002│644  │hats   │red │
│2003│535  │shoes  │blue│
│2003│619  │shoes  │red │
│2003│723  │hats   │blue│
│2003│435  │hats   │red │
└────┴─────┴───────┴────┘
   jd'reads from t1 where year<2003'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│990  │shoes  │blue│
│2002│ 56  │shoes  │red │
│2002│  6  │hats   │blue│
│2002│644  │hats   │red │
│2001│130  │shoes  │blue│
│2001│717  │shoes  │red │
│2001│609  │hats   │blue│
│2001│246  │hats   │red │
└────┴─────┴───────┴────┘
   jd'reads from t1 where year<2003 order by year'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2001│130  │shoes  │blue│
│2001│717  │shoes  │red │
│2001│609  │hats   │blue│
│2001│246  │hats   │red │
│2002│990  │shoes  │blue│
│2002│ 56  │shoes  │red │
│2002│  6  │hats   │blue│
│2002│644  │hats   │red │
└────┴─────┴───────┴────┘
   jd'reads from t1 where year<2003 and team="blue"'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│990  │shoes  │blue│
│2002│  6  │hats   │blue│
│2001│130  │shoes  │blue│
│2001│609  │hats   │blue│
└────┴─────┴───────┴────┘
   jd'reads from t1 where year<2003 and team="blue" or product="hats"'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│990  │shoes  │blue│
│2002│  6  │hats   │blue│
│2002│644  │hats   │red │
│2001│130  │shoes  │blue│
│2001│609  │hats   │blue│
│2001│246  │hats   │red │
└────┴─────┴───────┴────┘
   jd'reads from t1 where year<2000'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
└────┴─────┴───────┴────┘

   jd'reads sum sales from t1'
┌─────┐
│sales│
├─────┤
│5710 │
└─────┘
   jd'reads alias:sum sales from t1'
┌─────┐
│alias│
├─────┤
│5710 │
└─────┘
   jd'reads sum over sales:sum sales from t1'
┌──────────────┐
│sum over sales│
├──────────────┤
│5710          │
└──────────────┘
   jd'reads sum sales by year from t1 order by year'
┌────┬─────┐
│year│sales│
├────┼─────┤
│2001│1702 │
│2002│1696 │
│2003│2312 │
└────┴─────┘
   jd'reads sum sales by team from t1'
┌────┬─────┐
│team│sales│
├────┼─────┤
│blue│2993 │
│red │2717 │
└────┴─────┘
   jd'reads sum sales by product from t1'
┌───────┬─────┐
│product│sales│
├───────┼─────┤
│shoes  │3047 │
│hats   │2663 │
└───────┴─────┘
   jd'reads sum sales by team,product from t1'
┌────┬───────┬─────┐
│team│product│sales│
├────┼───────┼─────┤
│blue│shoes  │1655 │
│red │shoes  │1392 │
│blue│hats   │1338 │
│red │hats   │1325 │
└────┴───────┴─────┘
   jd'reads sum sales by year,team from t1 order by year'
┌────┬────┬─────┐
│year│team│sales│
├────┼────┼─────┤
│2001│blue│ 739 │
│2001│red │ 963 │
│2002│blue│ 996 │
│2002│red │ 700 │
│2003│blue│1258 │
│2003│red │1054 │
└────┴────┴─────┘
   jd'reads sum sales by year from t1'
┌────┬─────┐
│year│sales│
├────┼─────┤
│2002│1696 │
│2003│2312 │
│2001│1702 │
└────┴─────┘
   jd'reads sum sales,max sales by year from t1'
┌────┬─────┬─────┐
│year│sales│sales│
├────┼─────┼─────┤
│2002│1696 │990  │
│2003│2312 │723  │
│2001│1702 │717  │
└────┴─────┴─────┘
   s=: 'reads sum over sales:sum sales , max over sales:max sales by year from t1'
   jd s
┌────┬──────────────┬──────────────┐
│year│sum over sales│max over sales│
├────┼──────────────┼──────────────┤
│2002│1696          │990           │
│2003│2312          │723           │
│2001│1702          │717           │
└────┴──────────────┴──────────────┘
   jd s,' order by sum over sales' NB. order by uses alias
┌────┬──────────────┬──────────────┐
│year│sum over sales│max over sales│
├────┼──────────────┼──────────────┤
│2002│1696          │990           │
│2001│1702          │717           │
│2003│2312          │723           │
└────┴──────────────┴──────────────┘
   jd s,' order by max over sales'
┌────┬──────────────┬──────────────┐
│year│sum over sales│max over sales│
├────┼──────────────┼──────────────┤
│2001│1702          │717           │
│2003│2312          │723           │
│2002│1696          │990           │
└────┴──────────────┴──────────────┘

worthwhile skimming other basic tutorials
do advanced tutorials as questions come up
ptable tutorial for tables with many rows (300e6 to billions)

intro_b
update/upsert/delete/join
   jdadminnew'test' NB. create new db (~tmep/jd/test)
   d=: (4#2002 2003 2001);(?12$1000);(>12$2#'shoes';'hats');>12$'blue';'red'
   d=: ('year';'sales';'product';'team'),.d
   jd'createtable /pairs t1 ';,d NB. col names, types, shapes from pairs
   jd'reads from t1'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│900  │shoes  │blue│
│2002│319  │shoes  │red │
│2002│138  │hats   │blue│
│2002│505  │hats   │red │
│2003│ 74  │shoes  │blue│
│2003│ 54  │shoes  │red │
│2003│460  │hats   │blue│
│2003│781  │hats   │red │
│2001│455  │shoes  │blue│
│2001│169  │shoes  │red │
│2001│636  │hats   │blue│
│2001│ 29  │hats   │red │
└────┴─────┴───────┴────┘
   jd'insert t1';'year';2004;'sales';999;'product';'socks';'team';'red'
   jd'reads from t1 where year>=2003'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2003│ 74  │shoes  │blue│
│2003│ 54  │shoes  │red │
│2003│460  │hats   │blue│
│2003│781  │hats   │red │
│2004│999  │socks  │red │
└────┴─────┴───────┴────┘
   jd'reads *,jdindex from t1' NB. jdindex is table row index
┌────┬─────┬───────┬────┬───────┐
│year│sales│product│team│jdindex│
├────┼─────┼───────┼────┼───────┤
│2002│900  │shoes  │blue│ 0     │
│2002│319  │shoes  │red │ 1     │
│2002│138  │hats   │blue│ 2     │
│2002│505  │hats   │red │ 3     │
│2003│ 74  │shoes  │blue│ 4     │
│2003│ 54  │shoes  │red │ 5     │
│2003│460  │hats   │blue│ 6     │
│2003│781  │hats   │red │ 7     │
│2001│455  │shoes  │blue│ 8     │
│2001│169  │shoes  │red │ 9     │
│2001│636  │hats   │blue│10     │
│2001│ 29  │hats   │red │11     │
│2004│999  │socks  │red │12     │
└────┴─────┴───────┴────┴───────┘
   d=: jd'read jdindex,sales from t1 where year=2002'
   'index sales'=: ,{:"1 d
   index
0 1 2 3
   sales
900 319 138 505
   jd'reads from t1 where year=2002'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│900  │shoes  │blue│
│2002│319  │shoes  │red │
│2002│138  │hats   │blue│
│2002│505  │hats   │red │
└────┴─────┴───────┴────┘
   jd'update t1';index;'sales';sales+1
   jd'reads from t1 where year=2002'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│901  │shoes  │blue│
│2002│320  │shoes  │red │
│2002│139  │hats   │blue│
│2002│506  │hats   │red │
└────┴─────┴───────┴────┘

   jd'reads from t1 where year in (2002,2005)'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│901  │shoes  │blue│
│2002│320  │shoes  │red │
│2002│139  │hats   │blue│
│2002│506  │hats   │red │
└────┴─────┴───────┴────┘
   p=: 'year';2002 2005;'sales';5000 6000;'product';(>'shoes';'hats');'team';>'blue';'blue'
upsert uses key (year product team) to update existing row or insert new row
   jd'upsert t1';'year product team';p
   jd'reads from t1 where year in (2002,2005)'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│5000 │shoes  │blue│
│2002│ 320 │shoes  │red │
│2002│ 139 │hats   │blue│
│2002│ 506 │hats   │red │
│2005│6000 │hats   │blue│
└────┴─────┴───────┴────┘

   jd'reads from t1 order by year'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2001│ 455 │shoes  │blue│
│2001│ 169 │shoes  │red │
│2001│ 636 │hats   │blue│
│2001│  29 │hats   │red │
│2002│5000 │shoes  │blue│
│2002│ 320 │shoes  │red │
│2002│ 139 │hats   │blue│
│2002│ 506 │hats   │red │
│2003│  74 │shoes  │blue│
│2003│  54 │shoes  │red │
│2003│ 460 │hats   │blue│
│2003│ 781 │hats   │red │
│2004│ 999 │socks  │red │
│2005│6000 │hats   │blue│
└────┴─────┴───────┴────┘
   jd'delete t1 year=2001 or product="socks"'
   jd'reads from t1 order by year'
┌────┬─────┬───────┬────┐
│year│sales│product│team│
├────┼─────┼───────┼────┤
│2002│5000 │shoes  │blue│
│2002│ 320 │shoes  │red │
│2002│ 139 │hats   │blue│
│2002│ 506 │hats   │red │
│2003│  74 │shoes  │blue│
│2003│  54 │shoes  │red │
│2003│ 460 │hats   │blue│
│2003│ 781 │hats   │red │
│2005│6000 │hats   │blue│
└────┴─────┴───────┴────┘

   jd'createtable t2 team byte 4,contact byte 10'
   jd'insert t2';'team'; (>'blue';'red');'contact';>'4161231234';'7051231235'
   jd'reads from t2'
┌────┬──────────┐
│team│contact   │
├────┼──────────┤
│blue│4161231234│
│red │7051231235│
└────┴──────────┘
   jd'ref t1 team t2 team' NB. join t1 to t2
   jd'info table'
┌─────┐
│table│
├─────┤
│t1   │
│t2   │
└─────┘
   jd'info ref' NB. table t1 col jdref_team_t2_team joins t1 to t2
┌─────┬──────────────────┐
│table│column            │
├─────┼──────────────────┤
│t1   │jdref_team_t2_team│
└─────┴──────────────────┘
   jd'reads from t1,t1.t2'
┌───────┬────────┬──────────┬───────┬───────┬──────────┐
│t1.year│t1.sales│t1.product│t1.team│t2.team│t2.contact│
├───────┼────────┼──────────┼───────┼───────┼──────────┤
│2002   │5000    │shoes     │blue   │blue   │4161231234│
│2002   │ 320    │shoes     │red    │red    │7051231235│
│2002   │ 139    │hats      │blue   │blue   │4161231234│
│2002   │ 506    │hats      │red    │red    │7051231235│
│2003   │  74    │shoes     │blue   │blue   │4161231234│
│2003   │  54    │shoes     │red    │red    │7051231235│
│2003   │ 460    │hats      │blue   │blue   │4161231234│
│2003   │ 781    │hats      │red    │red    │7051231235│
│2005   │6000    │hats      │blue   │blue   │4161231234│
└───────┴────────┴──────────┴───────┴───────┴──────────┘
   jd'reads sum sales,first t2.contact by year,team from t1,t1.t2 order by sales'
┌────┬────┬─────┬──────────┐
│year│team│sales│t2.contact│
├────┼────┼─────┼──────────┤
│2003│blue│ 534 │4161231234│
│2002│red │ 826 │7051231235│
│2003│red │ 835 │7051231235│
│2002│blue│5139 │4161231234│
│2005│blue│6000 │4161231234│
└────┴────┴─────┴──────────┘
   jd'reads from t1,t1.t2 where t2.contact="7051231235"'
┌───────┬────────┬──────────┬───────┬───────┬──────────┐
│t1.year│t1.sales│t1.product│t1.team│t2.team│t2.contact│
├───────┼────────┼──────────┼───────┼───────┼──────────┤
│2002   │320     │shoes     │red    │red    │7051231235│
│2002   │506     │hats      │red    │red    │7051231235│
│2003   │ 54     │shoes     │red    │red    │7051231235│
│2003   │781     │hats      │red    │red    │7051231235│
└───────┴────────┴──────────┴───────┴───────┴──────────┘

intro_c
admin/create/drop
   jdadminnew'test' NB. create new db (~temp/jd/test)
   jd'createtable f'
   jd'createcol f a int'
   jd'insert f';'a';i.3
   jd'reads /lr from f' NB. reads with /lr labeled row option
┌─┬─────┐
│a│0 1 2│
└─┴─────┘
   jdadmin 0 NB. db unavailable
   ''jdae'read from f'
not a db access name

you could exit J, shutdown, and relax
then start it all up and access the db

   jdadmin'test' NB. admin for db test that must already exist
   jd'read from f'
┌─┬─────┐
│a│0 1 2│
└─┴─────┘
   jdadminnew'fubar' NB. create new db (~temp/jd/fubar)
   jd'createtable /pairs f';'b';'zxcv';'c';i.4
   jd'read from f'
┌─┬───────┐
│b│zxcv   │
├─┼───────┤
│c│0 1 2 3│
└─┴───────┘
   jdadmin'test' NB. access test again
   jd'read from f'
┌─┬─────┐
│a│0 1 2│
└─┴─────┘
   jdadmin'fubar'
   jd'read from f'
┌─┬───────┐
│b│zxcv   │
├─┼───────┤
│c│0 1 2 3│
└─┴───────┘
   jd'dropcol f c'
   jd'read from f'
┌─┬────┐
│b│zxcv│
└─┴────┘
   jd'info table'
┌─────┐
│table│
├─────┤
│f    │
└─────┘
   jd'droptable f'
   jd'info table'
┌─────┐
│table│
├─────┤
│     │
└─────┘
   jd'dropdb'
   jdadmin'test'
   jd'reads from f'
┌─┐
│a│
├─┤
│0│
│1│
│2│
└─┘
   jdadmin etx 'fubar' NB. error as it does not exist
assertion failure
   13!:12''
|not a folder: assert
|   'not a folder'    assert 2=ftype y
   jdadmin 0 NB. remove all admin - no db available

pairs

   jdadminnew'tutorial'
   jd'gen test f 2'
   jd'reads from f' NB. labeled cols
┌─┬──────────────┬─────┬───────┬───┬────┬─────┬───────┐
│x│datetime      │float│boolean│int│byte│byte4│varbyte│
├─┼──────────────┼─────┼───────┼───┼────┼─────┼───────┤
│0│19990524203132│0.5  │0      │100│A   │ABCD │ABCD   │
│1│19970524203132│1.5  │1      │101│B   │EFGH │EFGHIJ │
└─┴──────────────┴─────┴───────┴───┴────┴─────┴───────┘
   jd'read  from f' NB. labeled rows (same as reads /lr)
┌────────┬─────────────────────────────┐
│x       │0 1                          │
├────────┼─────────────────────────────┤
│datetime│19990524203132 19970524203132│
├────────┼─────────────────────────────┤
│float   │0.5 1.5                      │
├────────┼─────────────────────────────┤
│boolean │0 1                          │
├────────┼─────────────────────────────┤
│int     │100 101                      │
├────────┼─────────────────────────────┤
│byte    │AB                           │
├────────┼─────────────────────────────┤
│byte4   │ABCD                         │
│        │EFGH                         │
├────────┼─────────────────────────────┤
│varbyte │┌────┬──────┐                │
│        ││ABCD│EFGHIJ│                │
│        │└────┴──────┘                │
└────────┴─────────────────────────────┘

labeled cols can be convenient for display to the user
but loses some info about the actual data
everything is a matrix even if the actual data is a list
varbyte data is opened

   $each{:jd'reads from f'        NB. reads data is 2 by N
┌───┬───┬───┬───┬───┬───┬───┬───┐
│2 1│2 1│2 1│2 1│2 1│2 1│2 4│2 6│
└───┴───┴───┴───┴───┴───┴───┴───┘
   $each{:"1 jd'reads /lr from f' NB. read  data has actual shape
┌─┬─┬─┬─┬─┬─┬───┬─┐
│2│2│2│2│2│2│2 4│2│
└─┴─┴─┴─┴─┴─┴───┴─┘

pairs - list of name,value pairs
pairs are args to insert, update, and other ops

   [d=: 'a';2 3;'b';2 3$'abcdef' NB. list of name,value pairs
┌─┬───┬─┬───┐
│a│2 3│b│abc│
│ │   │ │def│
└─┴───┴─┴───┘
   jd'createtable /replace g a int,b byte 3'
   jd'insert g';d
   [r=: jd'read from g' NB. result
┌─┬───┐
│a│2 3│
├─┼───┤
│b│abc│
│ │def│
└─┴───┘
   ,r NB. ravel of read result is pairs
┌─┬───┬─┬───┐
│a│2 3│b│abc│
│ │   │ │def│
└─┴───┴─┴───┘

   jd'insert g';'a';23;'b';3 3$'z'   NB. data extends
   jd'read from g'
┌─┬────────────┐
│a│2 3 23 23 23│
├─┼────────────┤
│b│abc         │
│ │def         │
│ │zzz         │
│ │zzz         │
│ │zzz         │
└─┴────────────┘
   jd'insert g';'a';23;'b';3 2$'a'   NB. byte N col extends with blanks
   jd'read from g'
┌─┬─────────────────────┐
│a│2 3 23 23 23 23 23 23│
├─┼─────────────────────┤
│b│abc                  │
│ │def                  │
│ │zzz                  │
│ │zzz                  │
│ │zzz                  │
│ │aa                   │
│ │aa                   │
│ │aa                   │
└─┴─────────────────────┘
   'bad shape'jdae'insert g';'a';23;'b';3 5$'a' NB. byte N data not discarded
bad shape

stock_data
   require 'plot'
   require JDP,'tools/quandl.ijs'

www.quandl.com is a source for free, historical, stock data

you need a free quandl account and apikey to download data

www.quandl.com
 top right: SIGN IN
  bottom right: CREATE ONE
   fill in form: SIGN UP FOR FREE

welcome gives your apikey (also in your account settings)

run following sentence (with your apikey) to put your key in config

   '????' fwrite '~config/quandl_apikey.txt'

   'you need to set your apikey'assert 10<#fread'~config/quandl_apikey.txt' 

   jdadminx'quandl' NB. create empty quandl db
   CSVFOLDER=: '~temp/jd/quandl/csv/' NB. folder for quandl csv files
   jdcreatefolder_jd_ CSVFOLDER
~temp/jd/quandl/csv/

next step downloads the Proctor & Gamble csv file - can take a minute
   quandl_get'pg'
pg.csv
   fsize CSVFOLDER,'pg.csv'
1685653

   quandl_cdefs'pg' NB. analyze csv file to build cdefs metadata file
eod.cdefs
   fread CSVFOLDER,'eod.cdefs'
01 Date       edate
02 Open       float
03 High       float
04 Low        float
05 Close      float
06 Volume     int  
07 Dividend   float
08 Split      int  
09 Adj_Open   float
10 Adj_High   float
11 Adj_Low    float
12 Adj_Close  float
13 Adj_Volume int  
options , LF " NO 1 iso8601-char

   quandl_load'pg' NB. load pg.csv into table pg
   jd'info table'
┌─────┐
│table│
├─────┤
│pg   │
└─────┘
   jd'info schema'
┌─────┬──────────┬─────┬─────┐
│table│column    │type │shape│
├─────┼──────────┼─────┼─────┤
│pg   │Date      │edate│_    │
│pg   │Open      │float│_    │
│pg   │High      │float│_    │
│pg   │Low       │float│_    │
│pg   │Close     │float│_    │
│pg   │Volume    │int  │_    │
│pg   │Dividend  │float│_    │
│pg   │Split     │int  │_    │
│pg   │Adj_Open  │float│_    │
│pg   │Adj_High  │float│_    │
│pg   │Adj_Low   │float│_    │
│pg   │Adj_Close │float│_    │
│pg   │Adj_Volume│int  │_    │
└─────┴──────────┴─────┴─────┘
   jd'reads #:count Date from pg' NB. number of rows in table
┌─────┐
│#    │
├─────┤
│12456│
└─────┘
   jd'reads latest:first Date,oldest:last Date from pg'
┌──────────┬──────────┐
│latest    │oldest    │
├──────────┼──────────┤
│2019-05-17│1970-01-02│
└──────────┴──────────┘
   'Open' quandl_plot'pg'
   'Split'quandl_plot'pg'
note how the splits line up with open drops

next step downloads the IBM csv file - can take a minute
   quandl_get'ibm'
ibm.csv
   quandl_load'ibm' NB. uses eod.cdefs file built earlier
   jd'info table'
┌─────┐
│table│
├─────┤
│ibm  │
│pg   │
└─────┘
   'Volume'quandl_plot'ibm'