{"id":112228,"date":"2021-09-01T16:36:11","date_gmt":"2021-09-01T07:36:11","guid":{"rendered":"https:\/\/support.questetra.com\/?p=112228"},"modified":"2023-08-31T18:14:19","modified_gmt":"2023-08-31T09:14:19","slug":"two-tsv-strings-join-on-common-column-2021","status":"publish","type":"post","link":"https:\/\/support.questetra.com\/en\/addons\/two-tsv-strings-join-on-common-column-2021\/","title":{"rendered":"Two TSV Strings, Join on Common 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\">Two TSV Strings, Join on Common Column<\/div><div class=\"su-box-content su-u-clearfix su-u-trim\" style=\"border-bottom-left-radius:0px;border-bottom-right-radius:0px\"> Merges two TSVs based on a common key-field. Keeps all the rows from TsvA (left table) and brings in any matching rows from TsvB (right table); Left Outer Join. Neither TSV needs to be sorted. Only the upper row in TsvB will be matched.<\/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 Surviving TsvA<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> A2: Set Common Column ID of TsvA (eg &#8220;0&#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-edit fa-lg\"><\/i><\/span> B1: Set Absorbed TsvB<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 Common Column ID of TsvB (eg &#8220;2&#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 Join Column IDs of TsvB (eg &#8220;0,1,3&#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> B4: Set Alternative Strings (eg &#8220;&#8211;,0,NA&#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> C1: Select STRING DATA that stores Merged TSV (update)<span style=\"color:#990000;\"> *<\/span><\/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 strLeftTsv       = configs.get( &quot;StrConfA1&quot; );          \/\/\/ REQUIRED \/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  if( strLeftTsv     === &quot;&quot; ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {A1: LeftTsv} is empty \\n&quot; );\n  }\n  const arr2dLeftTsv   = parseAsRectangular( strLeftTsv );\nconst strLeftTsvKey    = configs.get( &quot;StrConfA2&quot; );          \/\/\/ REQUIRED \/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  if( strLeftTsvKey  === &quot;&quot; ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {A2: LeftTsvKey} is empty \\n&quot; );\n  }\n  const numLeftTsvKey  = parseInt( strLeftTsvKey, 10 );\n  if( isNaN( numLeftTsvKey ) || numLeftTsvKey &lt; 0 ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {A2: LeftTsvKey} must be a positive integer \\n&quot; );\n  }\n  if( numLeftTsvKey   &gt;= arr2dLeftTsv[0].length ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {A2: LeftTsvKey} is larger than LeftTsvWidth \\n&quot; );\n  }\n\nconst strRightTsv      = configs.get( &quot;StrConfB1&quot; );          \/\/\/ REQUIRED \/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  if( strRightTsv    === &quot;&quot; ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B1: RightTsv} is empty \\n&quot; );\n  }\n  const arr2dRightTsv  = parseAsRectangular( strRightTsv );\nconst strRightTsvKey   = configs.get( &quot;StrConfB2&quot; );          \/\/\/ REQUIRED \/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  if( strRightTsvKey === &quot;&quot; ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B2: RightTsvKey} is empty \\n&quot; );\n  }\n  const numRightTsvKey = parseInt( strRightTsvKey, 10 );\n  if( isNaN( numRightTsvKey ) || numRightTsvKey &lt; 0 ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B2: RightTsvKey} must be a positive integer \\n&quot; );\n  }\n  if( numRightTsvKey   &gt;= arr2dRightTsv[0].length ){\n    throw new Error( &quot;\\n AutomatedTask ConfigError:&quot; +\n                     &quot; Config {B2: RightTsvKey} is larger than RightTsvWidth \\n&quot; );\n  }\n\nlet   strJoinIds       = configs.get( &quot;StrConfB3&quot; );          \/\/ NotRequired \/\/\/\/\/\/\/\/\/\/\/\/\n  if( strJoinIds     === &quot;&quot; ){\n    for( let i = 0; i &lt; arr2dRightTsv[0].length; i++ ){\n      strJoinIds += i + &quot;&quot;;\n      if( i !== arr2dRightTsv[0].length - 1 ){ strJoinIds += &quot;,&quot;; }\n    }\n  }\n  let arrJoinIds       = strJoinIds.split(&quot;,&quot;);\n\nlet   strJoinStrings   = configs.get( &quot;StrConfB4&quot; );          \/\/ NotRequired \/\/\/\/\/\/\/\/\/\/\/\/\n  if( strJoinStrings === &quot;&quot; ){\n    for( let i = 0; i &lt; arr2dRightTsv[0].length; i++ ){\n      strJoinStrings += &quot;&quot;;\n      if( i !== arr2dRightTsv[0].length - 1 ){ strJoinIds += &quot;,&quot;; }\n    }\n  }\n  let arrJoinStrings   = strJoinStrings.split(&quot;,&quot;);\n\n\nconst strPocketOutput  = configs.getObject( &quot;SelectConfC1&quot; ); \/\/\/ REQUIRED \/\/\/\/\/\/\/\/\/\/\/\/\/\/\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\/\/ compare LeftTsv with RightTsv\nlet strOutput = &quot;&quot;;\nfor( let i = 0; i &lt; arr2dLeftTsv.length; i++ ){\n  let boolMatchExists = false;\n  for( let j = 0; j &lt; arr2dRightTsv.length; j++ ){\n    if( arr2dLeftTsv[i][numLeftTsvKey] === arr2dRightTsv[j][numRightTsvKey] ){\n      boolMatchExists = true;\n      strOutput += arr2dLeftTsv[i].join(&quot;\\t&quot;) + &quot;\\t&quot;;\n      for( let k = 0; k &lt; arrJoinIds.length; k++ ){\n        strOutput += arr2dRightTsv[j][ parseInt(arrJoinIds[k]) ];\n        if( k !== arrJoinIds.length - 1 ){\n          strOutput += &quot;\\t&quot;;\n        }\n      }\n      strOutput += &quot;\\n&quot;;\n      break;\n    }\n  }\n  if( ! boolMatchExists ){\n    strOutput += arr2dLeftTsv[i].join(&quot;\\t&quot;) + &quot;\\t&quot;;\n    for( let k = 0; k &lt; arrJoinIds.length; k++ ){\n      if( k &lt; arrJoinStrings.length ){\n        strOutput += arrJoinStrings[k];\n      }else{\n        strOutput += arrJoinStrings[arrJoinStrings.length - 1];\n      }\n      if( k !== arrJoinIds.length - 1 ){\n        strOutput += &quot;\\t&quot;;\n      }\n    }\n    strOutput += &quot;\\n&quot;;\n  }\n}\nstrOutput = strOutput.slice( 0, -1 ); \/\/ delete last &quot;\\n&quot;\n\n\n\/\/\/\/ == Data Updating \/ \u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30c7\u30fc\u30bf\u3078\u306e\u4ee3\u5165 ==\nengine.setData( strPocketOutput, strOutput );\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, TsvA and TsvB are automatically combined.\n    - They are combined by so-called &quot;left outer join&quot;, and a part of TsvB is taken in based on TsvA.\n    - TsvA: Sales log, Monthly sales data, Access log, etc.\n    - TsvB: Product master, Previous month sales data, White list, etc.\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- Set the column ID (starting with zero) for the common column for matching.\n    - For each data in the TsvA common column, a matching search is performed for the TsvB common column.\n    - The matching is executed in order from the top line, and the search ends as soon as it is found.\n    - The matching is case sensitive.\n- Set the column IDs to be joined in CSV format. (TsvB columns to be brought)\n    - If not set, all columns in TsvB will be joined. (including common columns)\n\nAPPENDIX:\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- The number of cells in output TSV (combined TSV) is uniform for each row. (Rectangle Matrix)\n    - If the number of cells in TsvA is not uniform in each row, blank strings will be added.\n- Empty strings are added to the unmatched TsvA rows as many as the number of join columns.\n    - The number of cells in output TSV (combined TSV) is uniform for each row.\n    - To combine non-empty string, set the alternative strings in CSV format.\n    - If the list of alternative strings is insufficient, the final string is repeatedly assigned.\n\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\u308bTsvA\u3068TsvB\u304c\u81ea\u52d5\u7684\u306b\u7d50\u5408\u3055\u308c\u307e\u3059\u3002\n    - \u3044\u308f\u3086\u308b\u300c\u5de6\u5916\u90e8\u7d50\u5408\u300d\u306b\u3066\u7d50\u5408\u3055\u308c\u3001TsvA\u3092\u30d9\u30fc\u30b9\u306bTsvB\u306e\u4e00\u90e8\u304c\u53d6\u308a\u8fbc\u307e\u308c\u307e\u3059\u3002\n    - TsvA: \u58f2\u4e0a\u30ed\u30b0\u3001\u6708\u9593\u58f2\u4e0a\u30c7\u30fc\u30bf\u3001\u30a2\u30af\u30bb\u30b9\u30ed\u30b0\u3001\u306a\u3069\n    - TsvB: \u5546\u54c1\u30de\u30b9\u30bf\u3001\u524d\u6708\u58f2\u4e0a\u30c7\u30fc\u30bf\u3001\u30db\u30ef\u30a4\u30c8\u30ea\u30b9\u30c8\u3001\u306a\u3069\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- \u30de\u30c3\u30c1\u30f3\u30b0\u306b\u5229\u7528\u3055\u308c\u308b\u5171\u901a\u5217\u306f\u3001\u5217ID\uff08\u30bc\u30ed\u59cb\u307e\u308a\uff09\u3092\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n    - TsvA\u5171\u901a\u5217\u306e\u5404\u30c7\u30fc\u30bf\u306b\u3064\u3044\u3066\u3001TsvB\u5171\u901a\u5217\u3092\u30de\u30c3\u30c1\u30f3\u30b0\u63a2\u7d22\u3057\u307e\u3059\u3002\n    - \u30de\u30c3\u30c1\u30f3\u30b0\u63a2\u7d22\u306f\u4e0a\u306e\u884c\u304b\u3089\u9806\u306b\u5b9f\u884c\u3055\u308c\u3001\u767a\u898b\u6b21\u7b2c\u3067\u63a2\u7d22\u306f\u7d42\u4e86\u3057\u307e\u3059\u3002\n    - \u30de\u30c3\u30c1\u30f3\u30b0\u5224\u5b9a\u306b\u304a\u3044\u3066\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u306f\u533a\u5225\u3055\u308c\u307e\u3059\u3002\n- \u30de\u30c3\u30c1\u30f3\u30b0\u6642\u306b\u7d50\u5408\u3055\u308c\u308b\u5217ID\uff08\u53d6\u308a\u8fbc\u307e\u308c\u308bTsvB\u5217\uff09\u306fCSV\u5f62\u5f0f\u3067\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n    - \u672a\u8a2d\u5b9a\u306e\u5834\u5408\u3001TsvB\u306e\u3059\u3079\u3066\u306e\u5217\u304c\u7d50\u5408\u3055\u308c\u307e\u3059\u3002\uff08\u5171\u901a\u5217\u3092\u542b\u3080\uff09\n\nAPPENDIX-ja:\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    - \u6700\u7d42\u884c\u306e\u6539\u884c\u30b3\u30fc\u30c9\u3082\u4ed8\u4e0e\u3055\u308c\u307e\u305b\u3093\u3002\n- \u51fa\u529b\u3055\u308c\u308bTSV\uff08\u7d50\u5408\u3055\u308c\u305fTSV\uff09\u306e\u30bb\u30eb\u6570\u306f\u5404\u884c\u3067\u5747\u4e00\u3068\u306a\u308a\u307e\u3059\u3002\uff08\u77e9\u5f62\u30de\u30c8\u30ea\u30c3\u30af\u30b9\uff09\n    - TsvA\u306e\u30bb\u30eb\u6570\u304c\u5404\u884c\u3067\u5747\u4e00\u3067\u306a\u304b\u3063\u305f\u5834\u5408\u3001\u7a7a\u6587\u5b57\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3059\u3002\n- \u30de\u30c3\u30c1\u30f3\u30b0\u3055\u308c\u306a\u304b\u3063\u305fTsvA\u306e\u884c\u306b\u306f\u3001\u7d50\u5408\u5217\u306e\u6570\u3060\u3051\u7a7a\u6587\u5b57\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3059\u3002\n    - \u7a7a\u6587\u5b57\u4ee5\u5916\u3092\u7d50\u5408\u3055\u305b\u305f\u3044\u5834\u5408\u306f\u3001\u4ee3\u66ff\u6587\u5b57\u3092CSV\u5f62\u5f0f\u3067\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n    - \u4ee3\u66ff\u6587\u5b57\u306e\u5217\u6319\u304c\u8db3\u308a\u306a\u3044\u5834\u5408\u3001\u6700\u7d42\u306e\u4ee3\u66ff\u6587\u5b57\u304c\u7e70\u308a\u8fd4\u3057\u4ee3\u5165\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,\niVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAxlJREFUWEfF\nl0tIVGEUgL8rjuRjKjNL1EVqmSgJupg0LFChTatcWeTCEmZsY0EQuhBXI0JMbqaZAS3QsEUyLcRN\nCGHgZqhcRINQaoWQCGko9pioG3fGO4\/7mLlXjbnb\/zy+e875zzm\/QJo\/wbB\/HzmItCHQjEgdAieA\n\/B39DUQ+IjCPyAsE\/Nj5bsR2aoBHFBHiLuAADhgxCvwEvGQxRCeryXSSA3hxIHAPyDXoWCm2jcgd\nHHj19PUBfDwAunfpWKnmwc5NLVvaAF4mELiyT84jZkSe4OCq0qYaIMmfV+dXM9Y8RuWhSl220J8Q\nrrcunPNOLRlVJBIBIjn3aGlKzidaJqgtqGVyaZKpT1MqsTJrGT1nenC\/c9P\/ql8bUqQ7viZiAJFq\n\/6BVcPHOBQRGF0bpetmlctBxqgNXoysMl5mRycr2Cn2BPnVhZnFSvh0xAB\/3gVtKaaVz6VwCGHg9\nQFNRE5YMC+u\/1pn+PI0MMLc6R\/3RerZ+b1HztEYrEsPYuS0dRACkJgNflfdcy7kMMPtlFneTG6vF\nSnAjGHYkA3iCHopzimk83qgHIPWJAqlZRQC8XENgXIkqGRw+N8zajzVCf0PRY\/+yn6XNpb0ASLei\nAweP5QiMAte1AAZtg\/QGehl\/n8jXcKyBztOdZGdmR3NtIgKSq4fYuSFH4A0CdWYAtBJrCkBkHgf1\ncgTW4wZL1LZkMD4CgcsBqg5XqXwvfFvA9sxmpgYkGxvYOSIDiHp\/pJeCPUdAMmBHMAWwzxFIADCU\nAt3+u3NgqgYSUuDFUBH6L\/qpOFih4ljcXKTteZu5GlAUoaFr6LQ5Kc0tVQHILddkBBKuoW4j+m9F\nqGhEmq1Y+qOhs0N4g16Wt5ZTlQDx09BcK47MA9Uwaq9oD0+3PEteSueygLwPlFvLk80CxTCStJOM\n4zDfeR+F2YXhYjPyjVwY0QPYRnMcR4aS7kIyc2mG1pJWI76jMvKUTFDSXUhkKZ2VrKW4hZLcElMA\n8p4Qp5RiJZMl07qUpoiEqRDEhE2u5bFIpPFhIkOk9WkWH++0PU53mXSjav8ArIGUMG7ebhkAAAAA\nSUVORK5CYII=\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\/1ClZlHeQ0KCiUNw79D_z2wNXbzNiEAPEL\/view?usp=drivesdk\" target=\"_blank\">Two-Tsv-Strings-Join-on-Common-Column-2021.xml<\/a>\n<ul class=\"wp-block-list\">\n<li>2021-08-30 (C) Questetra, Inc. (MIT License)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"https:\/\/drive.google.com\/file\/d\/1itdeRxkGFaB3ae4tVts32Yvd1S40AwnP\/view?usp=sharing\" target=\"_blank\" rel=\"noreferrer noopener\">Two-Tsv-Strings-Join-on-Common-Column-2023.xml<\/a>\n<ul class=\"wp-block-list\">\n<li>2023-08-30 (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, TsvA and TsvB are automatically combined.\n<ul class=\"wp-block-list\">\n<li>They are combined by the so-called &#8220;left outer join&#8221;, and a part of TsvB is taken in based on TsvA.<\/li>\n\n\n\n<li>TsvA: Sales log, Monthly sales data, Access log, etc.<\/li>\n\n\n\n<li>TsvB: Product master, Previous month sales data, White list, etc.<\/li>\n<\/ul>\n<\/li>\n\n\n\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>Set the column ID (starting with zero) for the common columns used for matching.\n<ul class=\"wp-block-list\">\n<li>For each data in the TsvA common column, a matching search is performed for the TsvB common column.<\/li>\n\n\n\n<li>The matching is executed in order from the top line, and the search ends as soon as it is found.<\/li>\n\n\n\n<li>The matching is case sensitive.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Set the column IDs to be joined in CSV format. (TsvB columns to be imported)\n<ul class=\"wp-block-list\">\n<li>If not set, all columns in TsvB will be merged. (including common columns)<\/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\/two-tsv-strings-join-on-common-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=\"112246\" data-permalink=\"https:\/\/support.questetra.com\/en\/addons\/two-tsv-strings-join-on-common-column-2021\/attachment\/two-tsv-strings-join-on-common-column-2021-capture-en\/\" data-orig-file=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-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=\"two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-column-2021-capture-en.png?fit=1024%2C576&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-capture-en.png?resize=1200%2C675&#038;ssl=1\" alt=\"Merges two TSVs based on a common key-field. Keeps all the rows from the TsvA (left table) and brings in any matching rows from the TsvB (right table); Left Outer Join. Neither TSV needs to be sorted. Only the upper row in the TsvB will be matched.\" class=\"wp-image-112246\" srcset=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-capture-en.png?w=1200&amp;ssl=1 1200w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-capture-en.png?resize=560%2C315&amp;ssl=1 560w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-capture-en.png?resize=1024%2C576&amp;ssl=1 1024w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-column-2021-config-en.png?ssl=1\" target=\"_blank\" rel=\"noopener\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"632\" height=\"630\" data-attachment-id=\"112220\" data-permalink=\"https:\/\/support.questetra.com\/en\/maintenance\/maintenance-20251117\/attachment\/two-tsv-strings-join-on-common-column-2021-config-en\/\" data-orig-file=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-config-en.png?fit=1195%2C1191&amp;ssl=1\" data-orig-size=\"1195,1191\" 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=\"two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-column-2021-config-en.png?fit=632%2C630&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-config-en-632x630.png?resize=632%2C630&#038;ssl=1\" alt=\"Merges two TSVs based on a common key-field. Keeps all the rows from the TsvA (left table) and brings in any matching rows from the TsvB (right table); Left Outer Join. Neither TSV needs to be sorted. Only the upper row in the TsvB will be matched.\" class=\"wp-image-112220\" srcset=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-config-en.png?resize=632%2C630&amp;ssl=1 632w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-config-en.png?resize=316%2C315&amp;ssl=1 316w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-config-en.png?resize=440%2C440&amp;ssl=1 440w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-config-en.png?resize=768%2C765&amp;ssl=1 768w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-config-en.png?w=1195&amp;ssl=1 1195w\" sizes=\"auto, (max-width: 632px) 100vw, 632px\" \/><\/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>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.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>The number of cells in the (merged) output TSV is uniform for each row. (Rectangle Matrix)\n<ul class=\"wp-block-list\">\n<li>If the number of cells in TsvA is not uniform in each row, blank strings will be added.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>As many empty strings are added to the unmatched TsvA rows as the number of join columns.\n<ul class=\"wp-block-list\">\n<li>The number of cells in the output TSV (combined TSV) is uniform for each row.<\/li>\n\n\n\n<li>To combine non-empty strings, set the alternative strings in CSV format.<\/li>\n\n\n\n<li>If the list of alternative strings is insufficient, the final string is repeatedly assigned.<\/li>\n<\/ul>\n<\/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=\"9j1cFBHIsc\"><a href=\"https:\/\/support.questetra.com\/en\/addons\/tsv-string-convert-2021\/\">TSV String, Convert<\/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, Convert&#8221; &#8212; Questetra Support\" src=\"https:\/\/support.questetra.com\/addons\/tsv-string-convert-2021\/embed\/#?secret=CA8SOogzzl#?secret=9j1cFBHIsc\" data-secret=\"9j1cFBHIsc\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Merges two TSVs based on a common key-field. Keeps all the rows from TsvA (left table) and brings in any matching rows from TsvB (right table); Left Outer Join. Neither TSV needs to be sorted. Only the upper row in TsvB will be matched.<\/p>\n","protected":false},"author":2,"featured_media":112224,"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":"Merges two TSVs based on a common key-field. Keeps all the rows from the TsvA (left table) and brings in any matching rows from the TsvB (right table); Left Outer Join. Neither TSV needs to be sorted. Only the upper row in the TsvB will be matched.","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":[338,494,389],"class_list":["post-112228","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-addons","tag-invoice-and-billing","tag-routine-report","tag-tsv-csv"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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\/two-tsv-strings-join-on-common-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":1,"uagb_excerpt":"Merges two TSVs based on a common key-field. Keeps all the rows from TsvA (left table) and brings in any matching rows from TsvB (right table); Left Outer Join. Neither TSV needs to be sorted. Only the upper row in TsvB will be matched.","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9DiIh-tc8","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":112251,"url":"https:\/\/support.questetra.com\/ja\/addons\/two-tsv-strings-join-on-common-column-2021\/","url_meta":{"origin":112228,"position":0},"title":"2\u3064\u306eTSV\u6587\u5b57\u5217, \u5171\u901a\u5217\u3067\u7d50\u5408","author":"IMAMURA, Genichi","date":"2021-09-01","format":false,"excerpt":"\u5171\u901a\u306e\u30ad\u30fcField\u306b\u57fa\u3065\u3044\u30662\u3064\u306eTSV\u3092\u30de\u30fc\u30b8\u3057\u307e\u3059\u3002TsvA\uff08\u5de6\u30c6\u30fc\u30d6\u30eb\uff09\u306e\u5168\u884c\u3092\u4fdd\u6301\u3057\u3001TsvB\uff08\u53f3\u30c6\u30fc\u30d6\u30eb\uff09\u304b\u3089\u4e00\u81f4\u3059\u308b\u884c\u3092\u53d6\u308a\u8fbc\u307f\u307e\u3059\u3014\u5de6\u5916\u90e8\u7d50\u5408\u3015\u3002\u3069\u3061\u3089\u306eTSV\u3082\u4e8b\u524d\u30bd\u30fc\u30c8\u306f\u4e0d\u8981\u3067\u3059\u304c\u3001TsvB\u306e\u3088\u308a\u4e0a\u4f4d\u306b\u3042\u308b\u884c\u304c\u30de\u30c3\u30c1\u30f3\u30b0\u5224\u5b9a\u3055\u308c\u307e\u3059\u3002","rel":"","context":"In &quot;\u30a2\u30c9\u30aa\u30f3&quot;","block_context":{"text":"\u30a2\u30c9\u30aa\u30f3","link":"https:\/\/support.questetra.com\/ja\/category\/addons\/"},"img":{"alt_text":"2\u3064\u306eTSV\u6587\u5b57\u5217, \u5171\u901a\u5217\u3067\u7d50\u5408","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-nocode-ja.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\/two-tsv-strings-join-on-common-column-2021-nocode-ja.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-nocode-ja.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-nocode-ja.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/09\/two-tsv-strings-join-on-common-column-2021-nocode-ja.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":97139,"url":"https:\/\/support.questetra.com\/en\/addons\/google-sheets-sheet-row-update-with-singleline-tsv\/","url_meta":{"origin":112228,"position":1},"title":"Google Sheets: Sheet Row, Update with Singleline TSV","author":"IMAMURA, Genichi","date":"2020-10-28","format":false,"excerpt":"Updates a Google Sheet with a single line of TSV data. Searches for an A-Column cell that exactly matches the first value of the TSV and overwrite only the first occurrence. The values will be parsed as if they were entered manually by the user. If no matching line exists,\u2026","rel":"","context":"In &quot;Add-ons&quot;","block_context":{"text":"Add-ons","link":"https:\/\/support.questetra.com\/en\/category\/addons\/"},"img":{"alt_text":"Google Sheets: Sheet Row, Update with Singleline TSV","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/10\/Google-Sheets-Sheet-Row-Update-with-Singleline-TSV-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\/2020\/10\/Google-Sheets-Sheet-Row-Update-with-Singleline-TSV-en.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/10\/Google-Sheets-Sheet-Row-Update-with-Singleline-TSV-en.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/10\/Google-Sheets-Sheet-Row-Update-with-Singleline-TSV-en.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/10\/Google-Sheets-Sheet-Row-Update-with-Singleline-TSV-en.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":79781,"url":"https:\/\/support.questetra.com\/en\/data-items\/table-type\/","url_meta":{"origin":112228,"position":2},"title":"Table-Type","author":"Peter Glover","date":"2021-01-22","format":false,"excerpt":"Displays a table that can use the String, Numeric, Select or Date formats.","rel":"","context":"In &quot;Data Items&quot;","block_context":{"text":"Data Items","link":"https:\/\/support.questetra.com\/en\/category\/data-items\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/09\/Table.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\/09\/Table.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/09\/Table.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/09\/Table.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/09\/Table.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":83944,"url":"https:\/\/support.questetra.com\/en\/addons\/two-tsv-strings-extract-cell-matched-lines\/","url_meta":{"origin":112228,"position":3},"title":"Two Tsv Strings, Extract Cell-Matched Lines","author":"IMAMURA, Genichi","date":"2020-01-29","format":false,"excerpt":"Extracts B lines that DO exist in A-Cell with comparing the specific column of TSV-A and the specific column of TSV-B. If A and B match exactly, all lines in B are returned. If they are completely different, an empty string is returned.","rel":"","context":"In &quot;Add-ons&quot;","block_context":{"text":"Add-ons","link":"https:\/\/support.questetra.com\/en\/category\/addons\/"},"img":{"alt_text":"Two Tsv Strings, Extract Cell-Matched Lines","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Extract-Cell-Matched-Lines-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\/2020\/01\/Two-Tsv-Strings-Extract-Cell-Matched-Lines-en.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Extract-Cell-Matched-Lines-en.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Extract-Cell-Matched-Lines-en.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Extract-Cell-Matched-Lines-en.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":84096,"url":"https:\/\/support.questetra.com\/en\/addons\/two-tsv-strings-compare-numeric-cells\/","url_meta":{"origin":112228,"position":4},"title":"Two Tsv Strings, Compare Numeric Cells","author":"IMAMURA, Genichi","date":"2020-01-30","format":false,"excerpt":"Compares numeric column strings in TSV-A and TSV-B, and lists the amount of change from A to B. If there is no string that matches the key column of A, it will not be listed. If there are multiple matches, it will be compared with the key above.","rel":"","context":"In &quot;Add-ons&quot;","block_context":{"text":"Add-ons","link":"https:\/\/support.questetra.com\/en\/category\/addons\/"},"img":{"alt_text":"Two Tsv Strings, Compare Numeric Cells","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Compare-Numeric-Cells-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\/2020\/01\/Two-Tsv-Strings-Compare-Numeric-Cells-en.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Compare-Numeric-Cells-en.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Compare-Numeric-Cells-en.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Compare-Numeric-Cells-en.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":83960,"url":"https:\/\/support.questetra.com\/en\/addons\/two-tsv-strings-extract-cell-mismatched-lines\/","url_meta":{"origin":112228,"position":5},"title":"Two Tsv Strings, Extract Cell-Mismatched Lines","author":"IMAMURA, Genichi","date":"2020-01-29","format":false,"excerpt":"Extracts B lines that DO NOT exist in A-Cell with comparing the specific column of TSV-A and the specific column of TSV-B. If A and B match exactly, an empty string is returned. If they are completely different, all lines in B are returned.","rel":"","context":"In &quot;Add-ons&quot;","block_context":{"text":"Add-ons","link":"https:\/\/support.questetra.com\/en\/category\/addons\/"},"img":{"alt_text":"Two Tsv Strings, Extract Cell-Mismatched Lines","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Extract-Cell-Mismatched-Lines-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\/2020\/01\/Two-Tsv-Strings-Extract-Cell-Mismatched-Lines-en.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Extract-Cell-Mismatched-Lines-en.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Extract-Cell-Mismatched-Lines-en.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/01\/Two-Tsv-Strings-Extract-Cell-Mismatched-Lines-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\/112228","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=112228"}],"version-history":[{"count":5,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/posts\/112228\/revisions"}],"predecessor-version":[{"id":150709,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/posts\/112228\/revisions\/150709"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/media\/112224"}],"wp:attachment":[{"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/media?parent=112228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/categories?post=112228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/tags?post=112228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}