view docs/scripts/html/code/MergeTextFiles.html @ 0:4816e4a8ae95 draft default tip

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 09:23:18 -0500
parents
children
line wrap: on
line source

<html>
<head>
<title>MayaChemTools:Code:MergeTextFiles.pl</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
</head>
<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
<br/>
<center>
<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
</center>
<br/>
<pre>
   1 #!/usr/bin/perl -w
   2 <span class="c">#</span>
   3 <span class="c"># $RCSfile: MergeTextFiles.pl,v $</span>
   4 <span class="c"># $Date: 2015/02/28 20:46:20 $</span>
   5 <span class="c"># $Revision: 1.40 $</span>
   6 <span class="c">#</span>
   7 <span class="c"># Author: Manish Sud &lt;msud@san.rr.com&gt;</span>
   8 <span class="c">#</span>
   9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
  10 <span class="c">#</span>
  11 <span class="c"># This file is part of MayaChemTools.</span>
  12 <span class="c">#</span>
  13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
  14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
  15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
  16 <span class="c"># later version.</span>
  17 <span class="c">#</span>
  18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
  19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
  20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
  21 <span class="c"># details.</span>
  22 <span class="c">#</span>
  23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
  24 <span class="c"># along with MayaChemTools; if not, see &lt;http://www.gnu.org/licenses/&gt; or</span>
  25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
  26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
  27 <span class="c">#</span>
  28 
  29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
  30 <span class="k">use</span> <span class="w">FindBin</span><span class="sc">;</span> <span class="k">use</span> <span class="w">lib</span> <span class="q">&quot;$FindBin::Bin/../lib&quot;</span><span class="sc">;</span>
  31 <span class="k">use</span> <span class="w">Getopt::Long</span><span class="sc">;</span>
  32 <span class="k">use</span> <span class="w">File::Basename</span><span class="sc">;</span>
  33 <span class="k">use</span> <span class="w">Text::ParseWords</span><span class="sc">;</span>
  34 <span class="k">use</span> <span class="w">Benchmark</span><span class="sc">;</span>
  35 <span class="k">use</span> <span class="w">FileHandle</span><span class="sc">;</span>
  36 <span class="k">use</span> <span class="w">FileUtil</span><span class="sc">;</span>
  37 <span class="k">use</span> <span class="w">TextUtil</span><span class="sc">;</span>
  38 
  39 <span class="k">my</span><span class="s">(</span><span class="i">$ScriptName</span><span class="cm">,</span> <span class="i">%Options</span><span class="cm">,</span> <span class="i">$StartTime</span><span class="cm">,</span> <span class="i">$EndTime</span><span class="cm">,</span> <span class="i">$TotalTime</span><span class="s">)</span><span class="sc">;</span>
  40 
  41 <span class="c"># Autoflush STDOUT</span>
  42 <span class="i">$|</span> = <span class="n">1</span><span class="sc">;</span>
  43 
  44 <span class="c"># Starting message...</span>
  45 <span class="i">$ScriptName</span> = <span class="w">basename</span> <span class="i">$0</span><span class="sc">;</span>
  46 <span class="k">print</span> <span class="q">&quot;\n$ScriptName:Starting...\n\n&quot;</span><span class="sc">;</span>
  47 <span class="i">$StartTime</span> = <span class="w">new</span> <span class="w">Benchmark</span><span class="sc">;</span>
  48 
  49 <span class="c"># Get the options and setup script...</span>
  50 <span class="i">SetupScriptUsage</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  51 <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">help</span>} || <span class="i">@ARGV</span> &lt; <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
  52   <span class="k">die</span> <span class="i">GetUsageFromPod</span><span class="s">(</span><span class="q">&quot;$FindBin::Bin/$ScriptName&quot;</span><span class="s">)</span><span class="sc">;</span>
  53 <span class="s">}</span>
  54 
  55 <span class="k">my</span><span class="s">(</span><span class="i">@TextFilesList</span><span class="s">)</span><span class="sc">;</span>
  56 <span class="i">@TextFilesList</span> = <span class="i">ExpandFileNames</span><span class="s">(</span>\<span class="i">@ARGV</span><span class="cm">,</span> <span class="q">&quot;csv tsv&quot;</span><span class="s">)</span><span class="sc">;</span>
  57 
  58 <span class="k">if</span> <span class="s">(</span><span class="i">@TextFilesList</span> == <span class="n">1</span><span class="s">)</span> <span class="s">{</span>
  59   <span class="k">die</span> <span class="q">&quot;Error: Specify more than one text file.\n&quot;</span><span class="sc">;</span>
  60 <span class="s">}</span>
  61 
  62 <span class="c"># Process options...</span>
  63 <span class="k">print</span> <span class="q">&quot;Processing options...\n&quot;</span><span class="sc">;</span>
  64 <span class="k">my</span><span class="s">(</span><span class="i">%OptionsInfo</span><span class="s">)</span><span class="sc">;</span>
  65 <span class="i">ProcessOptions</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  66 
  67 <span class="c"># Setup information about input files...</span>
  68 <span class="k">my</span><span class="s">(</span><span class="i">%TextFilesInfo</span><span class="s">)</span><span class="sc">;</span>
  69 <span class="k">print</span> <span class="q">&quot;Checking input text files...\n&quot;</span><span class="sc">;</span>
  70 <span class="i">RetrieveTextFilesInfo</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  71 <span class="i">RetrieveColumnsAndKeysInfo</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  72 
  73 <span class="c"># Merge files...</span>
  74 <span class="k">print</span> <span class="q">&quot;\nGenerating new text file $OptionsInfo{NewTextFile}...\n&quot;</span><span class="sc">;</span>
  75 <span class="i">MergeTextFiles</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  76 
  77 <span class="k">print</span> <span class="q">&quot;\n$ScriptName:Done...\n\n&quot;</span><span class="sc">;</span>
  78 
  79 <span class="i">$EndTime</span> = <span class="w">new</span> <span class="w">Benchmark</span><span class="sc">;</span>
  80 <span class="i">$TotalTime</span> = <span class="w">timediff</span> <span class="s">(</span><span class="i">$EndTime</span><span class="cm">,</span> <span class="i">$StartTime</span><span class="s">)</span><span class="sc">;</span>
  81 <span class="k">print</span> <span class="q">&quot;Total time: &quot;</span><span class="cm">,</span> <span class="i">timestr</span><span class="s">(</span><span class="i">$TotalTime</span><span class="s">)</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
  82 
  83 <span class="c">###############################################################################</span>
  84 
  85 <span class="c"># Merge all valid Text files...</span>
<a name="MergeTextFiles-"></a>  86 <span class="k">sub </span><span class="m">MergeTextFiles</span> <span class="s">{</span>
  87   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
  88 
  89   <span class="k">open</span> <span class="w">NEWTEXTFILE</span><span class="cm">,</span> <span class="q">&quot;&gt;$OptionsInfo{NewTextFile}&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Couldn&#39;t open $OptionsInfo{NewTextFile}: $! \n&quot;</span><span class="sc">;</span>
  90 
  91   <span class="i">WriteNewTextFileColumnLabels</span><span class="s">(</span>\<span class="i">*NEWTEXTFILE</span><span class="s">)</span><span class="sc">;</span>
  92 
  93   <span class="c">#Open up all the files and skip coumn label line...</span>
  94   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">FileHandle</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  95   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
  96     <span class="i">$TextFilesInfo</span>{<span class="w">FileHandle</span>}[<span class="i">$Index</span>] = <span class="w">new</span> <span class="w">FileHandle</span><span class="sc">;</span>
  97 
  98     <span class="k">open</span> <span class="i">$TextFilesInfo</span>{<span class="w">FileHandle</span>}[<span class="i">$Index</span>]<span class="cm">,</span> <span class="q">&quot;$TextFilesList[$Index]&quot;</span> <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Couldn&#39;t open $TextFilesList[$Index]: $! \n&quot;</span><span class="sc">;</span>
  99     <span class="i">GetTextLine</span><span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">FileHandle</span>}[<span class="i">$Index</span>]<span class="s">)</span><span class="sc">;</span>
 100   <span class="s">}</span>
 101 
 102   <span class="c"># Merge files...</span>
 103   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Keys</span>}<span class="s">)</span> <span class="s">{</span>
 104     <span class="i">MergeColumnValuesUsingKeys</span><span class="s">(</span>\<span class="i">*NEWTEXTFILE</span><span class="s">)</span><span class="sc">;</span>
 105   <span class="s">}</span>
 106   <span class="k">else</span> <span class="s">{</span>
 107     <span class="i">MergeColumnValues</span><span class="s">(</span>\<span class="i">*NEWTEXTFILE</span><span class="s">)</span><span class="sc">;</span>
 108   <span class="s">}</span>
 109 
 110   <span class="c"># Close all opened files...</span>
 111   <span class="k">close</span> <span class="w">NEWTEXTFILE</span><span class="sc">;</span>
 112   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 113     <span class="k">close</span> <span class="i">$TextFilesInfo</span>{<span class="w">FileHandle</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 114   <span class="s">}</span>
 115 
 116 <span class="s">}</span>
 117 
 118 <span class="c"># Merge all the column values...</span>
