csvToText Repository

Peter M. Brigham pmbrig at gmail.com
Tue Jun 14 10:05:02 EDT 2016


Be my guest.

-- Peter

Peter M. Brigham
pmbrig at gmail.com

On Jun 14, 2016, at 9:46 AM, Mike Kerner wrote:

> Peter B,
> If you don't mind, I would like to add your goodies to the codebase we're
> building for csv handling.  I'll want to tweak it so that we use the other
> code we already have inside, of course.
> 
> On Tue, Jun 14, 2016 at 9:21 AM, Peter M. Brigham <pmbrig at gmail.com> wrote:
> 
>> 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
>> 
>> 
>> _______________________________________________
>> 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
>> 
> 
> 
> 
> -- 
> On the first day, God created the heavens and the Earth
> On the second day, God created the oceans.
> On the third day, God put the animals on hold for a few hours,
>   and did a little diving.
> And God said, "This is good."
> _______________________________________________
> 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