⍝
⍝ Author:      Alex Weiner
⍝ Date:        June 27, 2015
⍝ Copyright:   Copyright (C) 2015 by Alex Weiner
⍝ License:     LGPL see http://www.gnu.org/licenses/gpl-3.0.en.html
⍝ Support email: alexweiner@alexweiner.com
⍝ Portability:   L3 (GNU APL)
⍝
⍝ Purpose:
⍝ Read in a text file, with a given field separator and return a
⍝ 2D matrix of text vectors
⍝
⍝
⍝ Create a text matrix, with a given separator and
⍝ every element will be quoted.
⍝
⍝ Description:
⍝ parsed_csv← ',' read∆csvfile 'name of the file'
⍝text_csv_matrix←','make∆csv matrix_parsed_csv ⍝ a matrix of text vectors
⍝
⍝

)COPY 5 FILE_IO.apl

file_matrix_ucs←{⊃(⎕ucs ⍵)⊂⍨~(⎕ucs ⍵)∊10 11}

∇parsed_row←sep read∆csv∆row string
 inquotes_bool←{⍵∨≠\⍵}34= string
 sep_bool←string= ⎕ucs sep   
 sep_idx←sep_bool/⍳⍴sep_bool
 sep_in_quotes_idx← (sep_idx∊inquotes_bool/⍳⍴inquotes_bool)/⍳⍴sep_idx  
 sep_idx_real←sep_idx~sep_idx[sep_in_quotes_idx]
 sep_bool_real←0⍴⍨⍴string
 sep_bool_real[sep_idx_real]←1
 parsed_row←string⊂⍨~sep_bool_real
⍝now find the bookend quotes and drop em
 size_each_item← ⍴¨parsed_row
 quotes_expected←⌽¨1,¨⌽¨1,¨2↓¨size_each_item⍴¨0
 quotes_found←parsed_row=34 ⍝34←→ '"'
 hasquotes_bool← ∨/¨quotes_expected∧quotes_found
 parsed_row[hasquotes_bool/⍳⍴hasquotes_bool]←⌽¨1↓¨⌽¨1↓¨parsed_row[hasquotes_bool/⍳⍴hasquotes_bool]
 parsed_row←⎕ucs¨parsed_row
∇

∇matrix←sep read∆csvfile file
 matrix←⊃sep read∆csv∆row¨⊂[2] file_matrix_ucs  FIO∆read_file file
∇

∇filecontents ←sep make∆csv matrix
 seps←⍉(⍴matrix)⍴⊂,sep
 withquotes←⍉(⍴matrix)⍴⌽¨(⊂,'"'),¨⌽¨(⊂,'"'),¨matrix
 filecontents←⍕⍉((2 1 × ⍴withquotes)-1 0)↑(2 1 ×⍴withquotes)⍴withquotes,seps
∇

]NEXTFILE 
⍝
⍝ EOF