<a name="MergeColumnValues-"></a> 119 <span class="k">sub </span><span class="m">MergeColumnValues</span> <span class="s">{</span>
 120   <span class="k">my</span><span class="s">(</span><span class="i">$NewTextFileRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 121   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Line</span><span class="cm">,</span> <span class="i">$InDelim</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$ColNum</span><span class="cm">,</span> <span class="i">@LineWords</span><span class="cm">,</span> <span class="i">@File1LineWords</span><span class="cm">,</span> <span class="i">@ColValues</span><span class="s">)</span><span class="sc">;</span>
 122 
 123   <span class="k">while</span> <span class="s">(</span><span class="i">$Line</span> = <span class="i">GetTextLine</span><span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">FileHandle</span>}[<span class="n">0</span>]<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 124     <span class="i">$InDelim</span> = <span class="i">$TextFilesInfo</span>{<span class="w">InDelim</span>}[<span class="n">0</span>]<span class="sc">;</span>
 125     <span class="i">@ColValues</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 126 
 127     <span class="c">#Collect column values from first file before the merge point...</span>
 128     <span class="i">@File1LineWords</span> = <span class="i">quotewords</span><span class="s">(</span><span class="i">$InDelim</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span>
 129     <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part1ColNums</span>}}<span class="s">)</span> <span class="s">{</span>
 130       <span class="i">$Value</span> = <span class="s">(</span><span class="i">$ColNum</span> &lt; <span class="i">@File1LineWords</span><span class="s">)</span> ? <span class="i">$File1LineWords</span>[<span class="i">$ColNum</span>] <span class="co">:</span> <span class="q">&quot;&quot;</span><span class="sc">;</span>
 131       <span class="k">push</span> <span class="i">@ColValues</span><span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span>
 132     <span class="s">}</span>
 133 
 134     <span class="c">#Collect column values from other text files...</span>
 135     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 136       <span class="i">$InDelim</span> = <span class="i">$TextFilesInfo</span>{<span class="w">InDelim</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 137       <span class="k">if</span> <span class="s">(</span><span class="i">$Line</span> = <span class="i">GetTextLine</span><span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">FileHandle</span>}[<span class="i">$Index</span>]<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 138         <span class="i">@LineWords</span> = <span class="i">quotewords</span><span class="s">(</span><span class="i">$InDelim</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span>
 139         <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span>
 140           <span class="i">$Value</span> = <span class="s">(</span><span class="i">$ColNum</span> &lt; <span class="i">@LineWords</span><span class="s">)</span> ? <span class="i">$LineWords</span>[<span class="i">$ColNum</span>] <span class="co">:</span> <span class="q">&quot;&quot;</span><span class="sc">;</span>
 141           <span class="k">push</span> <span class="i">@ColValues</span><span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span>
 142         <span class="s">}</span>
 143       <span class="s">}</span>
 144     <span class="s">}</span>
 145 
 146     <span class="c">#Collect column labels from first file after the merge point...</span>
 147     <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part2ColNums</span>}}<span class="s">)</span> <span class="s">{</span>
 148       <span class="i">$Value</span> = <span class="s">(</span><span class="i">$ColNum</span> &lt; <span class="i">@File1LineWords</span><span class="s">)</span> ? <span class="i">$File1LineWords</span>[<span class="i">$ColNum</span>] <span class="co">:</span> <span class="q">&quot;&quot;</span><span class="sc">;</span>
 149       <span class="k">push</span> <span class="i">@ColValues</span><span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span>
 150     <span class="s">}</span>
 151 
 152     <span class="c"># Write it out...</span>
 153     <span class="i">$Line</span> = <span class="i">JoinWords</span><span class="s">(</span>\<span class="i">@ColValues</span><span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">OutDelim</span>}<span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">OutQuote</span>}<span class="s">)</span><span class="sc">;</span>
 154     <span class="k">print</span> <span class="i">$NewTextFileRef</span> <span class="q">&quot;$Line\n&quot;</span><span class="sc">;</span>
 155   <span class="s">}</span>
 156 
 157 <span class="s">}</span>
 158 
 159 <span class="c"># Merge column values using keys...</span>
