{"id":112691,"date":"2021-09-08T16:00:27","date_gmt":"2021-09-08T07:00:27","guid":{"rendered":"https:\/\/support.questetra.com\/?p=112691"},"modified":"2023-08-29T17:31:23","modified_gmt":"2023-08-29T08:31:23","slug":"tsv-string-create-cross-table-for-numeric-column-2021","status":"publish","type":"post","link":"https:\/\/support.questetra.com\/en\/addons\/tsv-string-create-cross-table-for-numeric-column-2021\/","title":{"rendered":"TSV String, Create Cross Table for Numeric Column"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><div class=\"su-box su-box-style-soft\" id=\"\" style=\"border-color:#cc66cc;border-radius:0px;max-width:none\"><div class=\"su-box-title\" style=\"background-color:#ff99ff;color:#000000;border-top-left-radius:0px;border-top-right-radius:0px\">TSV String, Create Cross Table for Numeric Column<\/div><div class=\"su-box-content su-u-clearfix su-u-trim\" style=\"border-bottom-left-radius:0px;border-bottom-right-radius:0px\"> Aggregates the values in a numeric column with 2 aggregation-key columns (pivot table). Sum, Percentage, Count and Average are tabulated as a cross table TSV. E.g. &#8220;Sales for each combination of Client-Y and Store-X&#8221; is aggregated from &#8220;Sales log TSV&#8221;.<\/div><\/div>\n\n\n<div class=\"su-spoiler su-spoiler-style-modern-light su-spoiler-icon-plus-square-1\" data-anchor=\"configs\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>Configs<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<ul class=\"fa-ul\">\n<li><span class=\"fa-li\"><i class=\"far fa-edit fa-lg\"><\/i><\/span> A1: Set TSV<span style=\"color:#990000;\"> *<\/span><span style=\"color:#000099;\"><sup style=\"font-style:italic;\">#{EL}<\/sup><\/span><\/li>\n<li><span class=\"fa-li\"><i class=\"far fa-pen-square fa-lg\"><\/i><\/span> B1: Set Column ID of Numeric Field (eg &#8220;3&#8221; )<span style=\"color:#990000;\"> *<\/span><span style=\"color:#000099;\"><sup style=\"font-style:italic;\">#{EL}<\/sup><\/span><\/li>\n<li><span class=\"fa-li\"><i class=\"far fa-pen-square fa-lg\"><\/i><\/span> B2: Set Column ID of Aggregation-Key Y-Field (eg &#8220;4&#8221; )<span style=\"color:#990000;\"> *<\/span><span style=\"color:#000099;\"><sup style=\"font-style:italic;\">#{EL}<\/sup><\/span><\/li>\n<li><span class=\"fa-li\"><i class=\"far fa-pen-square fa-lg\"><\/i><\/span> B3: Set Column ID of Aggregation-Key X-Field (eg &#8220;5&#8221; )<span style=\"color:#990000;\"> *<\/span><span style=\"color:#000099;\"><sup style=\"font-style:italic;\">#{EL}<\/sup><\/span><\/li>\n<li><span class=\"fa-li\"><i class=\"far fa-pen-square fa-lg\"><\/i><\/span> C1: To Sort by Numeric Value, Set DESC or ASC (eg &#8220;ASC&#8221; )<span style=\"color:#000099;\"><sup style=\"font-style:italic;\">#{EL}<\/sup><\/span><\/li>\n<li><span class=\"fa-li\"><i class=\"far fa-pen-square fa-lg\"><\/i><\/span> C2: To Sort by Y-Agg-Key, Set DESC or ASC (eg &#8220;ASC&#8221; )<span style=\"color:#000099;\"><sup style=\"font-style:italic;\">#{EL}<\/sup><\/span><\/li>\n<li><span class=\"fa-li\"><i class=\"far fa-pen-square fa-lg\"><\/i><\/span> C3: To Sort by X-Agg-Key, Set DESC or ASC (eg &#8220;ASC&#8221; )<span style=\"color:#000099;\"><sup style=\"font-style:italic;\">#{EL}<\/sup><\/span><\/li>\n<li><span class=\"fa-li\"><i class=\"fal fa-caret-square-down fa-lg\"><\/i><\/span> D1: Select STRING DATA that stores Total Cross TSV (update)<\/li>\n<li><span class=\"fa-li\"><i class=\"fal fa-caret-square-down fa-lg\"><\/i><\/span> D2: Select STRING DATA that stores Percent Cross TSV (update)<\/li>\n<li><span class=\"fa-li\"><i class=\"fal fa-caret-square-down fa-lg\"><\/i><\/span> D3: Select STRING DATA that stores Count Cross TSV (update)<\/li>\n<li><span class=\"fa-li\"><i class=\"fal fa-caret-square-down fa-lg\"><\/i><\/span> D4: Select STRING DATA that stores Average Cross TSV (update)<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n<div class=\"su-spoiler su-spoiler-style-modern-light su-spoiler-icon-plus-square-1 su-spoiler-closed\" data-anchor=\"script\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>Script (click to open)<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>\/\/ GraalJS Script (engine type: 2)\n\n\/\/\/\/\/\/\/\/ START &quot;main()&quot; \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nmain();\nfunction main(){ \n\n\/\/\/\/ == Config Retrieving \/ \u5de5\u7a0b\u30b3\u30f3\u30d5\u30a3\u30b0\u306e\u53c2\u7167 ==\nconst strTsv         = configs.get( &quot;StrConfA1&quot; );           \/\/\/ REQUIRED \/\/\/\/\/\/\/\/\/\/\/\/\/\n  if( strTsv       === &quot;&quot; ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {A1: Tsv} is empty \\n&quot; );\n  }\n  const arr2dTsv     = parseAsRectangular( strTsv );\nconst strNumField    = configs.get( &quot;StrConfB1&quot; );           \/\/\/ REQUIRED \/\/\/\/\/\/\/\/\/\/\/\/\/\n  if( strNumField  === &quot;&quot; ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B1: NumField} is empty \\n&quot; );\n  }\n  const numNumField  = parseInt( strNumField, 10 );\n  if( isNaN( numNumField ) || numNumField &lt; 0 ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B1: NumField} must be a positive integer \\n&quot; );\n  }\n  if( numNumField   &gt;= arr2dTsv[0].length ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B1: NumField} is larger than TsvWidth \\n&quot; );\n  }\nconst strYaggField   = configs.get( &quot;StrConfB2&quot; );           \/\/\/ REQUIRED \/\/\/\/\/\/\/\/\/\/\/\/\/\n  if( strYaggField === &quot;&quot; ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B2: Y-AggField} is empty \\n&quot; );\n  }\n  const numYaggField = parseInt( strYaggField, 10 );\n  if( isNaN( numYaggField ) || numYaggField &lt; 0 ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B2: YaggField} must be a positive integer \\n&quot; );\n  }\n  if( numYaggField  &gt;= arr2dTsv[0].length ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B2: YaggField} is larger than TsvWidth \\n&quot; );\n  }\nconst strXaggField   = configs.get( &quot;StrConfB3&quot; );           \/\/\/ REQUIRED \/\/\/\/\/\/\/\/\/\/\/\/\/\n  if( strXaggField === &quot;&quot; ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B3: X-AggField} is empty \\n&quot; );\n  }\n  const numXaggField = parseInt( strXaggField, 10 );\n  if( isNaN( numXaggField ) || numXaggField &lt; 0 ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B3: XaggField} must be a positive integer \\n&quot; );\n  }\n  if( numXaggField  &gt;= arr2dTsv[0].length ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B3: XaggField} is larger than TsvWidth \\n&quot; );\n  }\nconst strNumSort     = configs.get( &quot;StrConfC1&quot; );           \/\/ NotRequired \/\/\/\/\/\/\/\/\/\/\/\nconst strYaggSort    = configs.get( &quot;StrConfC2&quot; );           \/\/ NotRequired \/\/\/\/\/\/\/\/\/\/\/\nconst strXaggSort    = configs.get( &quot;StrConfC3&quot; );           \/\/ NotRequired \/\/\/\/\/\/\/\/\/\/\/\n\nconst strPocketTotalPivot   = configs.getObject( &quot;SelectConfD1&quot; ); \/\/ NotRequired \/\/\/\/\/\nconst strPocketPercentPivot = configs.getObject( &quot;SelectConfD2&quot; ); \/\/ NotRequired \/\/\/\/\/\nconst strPocketCountPivot   = configs.getObject( &quot;SelectConfD3&quot; ); \/\/ NotRequired \/\/\/\/\/\nconst strPocketAveragePivot = configs.getObject( &quot;SelectConfD4&quot; ); \/\/ NotRequired \/\/\/\/\/\n\n\n\/\/\/\/ == Data Retrieving \/ \u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30c7\u30fc\u30bf\u306e\u53c2\u7167 ==\n\/\/ (Nothing. Retrieved via Expression Language in Config Retrieving)\n\n\n\/\/\/\/ == Calculating \/ \u6f14\u7b97 ==\n\n\/\/ omit repeated Keys in Y-Aggregation Field values (make Keys uniq)\nlet arrYaggKeys = [];\nfor( let i = 0; i &lt; arr2dTsv.length; i++ ){\n  if( arrYaggKeys.indexOf( arr2dTsv[i][ numYaggField ] ) === -1){\n      arrYaggKeys.push(    arr2dTsv[i][ numYaggField ] );\n  }\n  \/\/ Array.indexOf(): strict equality `===` \n  \/\/ https:\/\/developer.mozilla.org\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/indexOf\n}\n\/\/ omit repeated Keys in X-Aggregation Field values (make Keys uniq)\nlet arrXaggKeys = [];\nfor( let i = 0; i &lt; arr2dTsv.length; i++ ){\n  if( arrXaggKeys.indexOf( arr2dTsv[i][ numXaggField ] ) === -1){\n      arrXaggKeys.push(    arr2dTsv[i][ numXaggField ] );\n  }\n  \/\/ Array.indexOf(): strict equality `===` \n  \/\/ https:\/\/developer.mozilla.org\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/indexOf\n}\n\n\/\/ sort by Keys\nif( strYaggSort === &quot;ASC&quot; ){ \/\/ ASC: ascending alphabetical from A to Z\n  arrYaggKeys.sort( function( strA, strB ){\n    if( strA &gt; strB ){ return  1; }\n    if( strA &lt; strB ){ return -1; }\n    return 0;\n  });\n}\nif( strYaggSort === &quot;DESC&quot; ){ \/\/ DESC: descending from Z to A\n  arrYaggKeys.sort( function( strA, strB ){\n    if( strA &lt; strB ){ return  1; }\n    if( strA &gt; strB ){ return -1; }\n    return 0;\n  });\n}\nif( strXaggSort === &quot;ASC&quot; ){ \/\/ ASC: ascending alphabetical from A to Z\n  arrXaggKeys.sort( function( strA, strB ){\n    if( strA &gt; strB ){ return  1; }\n    if( strA &lt; strB ){ return -1; }\n    return 0;\n  });\n}\nif( strXaggSort === &quot;DESC&quot; ){ \/\/ DESC: descending from Z to A\n  arrXaggKeys.sort( function( strA, strB ){\n    if( strA &lt; strB ){ return  1; }\n    if( strA &gt; strB ){ return -1; }\n    return 0;\n  });\n}\n\n\/\/ initialize arr2dTotalPivot[y][x]\nlet arr2dTotalPivot = [];\nfor( let i = 0; i &lt; arrYaggKeys.length; i++ ){\n  arr2dTotalPivot[i] = [];\n  for( let j = 0; j &lt; arrXaggKeys.length; j++ ){\n    arr2dTotalPivot[i][j] = 0;\n  }\n}\n\/\/ initialize arr2dPercentPivot[y][x]\nlet arr2dPercentPivot = [];\nfor( let i = 0; i &lt; arrYaggKeys.length; i++ ){\n  arr2dPercentPivot[i] = [];\n  for( let j = 0; j &lt; arrXaggKeys.length; j++ ){\n    arr2dPercentPivot[i][j] = 0;\n  }\n}\n\/\/ initialize arr2dCountPivot[y][x]\nlet arr2dCountPivot = [];\nfor( let i = 0; i &lt; arrYaggKeys.length; i++ ){\n  arr2dCountPivot[i] = [];\n  for( let j = 0; j &lt; arrXaggKeys.length; j++ ){\n    arr2dCountPivot[i][j] = 0;\n  }\n}\n\/\/ initialize arr2dAveragePivot[y][x]\nlet arr2dAveragePivot = [];\nfor( let i = 0; i &lt; arrYaggKeys.length; i++ ){\n  arr2dAveragePivot[i] = [];\n  for( let j = 0; j &lt; arrXaggKeys.length; j++ ){\n    arr2dAveragePivot[i][j] = 0;\n  }\n}\n\n\/\/ sum up\nlet numGrandTotal = 0;\nfor( let i = 0; i &lt; arr2dTsv.length; i++ ){\n  let numValue = parseFloat( arr2dTsv[i][numNumField].replace(\/,\/g, &#39;&#39;) );\n  if( isNaN(numValue) ){\n    engine.log( &quot; AutomatedTask StringWarning:&quot; +\n                &quot; CellStr is not numeric at line: &quot; + i );\n    numValue = 0;\n  }\n  let strYKey = arr2dTsv[i][numYaggField];\n  let strXKey = arr2dTsv[i][numXaggField];\n  arr2dTotalPivot[ arrYaggKeys.indexOf( strYKey ) ][ arrXaggKeys.indexOf( strXKey ) ] += numValue;\n  arr2dCountPivot[ arrYaggKeys.indexOf( strYKey ) ][ arrXaggKeys.indexOf( strXKey ) ] += 1;\n  numGrandTotal += numValue;\n}\n\n\/\/\/\/ --debug--\n\/\/ engine.log( &quot; arr2dTotalPivot:&quot; );\n\/\/ for( let i = 0; i &lt; arr2dTotalPivot.length; i++ ){\n\/\/   for( let j= 0; j &lt; arr2dTotalPivot[0].length; j++ ){\n\/\/     engine.log( &quot;  &quot; + i + &quot;-&quot; + j + &quot;: &quot; + arr2dTotalPivot[i][j] );\n\/\/   }\n\/\/ }\n\n\/\/ X-subtotal Total\nlet arrXsubtotalTotal = [];\n  arrXsubtotalTotal.push( &quot;total&quot; );\nfor( let i = 0; i &lt; arr2dTotalPivot[0].length; i++ ){\n  let numSubtotal = 0;\n  for( let j = 0; j &lt; arr2dTotalPivot.length; j++ ){\n    numSubtotal += arr2dTotalPivot[j][i];\n  }\n  arrXsubtotalTotal.push( numSubtotal );\n}\narrXsubtotalTotal.push( numGrandTotal );\n\n\/\/ X-subtotal Count\nlet arrXsubtotalCount = [];\n  arrXsubtotalCount.push( &quot;total&quot; );\nfor( let i = 0; i &lt; arr2dCountPivot[0].length; i++ ){\n  let numSubtotal = 0;\n  for( let j = 0; j &lt; arr2dCountPivot.length; j++ ){\n    numSubtotal += arr2dCountPivot[j][i];\n  }\n  arrXsubtotalCount.push( numSubtotal );\n}\narrXsubtotalCount.push( arr2dTsv.length );\n\n\/\/ add Y-key and Y-subtotal Total\nfor( let i = 0; i &lt; arr2dTotalPivot.length; i++ ){\n  let numSubtotal = 0;\n  for( let j = 0; j &lt; arr2dTotalPivot[i].length; j++ ){\n    numSubtotal += arr2dTotalPivot[i][j];\n  }\n  arr2dTotalPivot[i].push( numSubtotal );          \/\/ add Y-total to the end of an array\n  arr2dTotalPivot[i].unshift( arrYaggKeys[i] ); \/\/ add Y-key to the beginning of an array\n}\n\/\/ Y-subtotal Count\nfor( let i = 0; i &lt; arr2dCountPivot.length; i++ ){\n  let numSubtotal = 0;\n  for( let j = 0; j &lt; arr2dCountPivot[i].length; j++ ){\n    numSubtotal += arr2dCountPivot[i][j];\n  }\n  arr2dCountPivot[i].push( numSubtotal );\n  arr2dCountPivot[i].unshift( arrYaggKeys[i] );\n}\n\n\/\/ sort by Y-subtotal\nif( strNumSort === &quot;ASC&quot; ){ \/\/ ASC: ascending alphabetical from 0 to 10\n  arr2dTotalPivot.sort( function( arrA, arrB ){\n    if( arrA[arrA.length-1] &gt; arrB[arrB.length-1] ){ return  1; }\n    if( arrA[arrA.length-1] &lt; arrB[arrB.length-1] ){ return -1; }\n    return 0;\n  });\n  arr2dCountPivot.sort( function( arrA, arrB ){\n    if( arrA[arrA.length-1] &gt; arrB[arrB.length-1] ){ return  1; }\n    if( arrA[arrA.length-1] &lt; arrB[arrB.length-1] ){ return -1; }\n    return 0;\n  });\n}\nif( strNumSort === &quot;DESC&quot; ){ \/\/ DESC: descending from 10 to 0\n  arr2dTotalPivot.sort( function( arrA, arrB ){\n    if( arrA[arrA.length-1] &lt; arrB[arrB.length-1] ){ return  1; }\n    if( arrA[arrA.length-1] &gt; arrB[arrB.length-1] ){ return -1; }\n    return 0;\n  });\n  arr2dCountPivot.sort( function( arrA, arrB ){\n    if( arrA[arrA.length-1] &lt; arrB[arrB.length-1] ){ return  1; }\n    if( arrA[arrA.length-1] &gt; arrB[arrB.length-1] ){ return -1; }\n    return 0;\n  });\n}\n\n\/\/ calc Percent and Average\nfor( let i = 0; i &lt; arr2dTotalPivot.length; i++ ){\n  arr2dPercentPivot[i][0] = arr2dTotalPivot[i][0]; \/\/ Y-key\n  arr2dAveragePivot[i][0] = arr2dTotalPivot[i][0];\n  for( let j = 1; j &lt; arr2dTotalPivot[0].length; j++ ){\n    arr2dPercentPivot[i][j] = (arr2dTotalPivot[i][j] \/ numGrandTotal).toFixed(3);\n    arr2dAveragePivot[i][j] = (arr2dTotalPivot[i][j] \/ arr2dCountPivot[i][j]).toFixed(3);\n  }\n}\n\n\/\/ X-subtotal Percent and Average\nlet arrXsubtotalPercent = [];\nlet arrXsubtotalAverage = [];\n  arrXsubtotalPercent.push( &quot;total&quot; );\n  arrXsubtotalAverage.push( &quot;total&quot; );\nfor( let i = 1; i &lt; arrXsubtotalTotal.length; i++ ){\n  arrXsubtotalPercent.push( (arrXsubtotalTotal[i] \/ numGrandTotal).toFixed(3) );\n  arrXsubtotalAverage.push( (arrXsubtotalTotal[i] \/ arrXsubtotalCount[i] ).toFixed(3) );\n}\n\n\/\/ output Cross Tabulation\nlet strTotalPivot = &quot;&quot;;\nstrTotalPivot += &quot;cross\\t&quot; + arrXaggKeys.join(&quot;\\t&quot;) + &quot;\\ttotal\\n&quot;;\nfor( let i = 0; i &lt; arr2dTotalPivot.length; i++ ){\n  strTotalPivot += arr2dTotalPivot[i].join(&quot;\\t&quot;) + &quot;\\n&quot;;\n}\nstrTotalPivot += arrXsubtotalTotal.join(&quot;\\t&quot;);\n\nlet strPercentPivot = &quot;&quot;;\nstrPercentPivot += &quot;cross\\t&quot; + arrXaggKeys.join(&quot;\\t&quot;) + &quot;\\ttotal\\n&quot;;\nfor( let i = 0; i &lt; arr2dPercentPivot.length; i++ ){\n  strPercentPivot += arr2dPercentPivot[i].join(&quot;\\t&quot;) + &quot;\\n&quot;;\n}\nstrPercentPivot += arrXsubtotalPercent.join(&quot;\\t&quot;);\n\nlet strCountPivot = &quot;&quot;;\nstrCountPivot += &quot;cross\\t&quot; + arrXaggKeys.join(&quot;\\t&quot;) + &quot;\\ttotal\\n&quot;;\nfor( let i = 0; i &lt; arr2dCountPivot.length; i++ ){\n  strCountPivot += arr2dCountPivot[i].join(&quot;\\t&quot;) + &quot;\\n&quot;;\n}\nstrCountPivot += arrXsubtotalCount.join(&quot;\\t&quot;);\n\nlet strAveragePivot = &quot;&quot;;\nstrAveragePivot += &quot;cross\\t&quot; + arrXaggKeys.join(&quot;\\t&quot;) + &quot;\\ttotal\\n&quot;;\nfor( let i = 0; i &lt; arr2dAveragePivot.length; i++ ){\n  strAveragePivot += arr2dAveragePivot[i].join(&quot;\\t&quot;) + &quot;\\n&quot;;\n}\nstrAveragePivot += arrXsubtotalAverage.join(&quot;\\t&quot;);\n\n\n\/\/\/\/ == Data Updating \/ \u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30c7\u30fc\u30bf\u3078\u306e\u4ee3\u5165 ==\nif( strPocketTotalPivot !== null ){\n  engine.setData( strPocketTotalPivot, strTotalPivot );\n}\nif( strPocketPercentPivot !== null ){\n  engine.setData( strPocketPercentPivot, strPercentPivot );\n}\nif( strPocketCountPivot !== null ){\n  engine.setData( strPocketCountPivot, strCountPivot );\n}\nif( strPocketAveragePivot !== null ){\n  engine.setData( strPocketAveragePivot, strAveragePivot );\n}\n\n\n} \/\/\/\/\/\/\/\/ END &quot;main()&quot; \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\n\/\/ Parses TSV string as two-dimensional rectangular data matrix and creates a 2D array.\nfunction parseAsRectangular( strTsv ){\n  const arrTsv = strTsv.split(&quot;\\n&quot;);\n\n  \/\/\/ Get numMinWidth and numMaxWidth (blank lines are excluded)\n  let numMinWidth   = Infinity; \/\/ cf. String-Type Max: 1 million\n  let numMaxWidth   = 0;\n  let numBlanklines = 0;\n  for( let i = 0; i &lt; arrTsv.length; i++ ){\n    if( arrTsv[i] === &quot;&quot; ){ \/\/ Skip blank lines\n      numBlanklines += 1;\n      continue;\n    }\n    let arrCells = arrTsv[i].split(&quot;\\t&quot;);\n    if( numMinWidth &gt; arrCells.length ){ numMinWidth = arrCells.length; }\n    if( numMaxWidth &lt; arrCells.length ){ numMaxWidth = arrCells.length; }\n  }\n  engine.log( &quot; AutomatedTask TsvDataCheck:&quot; + \n              &quot; MinWidth:&quot; + numMinWidth +\n              &quot; MaxWidth:&quot; + numMaxWidth +\n              &quot; Lines:&quot; + arrTsv.length +\n              &quot; (BlankLines:&quot; + numBlanklines + &quot;)&quot; );\n\n  \/\/\/ Get numMinWidth and numMaxWidth (blank lines are excluded)\n  let arr2dTsv      = [];\n  for( let i = 0; i &lt; arrTsv.length; i++ ){\n    if( arrTsv[i] === &quot;&quot; ){ \/\/ Skip blank lines\n      continue;\n    }\n    let arrTmp = [];\n    let arrCells = arrTsv[i].split(&quot;\\t&quot;);\n    for( let j = 0; j &lt; numMaxWidth; j++ ){\n      if( j &lt; arrCells.length ){\n        arrTmp[j] = arrCells[j];\n      }else{\n        arrTmp[j] = &quot;&quot;;\n      }\n    }\n    arr2dTsv.push( arrTmp );\n  }\n\n  return arr2dTsv;\n}\n\n\/*\nNotes:\n- When the process reaches this automated task, TSV is automatically read.\n    - TSV: Monthly sales, log for questionnaire with rating, etc.\n- If there is a blank line in the input TSV text, it will be skipped.\n    - The line feed code for the last line is not added either.\n-\u3000The output TSV text (total table TSV, etc.) is rectangular data.\n    - The number of rows in TSV is #of {Y aggregate Key types} plus 2 (&quot;header&quot; + &quot;total&quot;).\n    - The number of columns of TSV is #of {X aggregate Key types} plus 2 (&quot;heading&quot; + &quot;total&quot;).\n\nAPPENDIX:\n- TSV (Tab Separated Values) text assumes rectangular data.\n    - Data that is not rectangular is automatically formatted with empty characters.\n    - Blank lines (including the end) are ignored.\n- Only &quot;DESC&quot; or &quot;ASC&quot; is valid for the sort config.\n    - If no sort setting, it will be in the order of appearance.\n    - Character sorting is in code order.\n    - If both character sort and numeric sort are configured, numeric sort is performed after character sort.\n- Specify the field column with the column ID (starting with zero).\n    - Parsing numeric field values depends on JavaScript `parseFloat()`.\n    - If commas in the numeric field, they are considered a thousands separator (The removed string is parsed).\n    - A string that cannot be parsed is considered zero.\n- Division by zero is output as NaN.\n\nNotes-ja:\n- \u6848\u4ef6\u304c\u81ea\u52d5\u51e6\u7406\u5de5\u7a0b\u306b\u5230\u9054\u3057\u305f\u969b\u3001\u6587\u5b57\u5217\u578b\u30c7\u30fc\u30bf\u306b\u4fdd\u5b58\u3055\u308c\u3066\u3044\u308bTSV\u304c\u81ea\u52d5\u7684\u306b\u8aad\u307f\u8fbc\u307e\u308c\u307e\u3059\u3002\n    - TSV: \u6708\u6b21\u58f2\u4e0a\u3001\u8a55\u70b9\u4ed8\u304d\u30a2\u30f3\u30b1\u30fc\u30c8\u306e\u30ed\u30b0\u3001\u306a\u3069\n- \u5165\u529bTSV\u30c6\u30ad\u30b9\u30c8\u306b\u7a7a\u884c\u304c\u3042\u308b\u5834\u5408\u3001\u30b9\u30ad\u30c3\u30d7\u3055\u308c\u307e\u3059\u3002\n    - \u51fa\u529bTSV\u306e\u6700\u7d42\u884c\u306b\u6539\u884c\u30b3\u30fc\u30c9\u306f\u4ed8\u4e0e\u3055\u308c\u307e\u305b\u3093\u3002\n- \u51fa\u529b\u3055\u308c\u308bTSV\u30c6\u30ad\u30b9\u30c8\uff08\u5408\u8a08\u5024\u30c6\u30fc\u30d6\u30ebTSV\u7b49\uff09\u306f\u3001\u77e9\u5f62\u30c7\u30fc\u30bf\u3067\u3059\u3002\n    - TSV\u306e\u884c\u6570\u306f\u3001{Y\u96c6\u7d04Key\u306e\u7a2e\u985e\u6570} \u306b\uff12\uff08&quot;\u30d8\u30c3\u30c0\u884c&quot; + &quot;\u5408\u8a08\u884c&quot;\uff09\u3092\u52a0\u3048\u305f\u6570\u306b\u306a\u308a\u307e\u3059\u3002\n    - TSV\u306e\u5217\u6570\u306f\u3001{X\u96c6\u7d04Key\u306e\u7a2e\u985e\u6570} \u306b\uff12\uff08&quot;\u898b\u51fa\u3057\u5217&quot; + &quot;\u5408\u8a08\u5217&quot;\uff09\u3092\u52a0\u3048\u305f\u6570\u306b\u306a\u308a\u307e\u3059\u3002\n\nAPPENDIX-ja:\n- TSV\uff08Tab Separated Values\uff09\u30c6\u30ad\u30b9\u30c8\u306f\u3001\u77e9\u5f62\u30c7\u30fc\u30bf\u3092\u524d\u63d0\u3068\u3057\u307e\u3059\u3002\n    - \u77e9\u5f62\u3067\u306a\u3044\u30c7\u30fc\u30bf\u306f\u3001\u7a7a\u6587\u5b57\u306b\u3088\u3063\u3066\u81ea\u52d5\u6574\u5f62\u3055\u308c\u307e\u3059\u3002\n    - \u7a7a\u884c\uff08\u672b\u5c3e\u6539\u884c\u3092\u542b\u3080\uff09\u306f\u7121\u8996\u3055\u308c\u307e\u3059\u3002\n- \u30bd\u30fc\u30c8\u8a2d\u5b9a\u306f &quot;DESC&quot; \u3082\u3057\u304f\u306f &quot;ASC&quot; \u306e\u307f\u304c\u6709\u52b9\u3067\u3059\u3002\n    - \u30bd\u30fc\u30c8\u8a2d\u5b9a\u304c\u306a\u3044\u5834\u5408\u3001\u51fa\u73fe\u9806\u306b\u306a\u308a\u307e\u3059\u3002\n    - \u6587\u5b57\u30bd\u30fc\u30c8\u306f\u6587\u5b57\u30b3\u30fc\u30c9\u9806\u306b\u306a\u308a\u307e\u3059\u3002\n    - \u6587\u5b57\u30bd\u30fc\u30c8\u3068\u6570\u5024\u30bd\u30fc\u30c8\u304c\u3069\u3061\u3089\u3082\u8a2d\u5b9a\u3055\u308c\u305f\u5834\u5408\u3001\u6587\u5b57\u30bd\u30fc\u30c8\u306e\u5f8c\u306b\u6570\u5024\u30bd\u30fc\u30c8\u304c\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002\n- \u30d5\u30a3\u30fc\u30eb\u30c9\u5217\u306e\u6307\u5b9a\u306f\u3001\u5217ID\uff08\u30bc\u30ed\u59cb\u307e\u308a\uff09\u3067\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n    - \u6570\u5024\u30d5\u30a3\u30fc\u30eb\u30c9\u5024\u306e\u89e3\u6790\uff08\u30d1\u30fc\u30b9\uff09\u306f JavaScript `parseFloat()` \u306b\u4f9d\u5b58\u3057\u307e\u3059\u3002\n    - \u6570\u5024\u30d5\u30a3\u30fc\u30eb\u30c9\u5024\u306b\u30ab\u30f3\u30de\u304c\u5b58\u5728\u3059\u308b\u5834\u5408\u3001\u6841\u533a\u5207\u308a\u6587\u5b57\u3068\u307f\u306a\u3055\u308c\u307e\u3059\uff08\u9664\u53bb\u3055\u308c\u305f\u6587\u5b57\u5217\u304c\u89e3\u6790\u3055\u308c\u307e\u3059\uff09\u3002\n    - \u89e3\u6790\u3067\u304d\u306a\u3044\u6587\u5b57\u5217\u306f\u30bc\u30ed\u3068\u898b\u306a\u3055\u308c\u307e\u3059\u3002\n- 0 \u306e\u9664\u7b97\u306f NaN \u3068\u51fa\u529b\u3055\u308c\u307e\u3059\u3002\n*\/\n\n<\/code><\/pre><\/div>\n\n\n<\/div><\/div>\n\n\n\n<figure class=\"wp-block-image alignright\"><a href=\"#\"><img decoding=\"async\" src=\"data:image;base64,\niVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAw5JREFUWEfN\nl01IFGEYx38juvmxkmshEoqblSR2cQ+CIIHiYT34lQgWeSgPuyaoQRgoeA\/D7WKOYAUadQjq5LlL\nBRkokYhYaKSHwFrNWKttceKdbXR39mNmt4VtT8vwPs\/7m+fj\/zwjkeafZPr+KXJRuIBEPQrVSNgB\n21\/7bRQ+IrGIwnMknuJiz4xvY4AHFOPnJuAGss04BX4CMhZucYXP8WziA8i4kbgN5Jm8WH\/Mh8IN\n3Mix7GMDTHEX6E3yYr3ZJC6uRfMVHUDmERIXU3R50I3CY9xc0vuMBNC9edepLsZrx7FmWRPiWdlZ\noeZZjWEkwgGCOZ8Mteo+081E3QT5WfkJASxvL1P1pCrSRqE3tCYOAYLV\/kFfcBqAhMTY2zHWv6\/H\nBWkua6azvJOYAODDwmmtOw4BpvAAg3rvGoB43veij9n3sxEADScaaLG3ENgPUGApoOdsTzwAYX8H\nF9fFnyCAEBn4Gq3PzQC02ltxljjZ8G1Qnl9uBkDoxDEhVkEAmctIRL4aYCYFGVIGxbnFbP3Ywlnq\nNEqB1hXduHmoReAecDVaclNehIeX3MdFjxaBBSSq4wGINtwL7LGv7KvHRFHmZOaoeffv+w9MM6VM\n9XmcItQisIgbhxYBb8hgCePQ18Du713KrGUseZeYqZ9B9HvjXOOBzfT5aTM1IM5v46JQA1Bi9VYo\nwPD8ME2lTZRaS9VuGDg3oALMb81TklfCpm+TouwiswDgQkoIYPDVII7jDiptlcjLMp5ajwrgeeeh\n8Egh3l9e2u3tSQGYToGmA6L3U5cCGcMiTJkUa7lWCCtCwzbUK2EKIhDWhoZCJABG3ozQZm9TW2\/h\ny4IqUqIGhBBVHK1g9dsqa7tr5mpAIUyITEnx0OshOk52qBUvCm\/UMZpsF+ikODgPDIdR\/8t+fAEf\nO\/4dbBabuick2QW6YSQADMZxCpUwxjgODqU0LiRae+hWMpHvuuI6sjKyEtqIhCjNfZrT20Qsp\/\/h\nUhojEgm9fuThBNdyzUFaP0w0iLR+moWGMm0fp\/+YfCPzP5RaqTCvMLQEAAAAAElFTkSuQmCC\n\" alt=\"\"\/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><i class=\"fal fa-cloud-download-alt\"><\/i> Download<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/drive.google.com\/file\/d\/1BHgZOVAbMttBaskvdTi6ZeDINn3cRRza\/view?usp=drivesdk\" target=\"_blank\">Tsv-String-Create-Cross-Table-for-Numeric-Column-2021.xml<\/a>\n<ul class=\"wp-block-list\">\n<li>2021-09-07 (C) Questetra, Inc. (MIT License)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"https:\/\/drive.google.com\/file\/d\/1cfZ1NMPMwUN_gwGLWaMTtH3uE27Ajt-W\/view?usp=sharing\" target=\"_blank\" rel=\"noreferrer noopener\">Tsv-String-Create-Cross-Table-for-Numeric-Column-2023.xml<\/a>\n<ul class=\"wp-block-list\">\n<li>2023-08-28 (C) Questetra, Inc. (MIT License)<\/li>\n\n\n\n<li>for &#8220;GraalJS standard (engine-type 3)&#8221; on v15.0 or above<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-right has-small-font-size wp-block-paragraph\"> The Add-on import feature is available with <span style=\"background-color:rgba(0, 0, 0, 0);color:#4a86e8\" class=\"has-inline-color\"><strong>Professional<\/strong><\/span> edition.<br>Freely modifiable JavaScript (ECMAScript) code. No warranty of any kind.<\/p>\n\n\n<div class=\"su-divider su-divider-style-dashed\" style=\"margin:30px 0;border-width:8px;border-color:#009900\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><i class=\"fal fa-lightbulb-exclamation\"><\/i> Notes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>When the process reaches this automated task, the TSV is automatically read.\n<ul class=\"wp-block-list\">\n<li>TSV: Monthly sales, log for questionnaire with rating, etc.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>If there is a blank line in the input TSV text, it will be skipped.\n<ul class=\"wp-block-list\">\n<li>The line feed code for the last line is not added either.<br>-\u3000The output TSV text (total table TSV, etc.) is rectangular data.<\/li>\n\n\n\n<li>The number of rows in TSV is #of {Y aggregate Key types} plus 2 (&#8220;header&#8221; + &#8220;total&#8221;).<\/li>\n\n\n\n<li>The number of columns of TSV is #of {X aggregate Key types} plus 2 (&#8220;heading&#8221; + &#8220;total&#8221;).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><i class=\"fal fa-images\"><\/i> Capture<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-capture-en.png?ssl=1\" target=\"_blank\" rel=\"noopener\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"675\" data-attachment-id=\"112679\" data-permalink=\"https:\/\/support.questetra.com\/en\/maintenance\/maintenance-20251117\/attachment\/tsv-string-create-cross-table-for-numeric-column-2021-capture-en\/\" data-orig-file=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-capture-en.png?fit=1200%2C675&amp;ssl=1\" data-orig-size=\"1200,675\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"tsv-string-create-cross-table-for-numeric-column-2021-capture-en\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-capture-en.png?fit=1024%2C576&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-capture-en.png?resize=1200%2C675&#038;ssl=1\" alt=\"No CAggregates the values in a numeric column by 2 aggregation-key columns: Pivot table. Sum, Percentage, Count and Average are tabulated as a cross table TSV. Eg, &quot;Sales for each combination of Client-Y and Store-X&quot; is aggregated from &quot;Sales log TSV&quot;.ode Crosstab\" class=\"wp-image-112679\" srcset=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-capture-en.png?w=1200&amp;ssl=1 1200w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-capture-en.png?resize=560%2C315&amp;ssl=1 560w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-capture-en.png?resize=1024%2C576&amp;ssl=1 1024w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-capture-en.png?resize=768%2C432&amp;ssl=1 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default q-box\"><a href=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-config-en.png?ssl=1\" target=\"_blank\" rel=\"noopener\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"654\" height=\"630\" data-attachment-id=\"112683\" data-permalink=\"https:\/\/support.questetra.com\/en\/maintenance\/maintenance-20251117\/attachment\/tsv-string-create-cross-table-for-numeric-column-2021-config-en\/\" data-orig-file=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-config-en.png?fit=1200%2C1156&amp;ssl=1\" data-orig-size=\"1200,1156\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"tsv-string-create-cross-table-for-numeric-column-2021-config-en\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-config-en.png?fit=654%2C630&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-config-en-654x630.png?resize=654%2C630&#038;ssl=1\" alt=\"Aggregates the values in a numeric column by 2 aggregation-key columns: Pivot table. Sum, Percentage, Count and Average are tabulated as a cross table TSV. Eg, &quot;Sales for each combination of Client-Y and Store-X&quot; is aggregated from &quot;Sales log TSV&quot;.\" class=\"wp-image-112683\" srcset=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-config-en.png?resize=654%2C630&amp;ssl=1 654w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-config-en.png?resize=327%2C315&amp;ssl=1 327w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-config-en.png?resize=768%2C740&amp;ssl=1 768w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-config-en.png?w=1200&amp;ssl=1 1200w\" sizes=\"auto, (max-width: 654px) 100vw, 654px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><i class=\"fal fa-book\"><\/i> Appendix<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>TSV (Tab Separated Values) text assumes rectangular data.\n<ul class=\"wp-block-list\">\n<li>Data that is not rectangular is automatically formatted with empty characters.<\/li>\n\n\n\n<li>Blank lines (including the end) are ignored.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Only &#8220;DESC&#8221; or &#8220;ASC&#8221; is valid for the sort config.\n<ul class=\"wp-block-list\">\n<li>If no sort settings are specified, it will be sorted in order of appearance.<\/li>\n\n\n\n<li>Character sorting is in code order.<\/li>\n\n\n\n<li>If both character sort and numeric sort are configured, numeric sort is performed after character sort.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Specify the field column with the column ID (starting with zero).\n<ul class=\"wp-block-list\">\n<li>Parsing numeric field values depends on JavaScript <code>parseFloat()<\/code>.<\/li>\n\n\n\n<li>If there are commas in the numeric field, they are considered as thousands separators (The removed string is parsed).<\/li>\n\n\n\n<li>A string that cannot be parsed is considered zero.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Division by zero is output as <code>NaN<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><i class=\"fal fa-balance-scale\"><\/i> See also<\/h3>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-questetra-support wp-block-embed-questetra-support\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"CfEavAbReW\"><a href=\"https:\/\/support.questetra.com\/en\/addons\/tsv-string-create-summary-table-for-numeric-column-2021\/\">TSV String, Create Summary Table for Numeric Column<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;TSV String, Create Summary Table for Numeric Column&#8221; &#8212; Questetra Support\" src=\"https:\/\/support.questetra.com\/addons\/tsv-string-create-summary-table-for-numeric-column-2021\/embed\/#?secret=XDsNxIDfej#?secret=CfEavAbReW\" data-secret=\"CfEavAbReW\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-questetra-support wp-block-embed-questetra-support\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"AtoH1Ay1cI\"><a href=\"https:\/\/support.questetra.com\/en\/addons\/questetra-bpms-process-batch-extract-as-tsv-2021\/\">Questetra BPMS: Process, Batch Extract as TSV<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Questetra BPMS: Process, Batch Extract as TSV&#8221; &#8212; Questetra Support\" src=\"https:\/\/support.questetra.com\/addons\/questetra-bpms-process-batch-extract-as-tsv-2021\/embed\/#?secret=ahAfDXHw6a#?secret=AtoH1Ay1cI\" data-secret=\"AtoH1Ay1cI\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Aggregates the values in a numeric column by 2 aggregation-key columns: Pivot table. Sum, Percentage, Count and Average are tabulated as a cross table TSV. Eg, &#8220;Sales for each combination of Client-Y and Store-X&#8221; is aggregated from &#8220;Sales log TSV&#8221;.<\/p>\n","protected":false},"author":2,"featured_media":112687,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_uag_custom_page_level_css":"","advanced_seo_description":"Aggregates the values in a numeric column by 2 aggregation-key columns: Pivot table. Sum, Percentage, Count and Average are tabulated as a cross table TSV. Eg, \"Sales for each combination of Client-Y and Store-X\" is aggregated from \"Sales log TSV\".","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[168],"tags":[494,327,389,2535],"class_list":["post-112691","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-addons","tag-routine-report","tag-routine-tasks","tag-tsv-csv","tag-workflow-automation"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1","uagb_featured_image_src":{"full":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1",1200,675,false],"thumbnail":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=440%2C440&ssl=1",440,440,true],"medium":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?fit=560%2C315&ssl=1",560,315,true],"medium_large":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?fit=768%2C432&ssl=1",768,432,true],"large":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?fit=1024%2C576&ssl=1",1024,576,true],"1536x1536":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1",1200,675,true],"2048x2048":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1",1200,675,true],"newspack-article-block-landscape-large":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=1200%2C675&ssl=1",1200,675,true],"newspack-article-block-portrait-large":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=900%2C675&ssl=1",900,675,true],"newspack-article-block-square-large":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=1200%2C675&ssl=1",1200,675,true],"newspack-article-block-landscape-medium":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=800%2C600&ssl=1",800,600,true],"newspack-article-block-portrait-medium":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=600%2C675&ssl=1",600,675,true],"newspack-article-block-square-medium":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=800%2C675&ssl=1",800,675,true],"newspack-article-block-landscape-intermediate":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=600%2C450&ssl=1",600,450,true],"newspack-article-block-portrait-intermediate":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=450%2C600&ssl=1",450,600,true],"newspack-article-block-square-intermediate":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=600%2C600&ssl=1",600,600,true],"newspack-article-block-landscape-small":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=400%2C300&ssl=1",400,300,true],"newspack-article-block-portrait-small":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=300%2C400&ssl=1",300,400,true],"newspack-article-block-square-small":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=400%2C400&ssl=1",400,400,true],"newspack-article-block-landscape-tiny":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=200%2C150&ssl=1",200,150,true],"newspack-article-block-portrait-tiny":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=150%2C200&ssl=1",150,200,true],"newspack-article-block-square-tiny":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?resize=200%2C200&ssl=1",200,200,true],"newspack-article-block-uncropped":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-for-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1",1200,675,true]},"uagb_author_info":{"display_name":"IMAMURA, Genichi","author_link":"https:\/\/support.questetra.com\/en\/author\/imamuragenichi\/"},"uagb_comment_info":6,"uagb_excerpt":"Aggregates the values in a numeric column by 2 aggregation-key columns: Pivot table. Sum, Percentage, Count and Average are tabulated as a cross table TSV. Eg, \"Sales for each combination of Client-Y and Store-X\" is aggregated from \"Sales log TSV\".","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9DiIh-tjB","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":112482,"url":"https:\/\/support.questetra.com\/en\/addons\/tsv-string-create-summary-table-for-numeric-column-2021\/","url_meta":{"origin":112691,"position":0},"title":"TSV String, Create Summary Table for Numeric Column","author":"IMAMURA, Genichi","date":"2021-09-07","format":false,"excerpt":"Aggregates the values in a numeric column by aggregation-keys. Sum, Percentage, Count and Average are tabulated as a summary table TSV. For example, \"Sales for each client\" is aggregated from \"Sales log TSV\". Grand Total Tabulation.","rel":"","context":"In &quot;Add-ons&quot;","block_context":{"text":"Add-ons","link":"https:\/\/support.questetra.com\/en\/category\/addons\/"},"img":{"alt_text":"TSV String, Create Summary Table for Numeric Column","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-summary-table-for-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-summary-table-for-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-summary-table-for-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-summary-table-for-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-summary-table-for-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":112915,"url":"https:\/\/support.questetra.com\/en\/addons\/tsv-string-create-cross-table-of-count-2021\/","url_meta":{"origin":112691,"position":1},"title":"TSV String, Create Cross Table of Count","author":"IMAMURA, Genichi","date":"2021-09-13","format":false,"excerpt":"Aggregates the count of data by 2 aggregation-key columns: Pivot table. Count and Percentage are tabulated as a cross table TSV. Eg, Survey Results TSV is automatically generated from Survey Records TSV. 2D frequency distribution.","rel":"","context":"In &quot;Add-ons&quot;","block_context":{"text":"Add-ons","link":"https:\/\/support.questetra.com\/en\/category\/addons\/"},"img":{"alt_text":"TSV String, Create Cross Table of Count","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-of-count-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-of-count-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-of-count-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-of-count-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-cross-table-of-count-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":82429,"url":"https:\/\/support.questetra.com\/en\/addons\/tsv-string-create-cross-tab-for-numerical-sum\/","url_meta":{"origin":112691,"position":2},"title":"TSV String, Create Cross Tab for Numerical Sum","author":"IMAMURA, Genichi","date":"2019-12-05","format":false,"excerpt":"Creates a crosstab (pivot table) for numeric fields in TSV data. For example, the \"Amount\" in the order history (TSV) is aggregated on two axes, \"Responsible\" and \"Product\". The fields for X-axis and Y-axis aggregation are specified by TSV field ID.","rel":"","context":"In &quot;Add-ons&quot;","block_context":{"text":"Add-ons","link":"https:\/\/support.questetra.com\/en\/category\/addons\/"},"img":{"alt_text":"TSV String, Create Cross Tab for Numerical Sum","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/12\/TSV-String-Create-Cross-Tab-for-Numerical-Sum-en.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/12\/TSV-String-Create-Cross-Tab-for-Numerical-Sum-en.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/12\/TSV-String-Create-Cross-Tab-for-Numerical-Sum-en.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/12\/TSV-String-Create-Cross-Tab-for-Numerical-Sum-en.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/12\/TSV-String-Create-Cross-Tab-for-Numerical-Sum-en.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":112902,"url":"https:\/\/support.questetra.com\/en\/addons\/tsv-string-create-summary-table-of-count-2021\/","url_meta":{"origin":112691,"position":3},"title":"TSV String, Create Summary Table of Count","author":"IMAMURA, Genichi","date":"2021-09-13","format":false,"excerpt":"Aggregates the count of data by aggregation-keys. Count and Percentage are tabulated as a summary table TSV. Eg, Survey Results TSV is automatically generated from Survey Records TSV. Frequency distribution.","rel":"","context":"In &quot;Add-ons&quot;","block_context":{"text":"Add-ons","link":"https:\/\/support.questetra.com\/en\/category\/addons\/"},"img":{"alt_text":"TSV String, Create Summary Table of Count","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-summary-table-of-count-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-summary-table-of-count-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-summary-table-of-count-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-summary-table-of-count-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/tsv-string-create-summary-table-of-count-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":109999,"url":"https:\/\/support.questetra.com\/en\/addons\/tsv-string-create-cross-tab-for-numerical-sum-2021\/","url_meta":{"origin":112691,"position":4},"title":"TSV String, Create Cross Tab for Numerical Sum","author":"Hirotaka NISHI","date":"2021-07-21","format":false,"excerpt":"Creates a crosstab table (or pivot table) for the numeric fields of TSV data. For example, the \"Amount\" in the order history (TSV) is aggregated on the two axes of \"Person Responsible\" and \"Product\". The fields for X-axis and Y-axis aggregation are specified by the TSV field ID.","rel":"","context":"In &quot;Add-ons&quot;","block_context":{"text":"Add-ons","link":"https:\/\/support.questetra.com\/en\/category\/addons\/"},"img":{"alt_text":"TSV String, Create Cross Tab for Numerical Sum","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/12\/TSV-String-Create-Cross-Tab-for-Numerical-Sum-en.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/12\/TSV-String-Create-Cross-Tab-for-Numerical-Sum-en.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/12\/TSV-String-Create-Cross-Tab-for-Numerical-Sum-en.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/12\/TSV-String-Create-Cross-Tab-for-Numerical-Sum-en.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/12\/TSV-String-Create-Cross-Tab-for-Numerical-Sum-en.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":117172,"url":"https:\/\/support.questetra.com\/en\/addons\/tsv-string-sum-numeric-column-2021\/","url_meta":{"origin":112691,"position":5},"title":"TSV String, Sum Numeric Column","author":"IMAMURA, Genichi","date":"2021-11-22","format":false,"excerpt":"Sums the values in the numeric column in the TSV. If the numeric field contains commas, they will be removed and then parsed. If you need to add up for each key, use \"Summary tabulation\" or \"Cross tabulation\".","rel":"","context":"In &quot;Add-ons&quot;","block_context":{"text":"Add-ons","link":"https:\/\/support.questetra.com\/en\/category\/addons\/"},"img":{"alt_text":"TSV String, Sum Numeric Column","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/11\/tsv-string-sum-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/11\/tsv-string-sum-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/11\/tsv-string-sum-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/11\/tsv-string-sum-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/11\/tsv-string-sum-numeric-column-2021-nocode-en.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]}],"amp_enabled":false,"_links":{"self":[{"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/posts\/112691","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/comments?post=112691"}],"version-history":[{"count":7,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/posts\/112691\/revisions"}],"predecessor-version":[{"id":150564,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/posts\/112691\/revisions\/150564"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/media\/112687"}],"wp:attachment":[{"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/media?parent=112691"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/categories?post=112691"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/tags?post=112691"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}