CSV.apl

⍝
⍝ 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 

AltStyle によって変換されたページ (->オリジナル) /