<a name="MergeColumnValuesUsingKeys-"></a> 160 <span class="k">sub </span><span class="m">MergeColumnValuesUsingKeys</span> <span class="s">{</span>
 161   <span class="k">my</span><span class="s">(</span><span class="i">$NewTextFileRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 162   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$InDelim</span><span class="cm">,</span> <span class="i">$Line</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$ColNum</span><span class="cm">,</span> <span class="i">$KeyColNum</span><span class="cm">,</span> <span class="i">$KeyColValue</span><span class="cm">,</span> <span class="i">@LineWords</span><span class="cm">,</span> <span class="i">@ColValues</span><span class="cm">,</span> <span class="i">@File1LineWords</span><span class="cm">,</span> <span class="i">@TextFilesKeysToLinesMap</span><span class="s">)</span><span class="sc">;</span>
 163 
 164   <span class="i">@TextFilesKeysToLinesMap</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 165 
 166   <span class="c"># Retrieve text lines from all the files except for the first file...</span>
 167   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 168     <span class="i">%</span>{<span class="i">$TextFilesKeysToLinesMap</span>[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 169 
 170     <span class="i">$InDelim</span> = <span class="i">$TextFilesInfo</span>{<span class="w">InDelim</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 171     <span class="i">$KeyColNum</span> = <span class="i">$TextFilesInfo</span>{<span class="w">KeysToUse</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 172 
 173     <span class="k">while</span> <span class="s">(</span><span class="i">$Line</span> = <span class="i">GetTextLine</span><span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">FileHandle</span>}[<span class="i">$Index</span>]<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 174       <span class="i">@LineWords</span> = <span class="i">quotewords</span><span class="s">(</span><span class="i">$InDelim</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span>
 175       <span class="k">if</span> <span class="s">(</span><span class="i">$KeyColNum</span> &lt; <span class="i">@LineWords</span><span class="s">)</span> <span class="s">{</span>
 176         <span class="i">$KeyColValue</span> = <span class="i">$LineWords</span>[<span class="i">$KeyColNum</span>]<span class="sc">;</span>
 177         <span class="k">if</span> <span class="s">(</span><span class="k">length</span><span class="s">(</span><span class="i">$KeyColValue</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 178           <span class="k">if</span> <span class="s">(</span><span class="k">exists</span><span class="s">(</span><span class="i">$TextFilesKeysToLinesMap</span>[<span class="i">$Index</span>]{<span class="i">$KeyColValue</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 179             <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring line, $Line, in text file $TextFilesList[$Index]: Column key value, $KeyColValue, already exists\n&quot;</span><span class="sc">;</span>
 180           <span class="s">}</span>
 181           <span class="k">else</span> <span class="s">{</span>
 182             <span class="i">@</span>{<span class="i">$TextFilesKeysToLinesMap</span>[<span class="i">$Index</span>]{<span class="i">$KeyColValue</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 183             <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesKeysToLinesMap</span>[<span class="i">$Index</span>]{<span class="i">$KeyColValue</span>}}<span class="cm">,</span> <span class="i">@LineWords</span><span class="sc">;</span>
 184           <span class="s">}</span>
 185         <span class="s">}</span>
 186       <span class="s">}</span>
 187     <span class="s">}</span>
 188   <span class="s">}</span>
 189 
 190   <span class="k">while</span> <span class="s">(</span><span class="i">$Line</span> = <span class="i">GetTextLine</span><span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">FileHandle</span>}[<span class="n">0</span>]<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 191     <span class="i">$InDelim</span> = <span class="i">$TextFilesInfo</span>{<span class="w">InDelim</span>}[<span class="n">0</span>]<span class="sc">;</span>
 192 
 193     <span class="i">@ColValues</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 194     <span class="i">@File1LineWords</span> = <span class="i">quotewords</span><span class="s">(</span><span class="i">$InDelim</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span>
 195 
 196     <span class="i">$KeyColNum</span> = <span class="i">$TextFilesInfo</span>{<span class="w">KeysToUse</span>}[<span class="n">0</span>]<span class="sc">;</span>
 197     <span class="i">$KeyColValue</span> = <span class="i">$File1LineWords</span>[<span class="i">$KeyColNum</span>]<span class="sc">;</span>
 198 
 199     <span class="c">#Collect column values from first file before the merge point...</span>
 200     <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part1ColNums</span>}}<span class="s">)</span> <span class="s">{</span>
 201       <span class="i">$Value</span> = <span class="s">(</span><span class="i">$ColNum</span> &lt; <span class="i">@File1LineWords</span><span class="s">)</span> ? <span class="i">$File1LineWords</span>[<span class="i">$ColNum</span>] <span class="co">:</span> <span class="q">&quot;&quot;</span><span class="sc">;</span>
 202       <span class="k">push</span> <span class="i">@ColValues</span><span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span>
 203     <span class="s">}</span>
 204 
 205     <span class="c">#Collect column values from other text files...</span>
 206     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 207       <span class="i">@LineWords</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 208       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span><span class="s">(</span><span class="i">$TextFilesKeysToLinesMap</span>[<span class="i">$Index</span>]{<span class="i">$KeyColValue</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 209         <span class="k">push</span> <span class="i">@LineWords</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$TextFilesKeysToLinesMap</span>[<span class="i">$Index</span>]{<span class="i">$KeyColValue</span>}}<span class="sc">;</span>
 210       <span class="s">}</span>
 211       <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span>
 212         <span class="i">$Value</span> = <span class="s">(</span><span class="i">$ColNum</span> &lt; <span class="i">@LineWords</span><span class="s">)</span> ? <span class="i">$LineWords</span>[<span class="i">$ColNum</span>] <span class="co">:</span> <span class="q">&quot;&quot;</span><span class="sc">;</span>
 213         <span class="k">push</span> <span class="i">@ColValues</span><span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span>
 214       <span class="s">}</span>
 215     <span class="s">}</span>
 216 
 217     <span class="c">#Collect column labels from first file after the merge point...</span>
 218     <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part2ColNums</span>}}<span class="s">)</span> <span class="s">{</span>
 219       <span class="i">$Value</span> = <span class="s">(</span><span class="i">$ColNum</span> &lt; <span class="i">@File1LineWords</span><span class="s">)</span> ? <span class="i">$File1LineWords</span>[<span class="i">$ColNum</span>] <span class="co">:</span> <span class="q">&quot;&quot;</span><span class="sc">;</span>
 220       <span class="k">push</span> <span class="i">@ColValues</span><span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span>
 221     <span class="s">}</span>
 222 
 223     <span class="c"># Write it out...</span>
 224     <span class="i">$Line</span> = <span class="i">JoinWords</span><span class="s">(</span>\<span class="i">@ColValues</span><span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">OutDelim</span>}<span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">OutQuote</span>}<span class="s">)</span><span class="sc">;</span>
 225     <span class="k">print</span> <span class="i">$NewTextFileRef</span> <span class="q">&quot;$Line\n&quot;</span><span class="sc">;</span>
 226   <span class="s">}</span>
 227 
 228 <span class="s">}</span>
 229 
 230 <span class="c"># Write out column labels for new merged text file...</span>
<a name="WriteNewTextFileColumnLabels-"></a> 231 <span class="k">sub </span><span class="m">WriteNewTextFileColumnLabels</span> <span class="s">{</span>
 232   <span class="k">my</span><span class="s">(</span><span class="i">$NewTextFileRef</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 233   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Line</span><span class="cm">,</span> <span class="i">$ColNum</span><span class="cm">,</span> <span class="i">@ColLabels</span><span class="s">)</span><span class="sc">;</span>
 234 
 235   <span class="c">#Write out column labels for the merged text file...</span>
 236   <span class="i">@ColLabels</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 237 
 238   <span class="c">#Collect column labels from first file before the merge point...</span>
 239   <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part1ColNums</span>}}<span class="s">)</span> <span class="s">{</span>
 240     <span class="k">push</span> <span class="i">@ColLabels</span><span class="cm">,</span> <span class="i">$TextFilesInfo</span>{<span class="w">ColToMergeNumToLabelMap</span>}[<span class="n">0</span>]{<span class="i">$ColNum</span>}<span class="sc">;</span>
 241   <span class="s">}</span>
 242 
 243   <span class="c">#Collect column labels from other text files...</span>
 244   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 245     <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span>
 246       <span class="k">push</span> <span class="i">@ColLabels</span><span class="cm">,</span> <span class="i">$TextFilesInfo</span>{<span class="w">ColToMergeNumToLabelMap</span>}[<span class="i">$Index</span>]{<span class="i">$ColNum</span>}<span class="sc">;</span>
 247     <span class="s">}</span>
 248   <span class="s">}</span>
 249 
 250   <span class="c">#Collect column labels from first file after the merge point...</span>
 251   <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part2ColNums</span>}}<span class="s">)</span> <span class="s">{</span>
 252     <span class="k">push</span> <span class="i">@ColLabels</span><span class="cm">,</span> <span class="i">$TextFilesInfo</span>{<span class="w">ColToMergeNumToLabelMap</span>}[<span class="n">0</span>]{<span class="i">$ColNum</span>}<span class="sc">;</span>
 253   <span class="s">}</span>
 254 
 255   <span class="c">#Write it out...</span>
 256   <span class="i">$Line</span> = <span class="i">JoinWords</span><span class="s">(</span>\<span class="i">@ColLabels</span><span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">OutDelim</span>}<span class="cm">,</span> <span class="i">$OptionsInfo</span>{<span class="w">OutQuote</span>}<span class="s">)</span><span class="sc">;</span>
 257   <span class="k">print</span> <span class="i">NEWTEXTFILE</span> <span class="q">&quot;$Line\n&quot;</span><span class="sc">;</span>
 258 <span class="s">}</span>
 259 
 260 <span class="c"># Retrieve text file columns and keys information for specified options...</span>
<a name="RetrieveColumnsAndKeysInfo-"></a> 261 <span class="k">sub </span><span class="m">RetrieveColumnsAndKeysInfo</span> <span class="s">{</span>
 262   <span class="i">ProcessColumnsInfo</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 263 
 264   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Keys</span>}<span class="s">)</span> <span class="s">{</span>
 265     <span class="i">ProcessKeysInfo</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 266   <span class="s">}</span>
 267 
 268   <span class="i">ProcessStartColInfo</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 269 <span class="s">}</span>
 270 
 271 <span class="c"># Process specified columns...</span>
