csvToText Repository
Peter M. Brigham
pmbrig at gmail.com
Tue Jun 14 09:21:09 EDT 2016
Although incorporating this into the engine is clearly the way to go, here are a couple of pure LC functions that are possibly relevant. They could be generalized to arbitrary line- and item-delimiters.
-- Peter
Peter M. Brigham
pmbrig at gmail.com
-------
function tabTableToArray pTable, withHeaders
-- returns a 2-dimensional array from a tab-delimited table
-- if withHeaders = true then first line is treated as column titles
-- and first column is treated as row titles,
-- data is stored as tArray[rowName][colName]
-- headers are stored in tArray["_row_names_"] and tArray["_column_names_"]
-- as comma-delim lists
-- if withHeaders = false (default) then array is
-- tArray[n][i], where n = rowNumber, i = columnNumber
-- requires arrayToTabTable()
-- which is the inverse function
if tab is not in pTable then return empty
if withHeaders = empty then put false into withHeaders
set the itemdelimiter to tab
if withHeaders then
put line 1 of pTable into colHdrsList
delete line 1 of pTable
delete char 1 of colHdrsList
put (the number of items of colHdrsList) into nbrItems -- for debugging
repeat for each line tLine in pTable
put item 1 of tLine into thisRowHdr
put thisRowHdr & comma after rowHdrs
delete item 1 of tLine
repeat with i = 1 to nbrItems
put item i of tLine into tArray[thisRowHdr][item i of colHdrsList]
end repeat
end repeat
delete char -1 of rowHdrs
put rowHdrs into tArray["_row_names_"]
replace tab with comma in colHdrsList
put colHdrsList into tArray["_column_names_"]
else
-- first get the max number of items in the lines
-- in case of empty trailing items in some lines
put 0 into maxItems
repeat for each line tLine in pTable
put max(maxItems,the number of items of tLine) into maxItems
end repeat
repeat with n = 1 to the number of lines of pTable
repeat with i = 1 to maxItems
put item i of line n of pTable into tArray[n][i]
end repeat
end repeat
end if
return tArray
end tabTableToArray
function arrayToTabTable tArray
-- returns a tab-delimited table from a two-dimensional array
-- eg, one created by tabTableToArray()
-- if the array format is tArray[tRowName][tColName]
-- then tArray["_column_names_"] should contain a comma-delim list
-- of column names
-- and tArray["_row_names_"] should contain a comma-delim list of row names
-- if these special keys are empty then assumes that the array format is
-- tArray[tRowNbr][tColNbr]
-- requires tabTableToArray()
-- which is the inverse function
put the keys of tArray into tKeys
put the number of lines of tKeys into nbrLines
if nbrLines = 0 then return empty -- not an array
filter tKeys without "_column_names_"
filter tKeys without "_row_names_"
put the number of lines of the keys of tArray[line 1 of tKeys] into nbrCols
if nbrCols = 0 then return empty -- not a 2-dimensional array
set the itemdelimiter to tab
put tArray["_column_names_"] into colNames
if colNames <> empty then
-- column headers and row names are stored.
-- first row must be column headers, first col must be row names
put tArray["_row_names_"] into rowNames
replace comma with tab in colNames
replace comma with cr in rowNames
put tab before colNames
put colNames into tTable
repeat for each line tRowName in rowNames
put tRowName into tableRow
repeat for each item tCol in colNames
if tCol = empty then next repeat
if tCol is not among the lines of the keys of tArray[tRowName] \
then next repeat
put tArray[tRowName][tCol] into tElement
put tab & tElement after tableRow
end repeat
put cr & tableRow after tTable
end repeat
else
repeat with n = 1 to nbrLines
repeat with i = 1 to nbrCols
put tArray[n][i] into item i of line n of tTable
end repeat
end repeat
end if
return tTable
end arrayToTabTable
-------
On Jun 13, 2016, at 12:51 PM, Alex Tweedly wrote:
> Sorry, Paul - I suspect I had seen that before, but forgotten it.
>
> It was a good idea back then, and still is :-)
>
>
> Though, if we are going to add some form of "with colkeys", I believe there should be a version which says that the first line of the input contains the column keys; thus you could do
>
> Split X indexed using cr and tab with colKeys tColumns and tColumns contains the column keys
> or simply
> Split X indexed using cr and tab with colKeys and the first line of X contains the column keys (and line 1 is omitted from the results)
>
> If no-one tells me that's crazy (and why), I'll go add that to the feature request.
>
> Alex.
>
>
>
>
> On 13/06/2016 14:10, Paul Dupuis wrote:
>> On 6/13/2016 7:45 AM, Alex Tweedly wrote:
>>> Perhaps a more general feature requests would be to extend the 'split'
>>> command, so that it would parse by Primary and Secondary delimiters
>>> into numerically indexed arrays ? (using a new optional keyword
>>> "completely" ... :-)
>> See http://quality.livecode.com/show_bug.cgi?id=9950
>>
>> _______________________________________________
>> use-livecode mailing list
>> use-livecode at lists.runrev.com
>> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
>> http://lists.runrev.com/mailman/listinfo/use-livecode
>
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
More information about the use-livecode
mailing list