1.6 KiB
1.6 KiB
csv2recutil
This script takes the path of a CSV file as an argument, and prints the data to stdout in recutils format
Usage
retro csv2recutil.md file.csv
Print message if no argument is given:
script:arguments #0 eq? [ 'Usage:_csv2recutil_<file.csv> s:put nl nl ] if;
File reader
open file, get handle and size
'handle var 'size var
#0 script:get-argument file:open-for-reading !handle !size
readline utility
:get-line @handle file:read-line ;
CSV to array
declare s:to-array/csv
function. Takes a string, returns an array.
:s:to-array/csv (s-a)
strip all the double quotes. NOTE: this will also strip all quotes in the body text. Might be better to chomp, reverse, chomp, reverse?
[ $" -eq? ] s:filter
Finally split on commas
$, s:tokenize
There, now you have an array
(end function:)
;
Main
Get the headers:
get-line s:to-array/csv 'Headers var-n
declare a var for the current line so we can assign to it
'Current var
Print headers and current line as a recutil. (Use indexed-times
so we can use the index to get the nth element from each array.)
:print-record
get-line s:to-array/csv !Current
@Headers a:length [
I
dup @Headers swap a:fetch s:put ':_ s:put
@Current swap a:fetch s:put nl
] indexed-times
;
Now print-record for all the remaining lines in the file
[
print-record nl
@size @handle file:tell gt?
] while