<a name="ProcessColumnsInfo-"></a> 272 <span class="k">sub </span><span class="m">ProcessColumnsInfo</span> <span class="s">{</span>
 273   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$SpecifiedColNum</span><span class="cm">,</span> <span class="i">$Values</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$ColNum</span><span class="cm">,</span> <span class="i">$ColLabel</span><span class="cm">,</span> <span class="i">@Words</span><span class="s">)</span><span class="sc">;</span>
 274 
 275   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColSpecified</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 276   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 277   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMergeNumToLabelMap</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 278 
 279   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 280 
 281     <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColSpecified</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 282 
 283     <span class="i">$Values</span> = <span class="q">&quot;all&quot;</span><span class="sc">;</span>
 284     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Columns</span>}<span class="s">)</span> <span class="s">{</span>
 285       <span class="i">$Values</span> = <span class="i">$OptionsInfo</span>{<span class="w">ColValues</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 286     <span class="s">}</span>
 287 
 288     <span class="k">if</span> <span class="s">(</span><span class="i">$Values</span> =~ <span class="q">/all/i</span><span class="s">)</span> <span class="s">{</span>
 289       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^colnum$/i</span><span class="s">)</span> <span class="s">{</span>
 290         <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$TextFilesInfo</span>{<span class="w">ColCount</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
 291           <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColSpecified</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">$ColNum</span><span class="sc">;</span>
 292         <span class="s">}</span>
 293       <span class="s">}</span>
 294       <span class="k">else</span> <span class="s">{</span>
 295         <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColSpecified</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColLabels</span>}[<span class="i">$Index</span>]}<span class="sc">;</span>
 296       <span class="s">}</span>
 297     <span class="s">}</span>
 298     <span class="k">else</span> <span class="s">{</span>
 299       <span class="i">@Words</span> = <span class="k">split</span> <span class="q">&quot;,&quot;</span><span class="cm">,</span> <span class="i">$Values</span><span class="sc">;</span>
 300       <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColSpecified</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@Words</span><span class="sc">;</span>
 301     <span class="s">}</span>
 302 
 303     <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 304     <span class="i">%</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMergeNumToLabelMap</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 305 
 306     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^collabel$/i</span><span class="s">)</span> <span class="s">{</span>
 307       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColSpecified</span>}[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span>
 308         <span class="i">$ColLabel</span> = <span class="i">$TextFilesInfo</span>{<span class="w">ColSpecified</span>}[<span class="i">$Index</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
 309         <span class="k">if</span> <span class="s">(</span><span class="k">exists</span><span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">ColLabelToNumMap</span>}[<span class="i">$Index</span>]{<span class="i">$ColLabel</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 310           <span class="i">$ColNum</span> = <span class="i">$TextFilesInfo</span>{<span class="w">ColLabelToNumMap</span>}[<span class="i">$Index</span>]{<span class="i">$ColLabel</span>}<span class="sc">;</span>
 311           <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">$ColNum</span><span class="sc">;</span>
 312           <span class="i">$TextFilesInfo</span>{<span class="w">ColToMergeNumToLabelMap</span>}[<span class="i">$Index</span>]{<span class="i">$ColNum</span>} = <span class="i">$ColLabel</span><span class="sc">;</span>
 313         <span class="s">}</span>
 314         <span class="k">else</span> <span class="s">{</span>
 315           <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring value, $ColLabel, specified using \&quot;-c --column\&quot; option: column name doesn&#39;t exist in  $TextFilesList[$Index]  \n&quot;</span><span class="sc">;</span>
 316         <span class="s">}</span>
 317       <span class="s">}</span>
 318     <span class="s">}</span>
 319     <span class="k">else</span> <span class="s">{</span>
 320       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColSpecified</span>}[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span>
 321         <span class="i">$SpecifiedColNum</span> = <span class="i">$TextFilesInfo</span>{<span class="w">ColSpecified</span>}[<span class="i">$Index</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
 322         <span class="k">if</span> <span class="s">(</span><span class="i">$SpecifiedColNum</span> &gt; <span class="n">0</span> &amp;&amp; <span class="i">$SpecifiedColNum</span> &lt;= <span class="i">$TextFilesInfo</span>{<span class="w">ColCount</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
 323           <span class="i">$ColNum</span> = <span class="i">$SpecifiedColNum</span> - <span class="n">1</span><span class="sc">;</span>
 324           <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">$ColNum</span><span class="sc">;</span>
 325           <span class="i">$TextFilesInfo</span>{<span class="w">ColToMergeNumToLabelMap</span>}[<span class="i">$Index</span>]{<span class="i">$ColNum</span>} = <span class="i">$TextFilesInfo</span>{<span class="w">ColLabels</span>}[<span class="i">$Index</span>][<span class="i">$ColNum</span>]<span class="sc">;</span>
 326         <span class="s">}</span>
 327         <span class="k">else</span> <span class="s">{</span>
 328           <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring value, $SpecifiedColNum, specified using \&quot;-c --column\&quot; option: column number doesn&#39;t exist in  $TextFilesList[$Index]  \n&quot;</span><span class="sc">;</span>
 329         <span class="s">}</span>
 330       <span class="s">}</span>
 331     <span class="s">}</span>
 332     <span class="k">my</span> <span class="s">(</span><span class="i">@ColToMergeSorted</span><span class="s">)</span> = <span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> &lt;=&gt; <span class="i">$b</span> <span class="s">}</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]}<span class="sc">;</span>
 333     <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 334     <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@ColToMergeSorted</span><span class="sc">;</span>
 335   <span class="s">}</span>
 336 <span class="s">}</span>
 337 
 338 <span class="c"># Process specified key column values...</span>
<a name="ProcessKeysInfo-"></a> 339 <span class="k">sub </span><span class="m">ProcessKeysInfo</span> <span class="s">{</span>
 340   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">$ColLabel</span><span class="cm">,</span> <span class="i">$ColNum</span><span class="s">)</span><span class="sc">;</span>
 341 
 342   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">KeysSpecified</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 343   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">KeysToUse</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 344 
 345   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 346     <span class="i">$Key</span> = <span class="i">$OptionsInfo</span>{<span class="w">KeyValues</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 347 
 348     <span class="i">$TextFilesInfo</span>{<span class="w">KeysSpecified</span>}[<span class="i">$Index</span>] = <span class="i">$Key</span><span class="sc">;</span>
 349     <span class="i">$TextFilesInfo</span>{<span class="w">KeysToUse</span>}[<span class="i">$Index</span>] = <span class="n">-1</span><span class="sc">;</span>
 350 
 351     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^collabel$/i</span><span class="s">)</span> <span class="s">{</span>
 352       <span class="i">$ColLabel</span> = <span class="i">$Key</span><span class="sc">;</span>
 353       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span><span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">ColLabelToNumMap</span>}[<span class="i">$Index</span>]{<span class="i">$ColLabel</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 354         <span class="i">$TextFilesInfo</span>{<span class="w">KeysToUse</span>}[<span class="i">$Index</span>] =  <span class="i">$TextFilesInfo</span>{<span class="w">ColLabelToNumMap</span>}[<span class="i">$Index</span>]{<span class="i">$ColLabel</span>}<span class="sc">;</span>
 355       <span class="s">}</span>
 356       <span class="k">else</span> <span class="s">{</span>
 357         <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring value, $ColLabel, specified using \&quot;-k --keys\&quot; option: column name doesn&#39;t exist in  $TextFilesList[$Index]  \n&quot;</span><span class="sc">;</span>
 358       <span class="s">}</span>
 359     <span class="s">}</span>
 360     <span class="k">else</span> <span class="s">{</span>
 361       <span class="i">$ColNum</span> = <span class="i">$Key</span><span class="sc">;</span>
 362       <span class="k">if</span> <span class="s">(</span><span class="i">$ColNum</span> &gt; <span class="n">0</span> &amp;&amp; <span class="i">$ColNum</span> &lt;= <span class="i">$TextFilesInfo</span>{<span class="w">ColCount</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
 363         <span class="i">$TextFilesInfo</span>{<span class="w">KeysToUse</span>}[<span class="i">$Index</span>] = <span class="i">$ColNum</span> - <span class="n">1</span><span class="sc">;</span>
 364       <span class="s">}</span>
 365       <span class="k">else</span> <span class="s">{</span>
 366         <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring value, $ColNum, specified using \&quot;-k --keys\&quot; option: column number doesn&#39;t exist in  $TextFilesList[$Index]  \n&quot;</span><span class="sc">;</span>
 367       <span class="s">}</span>
 368     <span class="s">}</span>
 369   <span class="s">}</span>
 370 
 371   <span class="c"># Modify columns to merge list to make sure the columns identified by key are taken off the list</span>
 372   <span class="c"># except for the first text file...</span>
 373   <span class="k">my</span><span class="s">(</span><span class="i">@ColToMergeFiltered</span><span class="s">)</span><span class="sc">;</span>
 374 
 375   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 376     <span class="i">@ColToMergeFiltered</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 377     <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span>
 378       <span class="k">if</span> <span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">KeysToUse</span>}[<span class="i">$Index</span>] != <span class="i">$ColNum</span><span class="s">)</span> <span class="s">{</span>
 379         <span class="k">push</span> <span class="i">@ColToMergeFiltered</span><span class="cm">,</span> <span class="i">$ColNum</span><span class="sc">;</span>
 380       <span class="s">}</span>
 381     <span class="s">}</span>
 382     <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 383     <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@ColToMergeFiltered</span><span class="sc">;</span>
 384   <span class="s">}</span>
 385 <span class="s">}</span>
 386 
 387 <span class="c"># Process specified start column value...</span>
<a name="ProcessStartColInfo-"></a> 388 <span class="k">sub </span><span class="m">ProcessStartColInfo</span> <span class="s">{</span>
 389   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$ColNum</span><span class="cm">,</span> <span class="i">$StartColNum</span><span class="cm">,</span> <span class="i">$Part1StartColNum</span><span class="cm">,</span> <span class="i">$Part1EndColNum</span><span class="cm">,</span> <span class="i">$Part2StartColNum</span><span class="cm">,</span> <span class="i">$Part2EndColNum</span><span class="cm">,</span> <span class="i">$BeforeStartColNum</span><span class="cm">,</span> <span class="i">$AfterStartColNum</span><span class="cm">,</span> <span class="i">$FirstColNum</span><span class="cm">,</span> <span class="i">$LastColNum</span><span class="cm">,</span> <span class="i">$FirstIndex</span><span class="cm">,</span> <span class="i">$LastIndex</span><span class="s">)</span><span class="sc">;</span>
 390 
 391   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part1ColNums</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 392   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part2ColNums</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 393 
 394   <span class="i">$StartColNum</span> = <span class="q">&quot;last&quot;</span><span class="sc">;</span>
 395   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">StartCol</span>}<span class="s">)</span> <span class="s">{</span>
 396     <span class="k">if</span> <span class="s">(</span><span class="k">length</span><span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">StartCol</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 397       <span class="i">$StartColNum</span> = <span class="i">$OptionsInfo</span>{<span class="w">StartCol</span>}
 398     <span class="s">}</span>
 399   <span class="s">}</span>
 400 
 401   <span class="k">if</span> <span class="s">(</span><span class="i">$StartColNum</span> !~ <span class="q">/^last$/i</span><span class="s">)</span> <span class="s">{</span>
 402     <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} =~ <span class="q">/^collabel$/i</span><span class="s">)</span> <span class="s">{</span>
 403       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span><span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">ColLabelToNumMap</span>}[<span class="n">0</span>]{<span class="i">$StartColNum</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 404         <span class="i">$StartColNum</span> = <span class="i">$TextFilesInfo</span>{<span class="w">ColLabelToNumMap</span>}[<span class="n">0</span>]{<span class="i">$StartColNum</span>}<span class="sc">;</span>
 405       <span class="s">}</span>
 406       <span class="k">else</span> <span class="s">{</span>
 407         <span class="k">die</span> <span class="q">&quot;Error: Invalid value $StartColNum specified using \&quot;-s --startcol\&quot; option: column name doesn&#39;t exist in  $TextFilesList[0]  \n&quot;</span><span class="sc">;</span>
 408       <span class="s">}</span>
 409     <span class="s">}</span>
 410     <span class="k">else</span> <span class="s">{</span>
 411       <span class="k">if</span> <span class="s">(</span><span class="i">$StartColNum</span> &gt; <span class="n">0</span> &amp;&amp; <span class="i">$StartColNum</span> &lt;= <span class="i">$TextFilesInfo</span>{<span class="w">ColCount</span>}[<span class="n">0</span>]<span class="s">)</span> <span class="s">{</span>
 412         <span class="i">$StartColNum</span> -= <span class="n">1</span><span class="sc">;</span>
 413       <span class="s">}</span>
 414       <span class="k">else</span> <span class="s">{</span>
 415         <span class="k">die</span> <span class="q">&quot;Error: Invalid value $StartColNum specified using \&quot;-s --startcol\&quot; option: column number doesn&#39;t exist in  $TextFilesList[0]  \n&quot;</span><span class="sc">;</span>
 416       <span class="s">}</span>
 417     <span class="s">}</span>
 418   <span class="s">}</span>
 419   <span class="k">else</span> <span class="s">{</span>
 420     <span class="i">$StartColNum</span> = <span class="i">$TextFilesInfo</span>{<span class="w">ColCount</span>}[<span class="n">0</span>] - <span class="n">1</span><span class="sc">;</span>
 421   <span class="s">}</span>
 422 
 423   <span class="c"># Make sure StartColNum is present on the list of columns to merge for the first text file...</span>
 424   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span><span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">ColToMergeNumToLabelMap</span>}[<span class="n">0</span>]{<span class="i">$StartColNum</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 425     <span class="k">die</span> <span class="q">&quot;Error: Invalid value $StartColNum specified using \&quot;-s --startcol\&quot; option: doesn&#39;t exist in the specified lists of columns to merge for  $TextFilesList[0]  \n&quot;</span><span class="sc">;</span>
 426   <span class="s">}</span>
 427 
 428   <span class="c"># Find out the column number before and after StartColNum in first text file...</span>
 429   <span class="i">$BeforeStartColNum</span> = <span class="i">$StartColNum</span><span class="sc">;</span>
 430   <span class="i">$AfterStartColNum</span> = <span class="i">$StartColNum</span><span class="sc">;</span>
 431 
 432   <span class="i">$FirstIndex</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$LastIndex</span> = <span class="i">$#</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="n">0</span>]}<span class="sc">;</span>
 433 
 434   <span class="i">$FirstColNum</span> = <span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="n">0</span>][<span class="i">$FirstIndex</span>]<span class="sc">;</span>
 435   <span class="i">$LastColNum</span> = <span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="n">0</span>][<span class="i">$LastIndex</span>]<span class="sc">;</span>
 436 
 437   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$LastIndex</span><span class="s">)</span> <span class="s">{</span>
 438     <span class="k">if</span> <span class="s">(</span><span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="n">0</span>][<span class="i">$Index</span>] == <span class="i">$StartColNum</span><span class="s">)</span> <span class="s">{</span>
 439       <span class="i">$BeforeStartColNum</span> = <span class="s">(</span><span class="s">(</span><span class="i">$Index</span> -<span class="n">1</span><span class="s">)</span> &gt;= <span class="i">$FirstIndex</span><span class="s">)</span> ? <span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="n">0</span>][<span class="i">$Index</span> - <span class="n">1</span>] <span class="co">:</span> <span class="s">(</span><span class="i">$FirstColNum</span> - <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 440       <span class="i">$AfterStartColNum</span> = <span class="s">(</span><span class="s">(</span><span class="i">$Index</span> + <span class="n">1</span><span class="s">)</span> &lt;= <span class="i">$LastIndex</span><span class="s">)</span> ? <span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="n">0</span>][<span class="i">$Index</span> + <span class="n">1</span>] <span class="co">:</span> <span class="s">(</span><span class="i">$LastColNum</span> + <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 441     <span class="s">}</span>
 442   <span class="s">}</span>
 443 
 444   <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">StartColMode</span>} =~ <span class="q">/^after$/i</span><span class="s">)</span> <span class="s">{</span>
 445     <span class="i">$Part1StartColNum</span> = <span class="i">$FirstColNum</span><span class="sc">;</span> <span class="i">$Part1EndColNum</span> = <span class="i">$StartColNum</span><span class="sc">;</span>
 446     <span class="i">$Part2StartColNum</span> = <span class="i">$AfterStartColNum</span><span class="sc">;</span> <span class="i">$Part2EndColNum</span> = <span class="i">$LastColNum</span><span class="sc">;</span>
 447   <span class="s">}</span>
 448   <span class="k">else</span> <span class="s">{</span>
 449     <span class="i">$Part1StartColNum</span> = <span class="i">$FirstColNum</span><span class="sc">;</span> <span class="i">$Part1EndColNum</span> = <span class="i">$BeforeStartColNum</span><span class="sc">;</span>
 450     <span class="i">$Part2StartColNum</span> = <span class="i">$StartColNum</span><span class="sc">;</span> <span class="i">$Part2EndColNum</span> = <span class="i">$LastColNum</span><span class="sc">;</span>
 451   <span class="s">}</span>
 452 
 453   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part1ColNums</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 454   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part2ColNums</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 455 
 456   <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="n">0</span>]}<span class="s">)</span> <span class="s">{</span>
 457     <span class="i">$ColNum</span> = <span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="n">0</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
 458     <span class="k">if</span> <span class="s">(</span><span class="i">$ColNum</span> &gt;= <span class="i">$Part1StartColNum</span> &amp;&amp; <span class="i">$ColNum</span> &lt;= <span class="i">$Part1EndColNum</span><span class="s">)</span> <span class="s">{</span>
 459       <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part1ColNums</span>}}<span class="cm">,</span> <span class="i">$ColNum</span><span class="sc">;</span>
 460     <span class="s">}</span>
 461   <span class="s">}</span>
 462 
 463   <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="n">0</span>]}<span class="s">)</span> <span class="s">{</span>
 464     <span class="i">$ColNum</span> = <span class="i">$TextFilesInfo</span>{<span class="w">ColToMerge</span>}[<span class="n">0</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
 465     <span class="k">if</span> <span class="s">(</span><span class="i">$ColNum</span> &gt;= <span class="i">$Part2StartColNum</span> &amp;&amp; <span class="i">$ColNum</span> &lt;= <span class="i">$Part2EndColNum</span><span class="s">)</span> <span class="s">{</span>
 466       <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">File1Part2ColNums</span>}}<span class="cm">,</span> <span class="i">$ColNum</span><span class="sc">;</span>
 467     <span class="s">}</span>
 468   <span class="s">}</span>
 469 
 470 <span class="s">}</span>
 471 
 472 <span class="c"># Retrieve information about input text files...</span>
<a name="RetrieveTextFilesInfo-"></a> 473 <span class="k">sub </span><span class="m">RetrieveTextFilesInfo</span> <span class="s">{</span>
 474   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$TextFile</span><span class="cm">,</span> <span class="i">$FileDir</span><span class="cm">,</span> <span class="i">$FileName</span><span class="cm">,</span> <span class="i">$FileExt</span><span class="cm">,</span> <span class="i">$InDelim</span><span class="cm">,</span> <span class="i">$Line</span><span class="cm">,</span> <span class="i">$ColNum</span><span class="cm">,</span> <span class="i">$ColLabel</span><span class="cm">,</span> <span class="i">$FileNotOkayCount</span><span class="cm">,</span> <span class="i">@ColLabels</span><span class="cm">,</span><span class="s">)</span><span class="sc">;</span>
 475 
 476   <span class="i">%TextFilesInfo</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 477 
 478   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">FileOkay</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 479   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColCount</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 480   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColLabels</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 481   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColLabelToNumMap</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 482   <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">InDelim</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 483 
 484   <span class="i">$FileNotOkayCount</span> = <span class="n">0</span><span class="sc">;</span>
 485 
 486   <span class="j">FILELIST:</span> <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 487     <span class="i">$TextFile</span> = <span class="i">$TextFilesList</span>[<span class="i">$Index</span>]<span class="sc">;</span>
 488 
 489     <span class="i">$TextFilesInfo</span>{<span class="w">FileOkay</span>}[<span class="i">$Index</span>] = <span class="n">0</span><span class="sc">;</span>
 490     <span class="i">$TextFilesInfo</span>{<span class="w">ColCount</span>}[<span class="i">$Index</span>] = <span class="n">0</span><span class="sc">;</span>
 491     <span class="i">$TextFilesInfo</span>{<span class="w">InDelim</span>}[<span class="i">$Index</span>] = <span class="q">&quot;&quot;</span><span class="sc">;</span>
 492 
 493     <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColLabels</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 494     <span class="i">%</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColLabelToNumMap</span>}[<span class="i">$Index</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 495 
 496     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">-e</span> <span class="i">$TextFile</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 497       <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $TextFile: It doesn&#39;t exist\n&quot;</span><span class="sc">;</span>
 498       <span class="i">$FileNotOkayCount</span>++<span class="sc">;</span>
 499       <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
 500     <span class="s">}</span>
 501     <span class="k">if</span> <span class="s">(</span>!<span class="i">CheckFileType</span><span class="s">(</span><span class="i">$TextFile</span><span class="cm">,</span> <span class="q">&quot;csv tsv&quot;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 502       <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $TextFile: It&#39;s not a csv or tsv file\n&quot;</span><span class="sc">;</span>
 503       <span class="i">$FileNotOkayCount</span>++<span class="sc">;</span>
 504       <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
 505     <span class="s">}</span>
 506     <span class="s">(</span><span class="i">$FileDir</span><span class="cm">,</span> <span class="i">$FileName</span><span class="cm">,</span> <span class="i">$FileExt</span><span class="s">)</span> = <span class="i">ParseFileName</span><span class="s">(</span><span class="i">$TextFile</span><span class="s">)</span><span class="sc">;</span>
 507     <span class="k">if</span> <span class="s">(</span><span class="i">$FileExt</span> =~ <span class="q">/^tsv$/i</span><span class="s">)</span> <span class="s">{</span>
 508       <span class="i">$InDelim</span> = <span class="q">&quot;\t&quot;</span><span class="sc">;</span>
 509     <span class="s">}</span>
 510     <span class="k">else</span> <span class="s">{</span>
 511       <span class="i">$InDelim</span> = <span class="q">&quot;\,&quot;</span><span class="sc">;</span>
 512       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">InDelim</span>} !~ <span class="q">/^(comma|semicolon)$/i</span><span class="s">)</span> <span class="s">{</span>
 513         <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $TextFile: The value specified, $OptionsInfo{InDelim}, for option \&quot;--indelim\&quot; is not valid for csv files\n&quot;</span><span class="sc">;</span>
 514         <span class="i">$FileNotOkayCount</span>++<span class="sc">;</span>
 515         <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
 516       <span class="s">}</span>
 517       <span class="k">if</span> <span class="s">(</span><span class="i">$OptionsInfo</span>{<span class="w">InDelim</span>} =~ <span class="q">/^semicolon$/i</span><span class="s">)</span> <span class="s">{</span>
 518         <span class="i">$InDelim</span> = <span class="q">&quot;\;&quot;</span><span class="sc">;</span>
 519       <span class="s">}</span>
 520     <span class="s">}</span>
 521 
 522     <span class="k">if</span> <span class="s">(</span>!<span class="k">open</span> <span class="w">TEXTFILE</span><span class="cm">,</span> <span class="q">&quot;$TextFile&quot;</span><span class="s">)</span> <span class="s">{</span>
 523       <span class="k">warn</span> <span class="q">&quot;Warning: Ignoring file $TextFile: Couldn&#39;t open it: $! \n&quot;</span><span class="sc">;</span>
 524       <span class="i">$FileNotOkayCount</span>++<span class="sc">;</span>
 525       <span class="k">next</span> <span class="j">FILELIST</span><span class="sc">;</span>
 526     <span class="s">}</span>
 527 
 528     <span class="i">$Line</span> = <span class="i">GetTextLine</span><span class="s">(</span>\<span class="i">*TEXTFILE</span><span class="s">)</span><span class="sc">;</span>
 529     <span class="i">@ColLabels</span> = <span class="i">quotewords</span><span class="s">(</span><span class="i">$InDelim</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="i">$Line</span><span class="s">)</span><span class="sc">;</span>
 530     <span class="k">close</span> <span class="w">TEXTFILE</span><span class="sc">;</span>
 531 
 532     <span class="i">$TextFilesInfo</span>{<span class="w">FileOkay</span>}[<span class="i">$Index</span>] = <span class="n">1</span><span class="sc">;</span>
 533     <span class="i">$TextFilesInfo</span>{<span class="w">InDelim</span>}[<span class="i">$Index</span>] = <span class="i">$InDelim</span><span class="sc">;</span>
 534 
 535     <span class="i">$TextFilesInfo</span>{<span class="w">ColCount</span>}[<span class="i">$Index</span>] = <span class="i">@ColLabels</span><span class="sc">;</span>
 536     <span class="k">push</span> <span class="i">@</span>{<span class="i">$TextFilesInfo</span>{<span class="w">ColLabels</span>}[<span class="i">$Index</span>]}<span class="cm">,</span> <span class="i">@ColLabels</span><span class="sc">;</span>
 537     <span class="k">for</span> <span class="i">$ColNum</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#ColLabels</span><span class="s">)</span> <span class="s">{</span>
 538       <span class="i">$ColLabel</span> = <span class="i">$ColLabels</span>[<span class="i">$ColNum</span>]<span class="sc">;</span>
 539       <span class="i">$TextFilesInfo</span>{<span class="w">ColLabelToNumMap</span>}[<span class="i">$Index</span>]{<span class="i">$ColLabel</span>} = <span class="i">$ColNum</span><span class="sc">;</span>
 540     <span class="s">}</span>
 541   <span class="s">}</span>
 542   <span class="c"># Make sure all specified files are valid for merging to work properly...</span>
 543   <span class="k">if</span> <span class="s">(</span><span class="i">$FileNotOkayCount</span><span class="s">)</span> <span class="s">{</span>
 544     <span class="k">die</span> <span class="q">&quot;Error: Problems with input text file(s)...\n&quot;</span><span class="sc">;</span>
 545   <span class="s">}</span>
 546 <span class="s">}</span>
 547 
 548 <span class="c"># Process option values...</span>
<a name="ProcessOptions-"></a> 549 <span class="k">sub </span><span class="m">ProcessOptions</span> <span class="s">{</span>
 550   <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$FileDir</span><span class="cm">,</span> <span class="i">$FileName</span><span class="cm">,</span> <span class="i">$FileExt</span><span class="cm">,</span> <span class="i">$NewTextFile</span><span class="cm">,</span> <span class="i">@ColValues</span><span class="cm">,</span> <span class="i">@KeyValues</span><span class="s">)</span><span class="sc">;</span>
 551 
 552   <span class="i">%OptionsInfo</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 553 
 554   <span class="i">$OptionsInfo</span>{<span class="w">Mode</span>} = <span class="i">$Options</span>{<span class="w">mode</span>}<span class="sc">;</span>
 555 
 556   <span class="i">$OptionsInfo</span>{<span class="w">Columns</span>} = <span class="i">$Options</span>{<span class="w">columns</span>}<span class="sc">;</span>
 557   <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">ColValues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 558 
 559   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">columns</span>}<span class="s">)</span> <span class="s">{</span>
 560     <span class="i">@ColValues</span> = <span class="k">split</span> <span class="q">&quot;;&quot;</span><span class="cm">,</span> <span class="i">$Options</span>{<span class="w">columns</span>}<span class="sc">;</span>
 561     <span class="k">if</span> <span class="s">(</span><span class="i">@ColValues</span> != <span class="i">@TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 562       <span class="k">die</span> <span class="q">&quot;Error: Invalid number of values specified by \&quot;-c --columns\&quot; option: it must be equal to number of input text files.\n&quot;</span><span class="sc">;</span>
 563     <span class="s">}</span>
 564     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#ColValues</span><span class="s">)</span> <span class="s">{</span>
 565       <span class="k">if</span> <span class="s">(</span>!<span class="k">length</span><span class="s">(</span><span class="i">$ColValues</span>[<span class="i">$Index</span>]<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 566         <span class="k">die</span> <span class="q">&quot;Error: Invalid value specified by \&quot;-c --columns\&quot; option: empty values are not allowed.\n&quot;</span><span class="sc">;</span>
 567       <span class="s">}</span>
 568     <span class="s">}</span>
 569     <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">ColValues</span>}} = <span class="i">@ColValues</span><span class="sc">;</span>
 570   <span class="s">}</span>
 571 
 572   <span class="i">$OptionsInfo</span>{<span class="w">Keys</span>} = <span class="i">$Options</span>{<span class="w">keys</span>}<span class="sc">;</span>
 573   <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">KeyValues</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 574 
 575   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">keys</span>}<span class="s">)</span> <span class="s">{</span>
 576     <span class="i">@KeyValues</span> = <span class="k">split</span> <span class="q">&quot;;&quot;</span><span class="cm">,</span> <span class="i">$Options</span>{<span class="w">keys</span>}<span class="sc">;</span>
 577     <span class="k">if</span> <span class="s">(</span><span class="i">@KeyValues</span> != <span class="i">@TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 578       <span class="k">die</span> <span class="q">&quot;Error: Invalid number of values specified by \&quot;-k --keys\&quot; option: it must be equal to number of input text files.\n&quot;</span><span class="sc">;</span>
 579     <span class="s">}</span>
 580     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#KeyValues</span><span class="s">)</span> <span class="s">{</span>
 581       <span class="k">if</span> <span class="s">(</span>!<span class="k">length</span><span class="s">(</span><span class="i">$KeyValues</span>[<span class="i">$Index</span>]<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 582         <span class="k">die</span> <span class="q">&quot;Error: Invalid value specified by \&quot;-k --keys\&quot; option: empty values are not allowed.\n&quot;</span><span class="sc">;</span>
 583       <span class="s">}</span>
 584     <span class="s">}</span>
 585     <span class="i">@</span>{<span class="i">$OptionsInfo</span>{<span class="w">KeyValues</span>}} = <span class="i">@KeyValues</span><span class="sc">;</span>
 586   <span class="s">}</span>
 587 
 588   <span class="i">$OptionsInfo</span>{<span class="w">InDelim</span>} = <span class="i">$Options</span>{<span class="w">indelim</span>}<span class="sc">;</span>
 589 
 590   <span class="i">$OptionsInfo</span>{<span class="w">StartCol</span>} = <span class="i">$Options</span>{<span class="w">startcol</span>} ? <span class="i">$Options</span>{<span class="w">startcol</span>} <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span>
 591   <span class="i">$OptionsInfo</span>{<span class="w">StartColMode</span>} = <span class="i">$Options</span>{<span class="w">startcolmode</span>}<span class="sc">;</span>
 592 
 593   <span class="i">$OptionsInfo</span>{<span class="w">OutFileRoot</span>} = <span class="i">$Options</span>{<span class="w">root</span>} ? <span class="i">$Options</span>{<span class="w">root</span>} <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span>
 594   <span class="i">$OptionsInfo</span>{<span class="w">Overwrite</span>} = <span class="i">$Options</span>{<span class="w">overwrite</span>} ? <span class="i">$Options</span>{<span class="w">overwrite</span>} <span class="co">:</span> <span class="k">undef</span><span class="sc">;</span>
 595 
 596   <span class="i">$OptionsInfo</span>{<span class="w">OutDelim</span>} = <span class="s">(</span><span class="i">$Options</span>{<span class="w">outdelim</span>} =~ <span class="q">/^tab$/i</span> <span class="s">)</span> ? <span class="q">&quot;\t&quot;</span> <span class="co">:</span> <span class="s">(</span><span class="s">(</span><span class="i">$Options</span>{<span class="w">outdelim</span>} =~ <span class="q">/^semicolon$/i</span><span class="s">)</span> ? <span class="q">&quot;\;&quot;</span> <span class="co">:</span> <span class="q">&quot;\,&quot;</span><span class="s">)</span><span class="sc">;</span>
 597   <span class="i">$OptionsInfo</span>{<span class="w">OutQuote</span>} = <span class="s">(</span><span class="i">$Options</span>{<span class="w">quote</span>} =~ <span class="q">/^yes$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 598 
 599   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">root</span>}<span class="s">)</span> <span class="s">{</span>
 600     <span class="i">$FileDir</span> = <span class="q">&quot;&quot;</span><span class="sc">;</span> <span class="i">$FileName</span> = <span class="q">&quot;&quot;</span><span class="sc">;</span> <span class="i">$FileExt</span> = <span class="q">&quot;&quot;</span><span class="sc">;</span>
 601     <span class="s">(</span><span class="i">$FileDir</span><span class="cm">,</span> <span class="i">$FileName</span><span class="cm">,</span> <span class="i">$FileExt</span><span class="s">)</span> = <span class="i">ParseFileName</span><span class="s">(</span><span class="i">$Options</span>{<span class="w">root</span>}<span class="s">)</span><span class="sc">;</span>
 602     <span class="k">if</span> <span class="s">(</span><span class="i">$FileName</span> &amp;&amp; <span class="i">$FileExt</span><span class="s">)</span> <span class="s">{</span>
 603       <span class="i">$NewTextFile</span> = <span class="i">$FileName</span><span class="sc">;</span>
 604     <span class="s">}</span> <span class="k">else</span> <span class="s">{</span>
 605       <span class="i">$NewTextFile</span> =  <span class="i">$Options</span>{<span class="w">root</span>}<span class="sc">;</span>
 606     <span class="s">}</span>
 607   <span class="s">}</span> <span class="k">else</span> <span class="s">{</span>
 608     <span class="i">$FileDir</span> = <span class="q">&quot;&quot;</span><span class="sc">;</span> <span class="i">$FileName</span> = <span class="q">&quot;&quot;</span><span class="sc">;</span> <span class="i">$FileExt</span> = <span class="q">&quot;&quot;</span><span class="sc">;</span>
 609     <span class="s">(</span><span class="i">$FileDir</span><span class="cm">,</span> <span class="i">$FileName</span><span class="cm">,</span> <span class="i">$FileExt</span><span class="s">)</span> = <span class="i">ParseFileName</span><span class="s">(</span><span class="i">$TextFilesList</span>[<span class="n">0</span>]<span class="s">)</span><span class="sc">;</span>
 610     <span class="i">$NewTextFile</span> = <span class="i">$FileName</span> . <span class="q">&quot;1To&quot;</span> . <span class="i">@TextFilesList</span> . <span class="q">&quot;Merged&quot;</span><span class="sc">;</span>
 611   <span class="s">}</span>
 612   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">outdelim</span>} =~ <span class="q">/^tab$/i</span><span class="s">)</span> <span class="s">{</span>
 613     <span class="i">$NewTextFile</span> .= <span class="q">&quot;.tsv&quot;</span><span class="sc">;</span>
 614   <span class="s">}</span> <span class="k">else</span> <span class="s">{</span>
 615     <span class="i">$NewTextFile</span> .= <span class="q">&quot;.csv&quot;</span><span class="sc">;</span>
 616   <span class="s">}</span>
 617   <span class="k">if</span> <span class="s">(</span>!<span class="i">$Options</span>{<span class="w">overwrite</span>}<span class="s">)</span> <span class="s">{</span>
 618     <span class="k">if</span> <span class="s">(</span><span class="k">-e</span> <span class="i">$NewTextFile</span><span class="s">)</span> <span class="s">{</span>
 619       <span class="k">die</span> <span class="q">&quot;Error: The file $NewTextFile already exists.\n&quot;</span><span class="sc">;</span>
 620     <span class="s">}</span>
 621   <span class="s">}</span>
 622   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">root</span>}<span class="s">)</span> <span class="s">{</span>
 623     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$#TextFilesList</span><span class="s">)</span> <span class="s">{</span>
 624       <span class="k">if</span> <span class="s">(</span><span class="k">lc</span><span class="s">(</span><span class="i">$NewTextFile</span><span class="s">)</span> <span class="k">eq</span> <span class="k">lc</span><span class="s">(</span><span class="i">$TextFilesList</span>[<span class="i">$Index</span>]<span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 625         <span class="k">die</span> <span class="q">&quot;Error: Output filename, $NewTextFile, is similar to a input file name.\nSpecify a different name using \&quot;-r --root\&quot; option or use default name.\n&quot;</span><span class="sc">;</span>
 626       <span class="s">}</span>
 627     <span class="s">}</span>
 628   <span class="s">}</span>
 629 
 630   <span class="i">$OptionsInfo</span>{<span class="w">NewTextFile</span>} = <span class="i">$NewTextFile</span><span class="sc">;</span>
 631 <span class="s">}</span>
 632 
 633 <span class="c"># Setup script usage  and retrieve command line arguments specified using various options...</span>
<a name="SetupScriptUsage-"></a> 634 <span class="k">sub </span><span class="m">SetupScriptUsage</span> <span class="s">{</span>
 635 
 636   <span class="c"># Retrieve all the options...</span>
 637   <span class="i">%Options</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 638 
 639   <span class="i">$Options</span>{<span class="w">mode</span>} = <span class="q">&quot;colnum&quot;</span><span class="sc">;</span>
 640   <span class="i">$Options</span>{<span class="w">indelim</span>} = <span class="q">&quot;comma&quot;</span><span class="sc">;</span>
 641   <span class="i">$Options</span>{<span class="w">outdelim</span>} = <span class="q">&quot;comma&quot;</span><span class="sc">;</span>
 642   <span class="i">$Options</span>{<span class="w">quote</span>} = <span class="q">&quot;yes&quot;</span><span class="sc">;</span>
 643   <span class="i">$Options</span>{<span class="w">startcolmode</span>} = <span class="q">&quot;after&quot;</span><span class="sc">;</span>
 644 
 645   <span class="k">if</span> <span class="s">(</span>!<span class="i">GetOptions</span><span class="s">(</span>\<span class="i">%Options</span><span class="cm">,</span> <span class="q">&quot;help|h&quot;</span><span class="cm">,</span> <span class="q">&quot;indelim=s&quot;</span><span class="cm">,</span> <span class="q">&quot;columns|c=s&quot;</span><span class="cm">,</span> <span class="q">&quot;keys|k=s&quot;</span><span class="cm">,</span> <span class="q">&quot;mode|m=s&quot;</span><span class="cm">,</span> <span class="q">&quot;outdelim=s&quot;</span><span class="cm">,</span> <span class="q">&quot;overwrite|o&quot;</span><span class="cm">,</span> <span class="q">&quot;quote|q=s&quot;</span><span class="cm">,</span> <span class="q">&quot;root|r=s&quot;</span><span class="cm">,</span> <span class="q">&quot;startcol|s=s&quot;</span><span class="cm">,</span> <span class="q">&quot;startcolmode=s&quot;</span><span class="cm">,</span> <span class="q">&quot;workingdir|w=s&quot;</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 646     <span class="k">die</span> <span class="q">&quot;\nTo get a list of valid options and their values, use \&quot;$ScriptName -h\&quot; or\n\&quot;perl -S $ScriptName -h\&quot; command and try again...\n&quot;</span><span class="sc">;</span>
 647   <span class="s">}</span>
 648   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">workingdir</span>}<span class="s">)</span> <span class="s">{</span>
 649     <span class="k">if</span> <span class="s">(</span>! <span class="k">-d</span> <span class="i">$Options</span>{<span class="w">workingdir</span>}<span class="s">)</span> <span class="s">{</span>
 650       <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{workingdir}, for option \&quot;-w --workingdir\&quot; is not a directory name.\n&quot;</span><span class="sc">;</span>
 651     <span class="s">}</span>
 652     <span class="k">chdir</span> <span class="i">$Options</span>{<span class="w">workingdir</span>} <span class="k">or</span> <span class="k">die</span> <span class="q">&quot;Error: Couldn&#39;t chdir $Options{workingdir}: $! \n&quot;</span><span class="sc">;</span>
 653   <span class="s">}</span>
 654   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">mode</span>} !~ <span class="q">/^(colnum|collabel)$/i</span><span class="s">)</span> <span class="s">{</span>
 655     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{mode}, for option \&quot;-m --mode\&quot; is not valid. Allowed values: colnum, or collabel\n&quot;</span><span class="sc">;</span>
 656   <span class="s">}</span>
 657   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">indelim</span>} !~ <span class="q">/^(comma|semicolon)$/i</span><span class="s">)</span> <span class="s">{</span>
 658     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{indelim}, for option \&quot;--indelim\&quot; is not valid. Allowed values: comma or semicolon\n&quot;</span><span class="sc">;</span>
 659   <span class="s">}</span>
 660   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">outdelim</span>} !~ <span class="q">/^(comma|semicolon|tab)$/i</span><span class="s">)</span> <span class="s">{</span>
 661     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{outdelim}, for option \&quot;--outdelim\&quot; is not valid. Allowed values: comma, tab, or semicolon\n&quot;</span><span class="sc">;</span>
 662   <span class="s">}</span>
 663   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">quote</span>} !~ <span class="q">/^(yes|no)$/i</span><span class="s">)</span> <span class="s">{</span>
 664     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{quote}, for option \&quot;-q --quote\&quot; is not valid. Allowed values: yes or no\n&quot;</span><span class="sc">;</span>
 665   <span class="s">}</span>
 666   <span class="k">if</span> <span class="s">(</span><span class="i">$Options</span>{<span class="w">startcolmode</span>} !~ <span class="q">/^(before|after)$/i</span><span class="s">)</span> <span class="s">{</span>
 667     <span class="k">die</span> <span class="q">&quot;Error: The value specified, $Options{quote}, for option \&quot;--startcolmode\&quot; is not valid. Allowed values: before or after\n&quot;</span><span class="sc">;</span>
 668   <span class="s">}</span>
 669 <span class="s">}</span>
 670 
<a name="EOF-"></a></pre>
<p>&nbsp;</p>
<br />
<center>
<img src="../../../images/h2o2.png">
</center>
</body>
</html>