<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>Flat File Checker - Blog</title><description>Posts about data validation with Flat File Checker tool.</description><managingEditor>noreply@blogger.com (Bulat)</managingEditor><pubDate>Fri, 30 Aug 2024 22:35:51 -0700</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">32</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://blog.flat-file.net/</link><language>en-us</language><itunes:explicit>no</itunes:explicit><copyright>Copyright CleanCRM.co.uk</copyright><itunes:subtitle>Posts about data validation with Flat File Checker tool.</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Software How-To"/></itunes:category><itunes:category text="Technology"/><itunes:author>Bulat Yapparov</itunes:author><itunes:owner><itunes:email>bulat@flat-file.net</itunes:email><itunes:name>Bulat Yapparov</itunes:name></itunes:owner><item><title>Flat File Checker Validation using C#.NET</title><link>http://blog.flat-file.net/2011/12/flat-file-checker-validation-using-cnet.html</link><category>C#</category><category>code sample</category><category>validation</category><pubDate>Thu, 22 Dec 2011 06:35:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-5761759993442408295</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="MsoNormal"&gt;
&lt;h2&gt;Business Case&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="MsoNormal"&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;The Data Feed project had a requirement to design and
develop an interface to accept and parse the data file from ABZ Company.&lt;/span&gt;&lt;/div&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;The Data File was generated with data from multiple types
of systems. Hence it was decided to use a Fixed-width file.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;The data file format was defined to be fixed-width format.
Here is an example of a fixed width file :&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="MsoNormal" style="margin-left: 72.0pt;"&gt;
&lt;i&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 72.0pt;"&gt;
&lt;i&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;01732Juan&amp;nbsp;Perez&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;004350011052002&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 72.0pt;"&gt;
&lt;i&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;00554Pedro&amp;nbsp;Gomez&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;123423006022004&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 72.0pt;"&gt;
&lt;i&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;00112Ramiro&amp;nbsp;Politti&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 000000001022000&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 72.0pt;"&gt;
&lt;i&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;00924Pablo&amp;nbsp;Ramirez&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;033213024112002&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="MsoNormal" style="margin-left: 72.0pt;"&gt;
&lt;i&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Each field in the line has a start position and length defined. The challenge with a fixed width file is that each field has a&amp;nbsp;defined&amp;nbsp;length and any unwanted character can get easily ignored and
result in an incorrect data.&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span lang="EN-US"&gt;So validation of data was very crucial for the
success of the project&lt;/span&gt;&lt;span class="apple-style-span"&gt;&lt;span lang="EN-US"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;Goals&lt;/h2&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;To design a data-validation tool to validate the incoming
data on a continuous basis:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;validation engine must be configurable --- validation rules must not be hard coded.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;data errors in a file must be documented and be
available to be emailed to the sender.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;The business rules against which you must validate the
files must be made available to the FlatFileLibrary in the form of an XML
file, which is created through the graphical user interface of the Flat File Checker (FFC) application. Here are examples of such rules:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul type="disc"&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Value in
     the field is Required&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Field is a
     date with a given format and within a given range&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Field
     structure must match a Regular Expression&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Two files
     are linked [relational links]&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Field must
     be compared to another field&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Unique
     constraint is imposed on one or several fields&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Validation
     must be made against values stored in a database&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;The task of validation can be now addressed in a few easy
steps:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul type="disc"&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Create a
     Flat File Schema (XML file that contains business/data rules for files
     that you want to validate)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Add the
     Flat File Checker library to your .NET application&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Run
     validation with minimum code within your application&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;The idea behind Flat File Checker is to create an
application that can validate structured data in a text file based on schema
stored in XML, in a way similar to the way XML files are validated. This
approach separates data/business rules from the validation itself, and thus
considerably less coding is required.&lt;/span&gt;

&lt;br /&gt;
&lt;h2&gt;Creating the schema&lt;/h2&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;Here is a quick way to create a schema file that can be used for
validation with FFC:&lt;/span&gt;
&lt;br /&gt;
&lt;ul type="disc"&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Download
     the installer of the &lt;a href="http://sourceforge.net/projects/flafi/files/latest/download"&gt;latest version of Flat File Checker&lt;/a&gt; from
     SourcForge.net&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Install&amp;nbsp;and start&amp;nbsp;FFC&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Create a
     new schema in FFC and save it locally in an XML file&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;h2&gt;

Add the Flat File Library to your solution&lt;/h2&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Add a reference of &lt;span class="search-highlight"&gt;Flat&lt;/span&gt;
&lt;span class="search-highlight"&gt;File&lt;/span&gt; Library (FlatFilelibrary.dll (version 0.7.3.2)
and Eval3.dll (version 0.6.4.0)) to your solution in Visual Studio. (&lt;a href="http://www.flat-file.net/download.html"&gt;http://www.flat-file.net/download.html&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;Run the validation and process&lt;/h2&gt;
&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;To use the &lt;span class="search-highlight"&gt;Flat&lt;/span&gt; &lt;span class="search-highlight"&gt;File&lt;/span&gt; Library, you will need to use these main
classes:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul type="disc"&gt;
&lt;li class="MsoNormal"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;FlatFileSchema&lt;/b&gt;- The class that contains a collection of &lt;span class="search-highlight"&gt;file&lt;/span&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="search-highlight"&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;b&gt; &lt;/b&gt;- The virtual class that gives access to several objects
     associated with a &lt;span class="search-highlight"&gt;flat&lt;/span&gt; &lt;span class="search-highlight"&gt;file&lt;/span&gt;: columns, errors, etc&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="MsoNormal"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;b&gt;DataError&lt;/b&gt;- The class that contains details of the data error&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="csharp" lang="c#" name="code"&gt;using FlatFileLibrary;
using System.Threading;
using FlatFileLibrary.DataSources;


//Define the variables
private FlatFileSchema _files;
private AutoResetEvent do_checks =new AutoResetEvent(false);

//Add the event handler in the class constructor or during form initialization

_files = new FlatFileSchema(schemaPath);
this._files.Validated += new EventHandler&amp;lt;schemavalidatedeventargs&amp;gt;(FileSetValidated);

        public void  ValidateFile()
        {
            try
            {
                RunValidation();
            }
            catch (Exception e)
            {
                log.Error("Data Validation failed because :" + e.Message);
            }            
        }
        private void RunValidation()
        {
            // Use Flat File Checker user interface to create Schema file.

            do_checks.Reset(); //reset state    
            _files.RunChecks(); //don't store event from the lib     
            do_checks.WaitOne(); //Wait for FileSetValidated to set this event 
        }
&lt;/pre&gt;
&lt;div&gt;
&lt;div class="MsoNormal"&gt;
&lt;h2&gt;Issues and Resolutions&lt;/h2&gt;
&lt;span lang="EN-US" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Below is a list of the issues and how they were resolved:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;i style="font-size: medium; text-indent: -24px;"&gt;&lt;span lang="EN-US" style="font-weight: normal;"&gt;1)&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span lang="EN-US" style="font-size: small; font-weight: normal; text-indent: -24px;"&gt;Version differences: There were
some changes in class names and namespaces between various versions of FFC. The
code above works with the following versions of the 2 FlatFilelibrary dlls&lt;i&gt;.&amp;nbsp;
FlatFilelibrary.dll (version 0.7.3.2) and Eval3.dll (version 0.6.4.0)&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: small; text-indent: -24px;"&gt;&lt;span lang="EN-US" style="font-weight: normal;"&gt;2)&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-weight: normal; text-indent: -24px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Writing errors to the database:
FFC generates a text file with errors by default. In order to
write errors to the database/customize the error file, you can use the following code:&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class="csharp" lang="c#" name="code"&gt;public void FileSetValidated(Object sender, SchemaValidatedEventArgs e)
        {
            ValidationComplete = e.Result;
           try
            {
                foreach (FlatFile file in _files.DataSources)
                {
                    if (file.Errors.Count &amp;gt; 0)
                    {
                        IsDataValid = false;
              
                    foreach (DataError err in file.Errors)
                    {
                        foreach (IDataRule check in err.Checks)
                        {
                            //parse through errors 

                            StringBuilder errorLine= new StringBuilder();
                            errorLog = new SurveyDataFileErrorLog();
                            errorLog.Row = err.RowInSource;
                            errorLog.ColumnName = err.Column.Name;
                            errorLog.Value = err.Value;
     //Customize error messages.. 

                         if (check.DataRuleMessage.Contains("REGEX"))
                            {
                                errorLog.ExceptionMessage = "Invalid Format";
                            }
                            else {
                                errorLog.ExceptionMessage = check.DataRuleMessage;
                            }
                        }
                    }
                }
                    else{
                        IsDataValid = true; }               
            }
                }
            finally {
                do_checks.Set(); }
}
&lt;/pre&gt;
&lt;span lang="EN-US" style="font-family: 'Times New Roman'; font-size: 12pt; text-indent: -24px; white-space: normal;"&gt;3)&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: 'Times New Roman'; font-size: 12pt; text-indent: -24px; white-space: normal;"&gt;Asynchronous Data Validation: The
Flat File checker validation is done asynchronously. The project requirement
was to be able to do it synchronously and depending on whether the file was
valid or invalid next function will be executed.&lt;/span&gt;
&lt;br /&gt;
&lt;pre class="csharp" lang="c#" name="code"&gt;private void RunValidation()
       {
            // Use Flat File Checker user interface to create Schema file.

            do_checks.Reset(); //reset state    
            _files.RunChecks(); //don't store event from the lib     
            do_checks.WaitOne(); //Wait for FileSetValidated to set this event 
        }
&lt;/pre&gt;
&lt;h2&gt;FFC – Wish list &amp;amp; Next Steps&lt;/h2&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;One of the features that I would &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;like to see in the upcoming versions of the FFC is the ability to check if a &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;file was valid or invalid in the RunValidation() method. Currently I had to set &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;it during the event handler and read it from a global variable.&lt;/span&gt;



&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;Next Step:&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt; Assign the File Name &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;to be validated at runtime. The following code was sent by FFC author&amp;nbsp;&lt;/span&gt;

&lt;span class="Apple-style-span" style="color: #500050; font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;FlatFile&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #500050; font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;file = (FlatFile)Schema.DataSource(&lt;filealias&gt;);&lt;/filealias&gt;&lt;/span&gt;

&lt;span class="Apple-style-span" style="color: #000066; font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;file.Path&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #000066; font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;= &lt;newpath&gt;;&lt;/newpath&gt;&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;Next Step&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;: Validate file data &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; text-indent: -24px;"&gt;&lt;span lang="EN-US" style="font-weight: normal;"&gt;with the existing data in SQL database &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 12pt; font-weight: normal; text-indent: -24px;"&gt;.&lt;/span&gt;

&lt;br /&gt;
&lt;h2&gt;Results&lt;/h2&gt;
&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;The Flat File Checker is a complete &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;file validation tool with configurable validation rules.&amp;nbsp;&lt;/span&gt;

&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;I was able to validate the files on a continuous basis and generate emails/error files without much effort.&lt;/span&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small; font-weight: normal;"&gt;
Author: &lt;b&gt;Pooja Lnu&lt;/b&gt;
&lt;/span&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>bulat@flat-file.net (Bulat Yapparov)</author><enclosure length="4022086" type="application/octet-stream" url="http://sourceforge.net/projects/flafi/files/latest/download"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>Business Case The Data Feed project had a requirement to design and develop an interface to accept and parse the data file from ABZ Company. The Data File was generated with data from multiple types of systems. Hence it was decided to use a Fixed-width file. The data file format was defined to be fixed-width format. Here is an example of a fixed width file : 01732Juan&amp;nbsp;Perez&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;004350011052002&amp;nbsp; 00554Pedro&amp;nbsp;Gomez&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;123423006022004&amp;nbsp; 00112Ramiro&amp;nbsp;Politti&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 000000001022000&amp;nbsp; 00924Pablo&amp;nbsp;Ramirez&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;033213024112002 Each field in the line has a start position and length defined. The challenge with a fixed width file is that each field has a&amp;nbsp;defined&amp;nbsp;length and any unwanted character can get easily ignored and result in an incorrect data. So validation of data was very crucial for the success of the project. Goals To design a data-validation tool to validate the incoming data on a continuous basis: validation engine must be configurable --- validation rules must not be hard coded. data errors in a file must be documented and be available to be emailed to the sender. Solution The business rules against which you must validate the files must be made available to the FlatFileLibrary in the form of an XML file, which is created through the graphical user interface of the Flat File Checker (FFC) application. Here are examples of such rules: Value in the field is Required Field is a date with a given format and within a given range Field structure must match a Regular Expression Two files are linked [relational links] Field must be compared to another field Unique constraint is imposed on one or several fields Validation must be made against values stored in a database The task of validation can be now addressed in a few easy steps: Create a Flat File Schema (XML file that contains business/data rules for files that you want to validate) Add the Flat File Checker library to your .NET application Run validation with minimum code within your application Background The idea behind Flat File Checker is to create an application that can validate structured data in a text file based on schema stored in XML, in a way similar to the way XML files are validated. This approach separates data/business rules from the validation itself, and thus considerably less coding is required. Creating the schema Here is a quick way to create a schema file that can be used for validation with FFC: Download the installer of the latest version of Flat File Checker from SourcForge.net Install&amp;nbsp;and start&amp;nbsp;FFC Create a new schema in FFC and save it locally in an XML file Add the Flat File Library to your solution Add a reference of Flat File Library (FlatFilelibrary.dll (version 0.7.3.2) and Eval3.dll (version 0.6.4.0)) to your solution in Visual Studio. (http://www.flat-file.net/download.html) Run the validation and process To use the Flat File Library, you will need to use these main classes: FlatFileSchema- The class that contains a collection of files File - The virtual class that gives access to several objects associated with a flat file: columns, errors, etc DataError- The class that contains details of the data error using FlatFileLibrary; using System.Threading; using FlatFileLibrary.DataSources; //Define the variables private FlatFileSchema _files; private AutoResetEvent do_checks =new AutoResetEvent(false); //Add the event handler in the class constructor or during form initialization _files = new FlatFileSchema(schemaPath); this._files.Validated += new EventHandler&amp;lt;schemavalidatedeventargs&amp;gt;(FileSetValidated); public void ValidateFile() { try { RunValidation(); } catch (Exception e) { log.Error("Data Validation failed because :" + e.Message); } } private void RunValidation() { // Use Flat File Checker user interface to create Schema file. do_checks.Reset(); //reset state _files.RunChecks(); //don't store event from the lib do_checks.WaitOne(); //Wait for FileSetValidated to set this event } Issues and Resolutions Below is a list of the issues and how they were resolved: 1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Version differences: There were some changes in class names and namespaces between various versions of FFC. The code above works with the following versions of the 2 FlatFilelibrary dlls.&amp;nbsp; FlatFilelibrary.dll (version 0.7.3.2) and Eval3.dll (version 0.6.4.0) 2)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Writing errors to the database: FFC generates a text file with errors by default. In order to write errors to the database/customize the error file, you can use the following code: public void FileSetValidated(Object sender, SchemaValidatedEventArgs e) { ValidationComplete = e.Result; try { foreach (FlatFile file in _files.DataSources) { if (file.Errors.Count &amp;gt; 0) { IsDataValid = false; foreach (DataError err in file.Errors) { foreach (IDataRule check in err.Checks) { //parse through errors StringBuilder errorLine= new StringBuilder(); errorLog = new SurveyDataFileErrorLog(); errorLog.Row = err.RowInSource; errorLog.ColumnName = err.Column.Name; errorLog.Value = err.Value; //Customize error messages.. if (check.DataRuleMessage.Contains("REGEX")) { errorLog.ExceptionMessage = "Invalid Format"; } else { errorLog.ExceptionMessage = check.DataRuleMessage; } } } } else{ IsDataValid = true; } } } finally { do_checks.Set(); } } 3)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Asynchronous Data Validation: The Flat File checker validation is done asynchronously. The project requirement was to be able to do it synchronously and depending on whether the file was valid or invalid next function will be executed. private void RunValidation() { // Use Flat File Checker user interface to create Schema file. do_checks.Reset(); //reset state _files.RunChecks(); //don't store event from the lib do_checks.WaitOne(); //Wait for FileSetValidated to set this event } FFC – Wish list &amp;amp; Next Steps One of the features that I would like to see in the upcoming versions of the FFC is the ability to check if a file was valid or invalid in the RunValidation() method. Currently I had to set it during the event handler and read it from a global variable. Next Step: Assign the File Name to be validated at runtime. The following code was sent by FFC author&amp;nbsp; FlatFilefile = (FlatFile)Schema.DataSource(); file.Path= ; Next Step: Validate file data with the existing data in SQL database . Results The Flat File Checker is a complete file validation tool with configurable validation rules.&amp;nbsp; I was able to validate the files on a continuous basis and generate emails/error files without much effort. Author: Pooja Lnu</itunes:subtitle><itunes:author>Bulat Yapparov</itunes:author><itunes:summary>Business Case The Data Feed project had a requirement to design and develop an interface to accept and parse the data file from ABZ Company. The Data File was generated with data from multiple types of systems. Hence it was decided to use a Fixed-width file. The data file format was defined to be fixed-width format. Here is an example of a fixed width file : 01732Juan&amp;nbsp;Perez&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;004350011052002&amp;nbsp; 00554Pedro&amp;nbsp;Gomez&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;123423006022004&amp;nbsp; 00112Ramiro&amp;nbsp;Politti&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 000000001022000&amp;nbsp; 00924Pablo&amp;nbsp;Ramirez&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;033213024112002 Each field in the line has a start position and length defined. The challenge with a fixed width file is that each field has a&amp;nbsp;defined&amp;nbsp;length and any unwanted character can get easily ignored and result in an incorrect data. So validation of data was very crucial for the success of the project. Goals To design a data-validation tool to validate the incoming data on a continuous basis: validation engine must be configurable --- validation rules must not be hard coded. data errors in a file must be documented and be available to be emailed to the sender. Solution The business rules against which you must validate the files must be made available to the FlatFileLibrary in the form of an XML file, which is created through the graphical user interface of the Flat File Checker (FFC) application. Here are examples of such rules: Value in the field is Required Field is a date with a given format and within a given range Field structure must match a Regular Expression Two files are linked [relational links] Field must be compared to another field Unique constraint is imposed on one or several fields Validation must be made against values stored in a database The task of validation can be now addressed in a few easy steps: Create a Flat File Schema (XML file that contains business/data rules for files that you want to validate) Add the Flat File Checker library to your .NET application Run validation with minimum code within your application Background The idea behind Flat File Checker is to create an application that can validate structured data in a text file based on schema stored in XML, in a way similar to the way XML files are validated. This approach separates data/business rules from the validation itself, and thus considerably less coding is required. Creating the schema Here is a quick way to create a schema file that can be used for validation with FFC: Download the installer of the latest version of Flat File Checker from SourcForge.net Install&amp;nbsp;and start&amp;nbsp;FFC Create a new schema in FFC and save it locally in an XML file Add the Flat File Library to your solution Add a reference of Flat File Library (FlatFilelibrary.dll (version 0.7.3.2) and Eval3.dll (version 0.6.4.0)) to your solution in Visual Studio. (http://www.flat-file.net/download.html) Run the validation and process To use the Flat File Library, you will need to use these main classes: FlatFileSchema- The class that contains a collection of files File - The virtual class that gives access to several objects associated with a flat file: columns, errors, etc DataError- The class that contains details of the data error using FlatFileLibrary; using System.Threading; using FlatFileLibrary.DataSources; //Define the variables private FlatFileSchema _files; private AutoResetEvent do_checks =new AutoResetEvent(false); //Add the event handler in the class constructor or during form initialization _files = new FlatFileSchema(schemaPath); this._files.Validated += new EventHandler&amp;lt;schemavalidatedeventargs&amp;gt;(FileSetValidated); public void ValidateFile() { try { RunValidation(); } catch (Exception e) { log.Error("Data Validation failed because :" + e.Message); } } private void RunValidation() { // Use Flat File Checker user interface to create Schema file. do_checks.Reset(); //reset state _files.RunChecks(); //don't store event from the lib do_checks.WaitOne(); //Wait for FileSetValidated to set this event } Issues and Resolutions Below is a list of the issues and how they were resolved: 1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Version differences: There were some changes in class names and namespaces between various versions of FFC. The code above works with the following versions of the 2 FlatFilelibrary dlls.&amp;nbsp; FlatFilelibrary.dll (version 0.7.3.2) and Eval3.dll (version 0.6.4.0) 2)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Writing errors to the database: FFC generates a text file with errors by default. In order to write errors to the database/customize the error file, you can use the following code: public void FileSetValidated(Object sender, SchemaValidatedEventArgs e) { ValidationComplete = e.Result; try { foreach (FlatFile file in _files.DataSources) { if (file.Errors.Count &amp;gt; 0) { IsDataValid = false; foreach (DataError err in file.Errors) { foreach (IDataRule check in err.Checks) { //parse through errors StringBuilder errorLine= new StringBuilder(); errorLog = new SurveyDataFileErrorLog(); errorLog.Row = err.RowInSource; errorLog.ColumnName = err.Column.Name; errorLog.Value = err.Value; //Customize error messages.. if (check.DataRuleMessage.Contains("REGEX")) { errorLog.ExceptionMessage = "Invalid Format"; } else { errorLog.ExceptionMessage = check.DataRuleMessage; } } } } else{ IsDataValid = true; } } } finally { do_checks.Set(); } } 3)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Asynchronous Data Validation: The Flat File checker validation is done asynchronously. The project requirement was to be able to do it synchronously and depending on whether the file was valid or invalid next function will be executed. private void RunValidation() { // Use Flat File Checker user interface to create Schema file. do_checks.Reset(); //reset state _files.RunChecks(); //don't store event from the lib do_checks.WaitOne(); //Wait for FileSetValidated to set this event } FFC – Wish list &amp;amp; Next Steps One of the features that I would like to see in the upcoming versions of the FFC is the ability to check if a file was valid or invalid in the RunValidation() method. Currently I had to set it during the event handler and read it from a global variable. Next Step: Assign the File Name to be validated at runtime. The following code was sent by FFC author&amp;nbsp; FlatFilefile = (FlatFile)Schema.DataSource(); file.Path= ; Next Step: Validate file data with the existing data in SQL database . Results The Flat File Checker is a complete file validation tool with configurable validation rules.&amp;nbsp; I was able to validate the files on a continuous basis and generate emails/error files without much effort. Author: Pooja Lnu</itunes:summary><itunes:keywords>C#, code sample, validation</itunes:keywords></item><item><title>v. 0.7.3.0 - New User Interface on the Main Form</title><link>http://blog.flat-file.net/2011/04/v-0730-new-user-interface-on-main-form.html</link><category>Release v.0.7.3.0</category><pubDate>Thu, 7 Apr 2011 14:16:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-1587048020585314977</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Interface of the main form has been changed completely with a more intuitive and&amp;nbsp;convenient layout:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;source and fields are presented in the single tree which makes it easier to navigate and change schema;&lt;/li&gt;
&lt;li&gt;rule builder made it to the main form and is not hidden within column details any more - this is a major change for everyday users.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOm7CKquL14OmYbIhWMlHDWKMx3V0h9UZK7hldWfL50aRBBlFwPr1aFU2KM-nOqwAR30PiB61sy0vQpzuEglmTrb3wa5Pelop75YHNLaaihQ7eXXHtiD-xgSOSqNLW-iFWuunmytjbrms/s1600/ffc_new_interface.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOm7CKquL14OmYbIhWMlHDWKMx3V0h9UZK7hldWfL50aRBBlFwPr1aFU2KM-nOqwAR30PiB61sy0vQpzuEglmTrb3wa5Pelop75YHNLaaihQ7eXXHtiD-xgSOSqNLW-iFWuunmytjbrms/s640/ffc_new_interface.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
I hope this new version of Flat File Checker will make a big difference to the usability and first impression of the application.&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOm7CKquL14OmYbIhWMlHDWKMx3V0h9UZK7hldWfL50aRBBlFwPr1aFU2KM-nOqwAR30PiB61sy0vQpzuEglmTrb3wa5Pelop75YHNLaaihQ7eXXHtiD-xgSOSqNLW-iFWuunmytjbrms/s72-c/ffc_new_interface.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>London Marathon 2011 for IT4CH</title><link>http://blog.flat-file.net/2011/01/london-marathon-2011-for-it4ch.html</link><pubDate>Mon, 24 Jan 2011 14:38:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-3530602190817134110</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I decided to take a&amp;nbsp;challenge&amp;nbsp;of running my first marathon to raise £1500 for&amp;nbsp;&lt;a href="http://www.it4ch.com/"&gt;IT4CH&lt;/a&gt;&amp;nbsp;that provides local hospitals with computers and IT support. Thanks to charity's effort children will continue to study and reach out to their&amp;nbsp;friends&amp;nbsp;and family via internet during the difficult period of their life.&lt;br /&gt;
&lt;br /&gt;
Preparation for the marathon is very hard so any&amp;nbsp;&lt;a href="http://uk.virginmoneygiving.com/bulat"&gt;support&lt;/a&gt; will be very appreciated.&lt;br /&gt;
&lt;br /&gt;
Thanks&lt;br /&gt;
Bulat&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</description><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Data Quality as a set of consistent measures</title><link>http://blog.flat-file.net/2011/01/data-quality-as-set-of-consistent.html</link><pubDate>Sun, 16 Jan 2011 18:04:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-1726910723903258903</guid><description>&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Managing Data Quality (DQ) of the information system is a complex and resource demanding task. Though it is often clear why cleaner database will bring more profit, it is not easy to take required steps to get desired result. I have been working on DQ initiative for some time now and though we are nowhere near the final goal, we were doing a good progress. Here I decided to share with you how I understand basic principles of DQ Management. If you think that data quality is the problem of your organisation then you can start from here. I am not getting into the project management aspects of DQ initiative here, as this article is just about the main DQ concepts.&lt;br /&gt;
&lt;span xmlns=""&gt;Data Quality is a broad discipline that includes many tasks and preventive measures:&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span xmlns=""&gt;Standardisation&lt;br /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;span xmlns=""&gt;
&lt;li&gt;Profiling&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Data Quality Assessment (DQA)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Matching and Merging (M&amp;amp;M)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Correction&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Monitoring&lt;br /&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;&lt;span xmlns=""&gt;Though all this measures are well known each organisation has to develop a consistent approach to implement these measures. The good way to start is to draw a broad DQ Strategy document that will explain how DQ will be measured, improved and monitored.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Data Rules or Business Rules&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span xmlns=""&gt;These are rules that define or restrict your business processes. Any data quality project should start from formal definition of these rules.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span xmlns=""&gt;So the first thing you should do is to go to your users and ask them:&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span xmlns=""&gt;What business processes heavily depend on the database?&lt;br /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;span xmlns=""&gt;
&lt;li&gt;What data users need for their business processes?&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;What data will disturb or break business processes?&lt;br /&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ol&gt;&lt;span xmlns=""&gt;After you got answers to these questions you can:&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span xmlns=""&gt;Write a standard for data entry into the system;&lt;br /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;span xmlns=""&gt;
&lt;li&gt;Create a catalogue of rules that your data must conform to.&lt;br /&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ol&gt;&lt;span xmlns=""&gt;Catalogue of business processes and business rules is the most important part of Data Quality Management Initiative as it provides you with a clear view on what should be done.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span xmlns=""&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Data Standards&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
While mainly working with CRM system I have created a standard for Customer Data which includes thorough definitions for all data for contact, address and telephone details:&lt;br /&gt;
&lt;br /&gt;
&lt;span xmlns=""&gt;Contacts&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span xmlns=""&gt;Title&lt;br /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;span xmlns=""&gt;
&lt;li&gt;First Name&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Second Name &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Sex / Gender&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Date of birth&lt;br /&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;&lt;span xmlns=""&gt;Addresses (depends on the country)&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span xmlns=""&gt;House Name&lt;br /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;span xmlns=""&gt;
&lt;li&gt;Address Lines (depend on countries if you have multi-national database&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Postcode/Zip Code&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Town&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Country&lt;br /&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;&lt;span xmlns=""&gt;Telephone&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span xmlns=""&gt;Country Code&lt;br /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;span xmlns=""&gt;
&lt;li&gt;Region Code&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Number&lt;br /&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;&lt;span xmlns=""&gt;Each data item should have a description for business users who key customer details plus technical definition i.e. regular expression.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span xmlns=""&gt;It is worth mentioning that most contemporary CRM systems will have such standards imbedded in their functionality. However it can be the case that these rules are still ignored by users or data loads.  &lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;&lt;span xmlns=""&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Data Quality Metadata&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/h2&gt;&lt;span xmlns=""&gt;When your business rules are defined through the formal requirements gathering exercise it is time to:&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ol style="margin-left: 38pt;"&gt;&lt;li&gt;&lt;span xmlns=""&gt;Assess the quality of data in your system;&lt;br /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;span xmlns=""&gt;
&lt;li&gt;Correct data errors where possible to get improve results that you got through assessment stage;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Set up monitoring activity that will be base on regular DQA reports. &lt;br /&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ol&gt;&lt;span xmlns=""&gt;To get all this right you will require a meta-database that will store all data rules and also statistics for DQA;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span xmlns=""&gt;The main feature of such database is that it will generate SQL for all required steps or store pre-written SQL as part of metadata.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span xmlns=""&gt;Let's have a look at main tables that can be found in any DQ repository.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;span xmlns=""&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Scores or Processes&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/h3&gt;&lt;span xmlns=""&gt;List of business processes that were chosen for DQ&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;span style="font-size: small;" xmlns=""&gt;Rules&lt;br /&gt;
&lt;/span&gt;&lt;/h3&gt;&lt;span xmlns=""&gt;List of rules that were formulated in requirements capture stage for DQ&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span xmlns=""&gt;This table can be extended by tables that store details for rules of specific types:&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span xmlns=""&gt;Not Null value&lt;br /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;span xmlns=""&gt;
&lt;li&gt;Regular expression&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Relational integrity – searches orphan records&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Custom rule – stores custom SQL that returns a set of erroneous records&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Field comparison – checks that two fields have consistent values i.e. [Start Date]&amp;gt;=[End Date]&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Any other type of rule if it frequently appears in the list of business rules.&lt;br /&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;&lt;span xmlns=""&gt;The purpose of these extensions is to make it possible for the DQ solution to generate SQL basing on minimum of information in the metadata database. So if you want to set a Not Null constraint on one of the fields you just need to specify the attribute for that rule and system will generate SQL that picks erroneous records: &lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #1f497d;"&gt;&lt;span style="font-family: 'Courier New';"&gt;SELECT * FROM MyTable WHERE MyField IS NULL&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #1f497d;"&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;span xmlns=""&gt;All you have to store in the extended table is the attribute ID that is linked to Attributes table.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;span xmlns=""&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Tables or Entities&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/h3&gt;&lt;span xmlns=""&gt;Contains the list of all entities from the database&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;&lt;span xmlns=""&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Fields or Attributes&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/h3&gt;&lt;span xmlns=""&gt;Contains the list of attributes in entities from the database &lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;&lt;span xmlns=""&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Data Quality Reports&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/h2&gt;&lt;span xmlns=""&gt;There are several reports that can be very useful for monitoring of DQ:&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span xmlns=""&gt;Process Level – Shows how many times business rule is violated in the database.&lt;br /&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;span xmlns=""&gt;
&lt;li&gt;Entity Level – Shows how many records in table contain errors or missing.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Sub Entity Level – Shows how many records in table contain records within a specified group of records (i.e. Country in Addresses table).&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Errors report – Contains details of erroneous records that violate business rules.&lt;br /&gt;
&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;&lt;span xmlns=""&gt;Reporting is essential for DQ management as it allows prioritising data corrections activities basing on number of errors and importance of business rule. It then allows to monitor the progress of DQ initiative and provides easy means to support initiative continuation or cancellation. &lt;br /&gt;
&lt;/span&gt;</description><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>How to fix CSV data file</title><link>http://blog.flat-file.net/2011/01/how-to-fix-csv-data-file.html</link><category>CSV</category><category>data exchange</category><category>validation</category><pubDate>Sun, 9 Jan 2011 16:20:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-5740949775838666501</guid><description>&lt;div&gt;New&amp;nbsp;functionality in Flat File Checker allows very&amp;nbsp;intuitive&amp;nbsp;and quick way to correct data in the text file&amp;nbsp;(csv, etc.).&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;To correct data in a file you can set up validation rules in Flat File Checker and run validation (see &lt;a href="http://blog.flat-file.net/2010/04/how-to-validate-csv-file.html"&gt;how to set up validation of CSV file&lt;/a&gt;&amp;nbsp;in previous post).&amp;nbsp;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Then you can open data preview form by clicking on Preview in pop-up menu item of the the file:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy39lTx2z9RuexBHb3nhmcdpKOwuydIymXGG6AmD_xtAtwwzhtveblcTzlEzXb-89eNIhcfcO37a9Zxj0yAMnHhdJpokOR1SXZ0aa-xqIOwfJpX39A3OJSm2UqMJ3N7wI5oqyL3OvYagM/s1600/preview-file-menu.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy39lTx2z9RuexBHb3nhmcdpKOwuydIymXGG6AmD_xtAtwwzhtveblcTzlEzXb-89eNIhcfcO37a9Zxj0yAMnHhdJpokOR1SXZ0aa-xqIOwfJpX39A3OJSm2UqMJ3N7wI5oqyL3OvYagM/s400/preview-file-menu.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 1. Right click on the file and select Preview&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;This will open the Data Preview form that shows records from the source file with&amp;nbsp;erroneous records being highlighted:&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyZxUIkGgOT0kNe9rSePvq6FTRt31TO7lMEplzc6MH242L3KPCgEWKQCAPOWg60UdANC6TQlNT_1qL98dPr3zj11Qb0pnyXzkUfIvFag1T7EiFh_byQbJ7FU66KRQoRGIhT13O4gvyKOU/s1600/data-preview.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyZxUIkGgOT0kNe9rSePvq6FTRt31TO7lMEplzc6MH242L3KPCgEWKQCAPOWg60UdANC6TQlNT_1qL98dPr3zj11Qb0pnyXzkUfIvFag1T7EiFh_byQbJ7FU66KRQoRGIhT13O4gvyKOU/s400/data-preview.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 2. Form shows source file.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Now you can edit the values in the table to correct the source file. When you change values in the cells "Apply Changes" button becomes active:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoI_HMRMfoJT8jjXBAXImLPhJcj_L1u7GMJNko34AnFxKAWDsKpdjBfEiQFjAk4TiLxbSuewQ-MWgcL5uYCQ33iiW_HxT3vaZuBGEmztkeffJVEaKg0TByTLeDhFlZSycmGhN5wvR_uik/s1600/data-preview-changed.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoI_HMRMfoJT8jjXBAXImLPhJcj_L1u7GMJNko34AnFxKAWDsKpdjBfEiQFjAk4TiLxbSuewQ-MWgcL5uYCQ33iiW_HxT3vaZuBGEmztkeffJVEaKg0TByTLeDhFlZSycmGhN5wvR_uik/s400/data-preview-changed.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 3. Apply Changes button becomes active if values were changed&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&amp;nbsp;When you click on this button changes are save to the source file:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrI4g6pHMAMByQc3APE7F1B_TbY116QoD20PfrLMoW4dwYNy3EAn03AEB8iRveNInLuyUx1w75-Yq5C8_vdvWeSLkmFe7sPCxJoooahObeN2Gw6Uhj2iqiCJKS0Mdxiu-gW3A5qS9VxSo/s1600/data-preview-applied.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrI4g6pHMAMByQc3APE7F1B_TbY116QoD20PfrLMoW4dwYNy3EAn03AEB8iRveNInLuyUx1w75-Yq5C8_vdvWeSLkmFe7sPCxJoooahObeN2Gw6Uhj2iqiCJKS0Mdxiu-gW3A5qS9VxSo/s400/data-preview-applied.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 4. Changes were applied to the source file&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;Now you can re-run you schema and check whether previously erroneous values are still&amp;nbsp;highlighted in the data preview form.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;You can also delete records from the file by right-clicking on the corresponding records and selecting "Delete Record":&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigEGoWJtGToqB1iQD28SIE7-x1GRAOy9rsbNlgASVYvYk66IfILU2dGbRdQyZtOJN4Nn9wXebSN4XwWfzc2M9dAZppu3W6yTVd8-gJ185vsE1BWA56w3wIyeyDOyDLtwX9a7WqEgG-86U/s1600/data-preview-delete.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigEGoWJtGToqB1iQD28SIE7-x1GRAOy9rsbNlgASVYvYk66IfILU2dGbRdQyZtOJN4Nn9wXebSN4XwWfzc2M9dAZppu3W6yTVd8-gJ185vsE1BWA56w3wIyeyDOyDLtwX9a7WqEgG-86U/s400/data-preview-delete.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 5. Delete record from the source file.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;Record selected for deletion will be crossed out in the table and will be permanently deleted from the source file if "Apply Changes" button is clicked:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidc8MP4icf6QYDrT2z5ni6NY8c8GbmTsdQNgLoqShcLaIix6ZJXEp7_JIbI7hqLX-QQE3NWyGTBSFe1kyC5Czzj4ZDM3hg6lYa2wDqFOjZz_4QsrMVNQkT4IfSFN0RK2zg5qlTEoztkFU/s1600/data-preview-deleted.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidc8MP4icf6QYDrT2z5ni6NY8c8GbmTsdQNgLoqShcLaIix6ZJXEp7_JIbI7hqLX-QQE3NWyGTBSFe1kyC5Czzj4ZDM3hg6lYa2wDqFOjZz_4QsrMVNQkT4IfSFN0RK2zg5qlTEoztkFU/s400/data-preview-deleted.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 6. Record will be deleted from the source file if&lt;br /&gt;
"Apply Changes" button is clicked.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy39lTx2z9RuexBHb3nhmcdpKOwuydIymXGG6AmD_xtAtwwzhtveblcTzlEzXb-89eNIhcfcO37a9Zxj0yAMnHhdJpokOR1SXZ0aa-xqIOwfJpX39A3OJSm2UqMJ3N7wI5oqyL3OvYagM/s72-c/preview-file-menu.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Preview Data with Error Highlighting</title><link>http://blog.flat-file.net/2010/09/preview-data-with-error-highlighting.html</link><category>data preview</category><category>error highlight</category><category>test rules</category><pubDate>Sat, 18 Sep 2010 05:53:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-8710234619862622562</guid><description>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Data Error Preview and Error Highlighting are new features that will make application much easier to work with. This functionality allows to test data rules in the intuitive way plus it allows to test calculated columns.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;This post shows how this new functionality can be used.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;1. Preview&amp;nbsp;delimited text&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;&lt;b&gt;&amp;nbsp;data&amp;nbsp;file before it is added to the schema:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Drag &amp;amp; drop sample data file into the new schema and click on the Preview Data button at the bottom of the File Definition from:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPjRctOpc9yc7FwCchIhM1IDv1oM8K1sj5LKuCszWJShACfer9f59xP6PF6A7Z6ZN_1afcj_dnmWaOEgEc3ibqL8bF8BCbbNe0U3oySKbPeyS2Isk3y6Yet70-YTYEq582zmyUVAVX-Ho/s1600/gui_file_definition_preview.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPjRctOpc9yc7FwCchIhM1IDv1oM8K1sj5LKuCszWJShACfer9f59xP6PF6A7Z6ZN_1afcj_dnmWaOEgEc3ibqL8bF8BCbbNe0U3oySKbPeyS2Isk3y6Yet70-YTYEq582zmyUVAVX-Ho/s320/gui_file_definition_preview.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 1. File Details Form&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;This will open data preview form:&lt;/div&gt;&lt;div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-TwWObb9DjfDYFAgykN7B8zaZBttFuzJiwtxQQf9SRpfX6W0YigD3gL3cVwwZULNKCfS0TRWNWSCT-zLccNDoTqRiymyEGctzkgIs6TklEwJ_5B7xSUCdj34JixuGhIsBzE2wKUI6kkE/s1600/gui_data_preview.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-TwWObb9DjfDYFAgykN7B8zaZBttFuzJiwtxQQf9SRpfX6W0YigD3gL3cVwwZULNKCfS0TRWNWSCT-zLccNDoTqRiymyEGctzkgIs6TklEwJ_5B7xSUCdj34JixuGhIsBzE2wKUI6kkE/s400/gui_data_preview.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 2. Data Preview Form&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;2. Test rules after the validation has been run&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Add rules to you schema and click on Run Checks button. After execution is complete right click on the file in the in the main form of the application and select &lt;b&gt;&lt;i&gt;Preview&lt;/i&gt;&lt;/b&gt; in the pop-up menu. This will bring the same form with errors being highlighted:&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIVITXxEJcAUPeYc5ehSbqpsoXNYWMSuBVFjtJi1ra2-qhKyAftS6ICemtGh87GhYnLJ9b6X-1YDxiKIyRZUKlMNvuZ00_5pnn699ATuQHq6cv8gG-9DpXehIaKMBjtr8om3kF6vuzGuQ/s1600/gui_data_preview_form_err.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIVITXxEJcAUPeYc5ehSbqpsoXNYWMSuBVFjtJi1ra2-qhKyAftS6ICemtGh87GhYnLJ9b6X-1YDxiKIyRZUKlMNvuZ00_5pnn699ATuQHq6cv8gG-9DpXehIaKMBjtr8om3kF6vuzGuQ/s400/gui_data_preview_form_err.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 3. Data Preview with Highlights&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;If you have calculated columns in you file they will appear in the right-end of the table&amp;nbsp;highlighted blue if value is correct or&amp;nbsp;&amp;nbsp;light violet if it contains error (see column &lt;i&gt;&lt;b&gt;DaysBetween &lt;/b&gt;&lt;/i&gt;in Figure 3 above).&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPjRctOpc9yc7FwCchIhM1IDv1oM8K1sj5LKuCszWJShACfer9f59xP6PF6A7Z6ZN_1afcj_dnmWaOEgEc3ibqL8bF8BCbbNe0U3oySKbPeyS2Isk3y6Yet70-YTYEq582zmyUVAVX-Ho/s72-c/gui_file_definition_preview.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Match Records on Number in the Address Line</title><link>http://blog.flat-file.net/2010/06/match-records-on-number-in-address-line.html</link><category>Fuzzy</category><category>Leading Number</category><category>Match Duplicates</category><category>Trailing Number</category><pubDate>Fri, 11 Jun 2010 15:10:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-2831045153659610064</guid><description>&lt;div&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt;Usually &lt;i&gt;Address Line 1&lt;/i&gt;&amp;nbsp;in the customer data contains house or flat number and we can safely match records using these numbers if postcodes are provided. This approach can&amp;nbsp;significantly improve the match rate with minimum risk of false matching.&amp;nbsp;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;VB Expressions&lt;/b&gt;&lt;/div&gt;&lt;div&gt;You can easily extract the number and use it for matching in Flat File Checker with those functions:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #20124d;"&gt;&lt;b&gt;LeadingNumber(string)&lt;/b&gt;&lt;/span&gt; - gets the number from the&amp;nbsp;beginning&amp;nbsp;of the string if it starts with number, returns original string otherwise;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #20124d;"&gt;TrailingNumber(string)&lt;/span&gt;&lt;/b&gt; - gets the number from the end of the string if it ends with number, returns original string otherwise;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #20124d;"&gt;&lt;b&gt;GetNumbers(string)&lt;/b&gt;&lt;/span&gt; - gets all numbers from the string if it contains numbers, returns original string otherwise.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Address Line Example&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Original file with customer details contains [Address 1] field. From this field we want to create a derived field that will contain either leading number or the original value if address line does not start with number. To create a field:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Right click in the Fields area on the Main form and select &lt;i&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #20124d;"&gt;Add-&amp;gt;Calculated Field &lt;span class="Apple-style-span" style="font-style: normal; font-weight: normal;"&gt;in the pop-up menu;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Fill in field details following example on the Figure 1;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ2WmiKIX6tYfuFEyQDNPiKm07T7rdi5T2tykbvNSp6vLkXQ6S1PMP5h02ZFUkwc2beJfxSsd7DDLAMgRQqP8l89C1-tG-WPNm9qEWFYcH2bpkGY-F6rTy7ygm1kleyekp7IUkYK_lvmM/s1600/leading-number-example.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ2WmiKIX6tYfuFEyQDNPiKm07T7rdi5T2tykbvNSp6vLkXQ6S1PMP5h02ZFUkwc2beJfxSsd7DDLAMgRQqP8l89C1-tG-WPNm9qEWFYcH2bpkGY-F6rTy7ygm1kleyekp7IUkYK_lvmM/s640/leading-number-example.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Figure 1. Extract Leading Number from Address Line.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;Match Records&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Unique constraint must be used to match records using our new derived field:&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0K8a2nOZy2vF-Zoh1WOomxuIGmlbLnqN5Rx-8SskrEsRJh2uS1LFDQ7fv6aZ-0nMDySsB2z57j-wW5WlTlFeBu28xJi0r_8_QcDLb5VWI-DqYNb2GlNsIfkHngwGZrFsBob3ZBEP3RLI/s1600/match-with-unique-rule.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0K8a2nOZy2vF-Zoh1WOomxuIGmlbLnqN5Rx-8SskrEsRJh2uS1LFDQ7fv6aZ-0nMDySsB2z57j-wW5WlTlFeBu28xJi0r_8_QcDLb5VWI-DqYNb2GlNsIfkHngwGZrFsBob3ZBEP3RLI/s320/match-with-unique-rule.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Figure 2. Unique Constraint Form.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ2WmiKIX6tYfuFEyQDNPiKm07T7rdi5T2tykbvNSp6vLkXQ6S1PMP5h02ZFUkwc2beJfxSsd7DDLAMgRQqP8l89C1-tG-WPNm9qEWFYcH2bpkGY-F6rTy7ygm1kleyekp7IUkYK_lvmM/s72-c/leading-number-example.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Thesaurus Class (VB.Net)</title><link>http://blog.flat-file.net/2010/05/thesaurus-class.html</link><category>Class</category><category>CodeProject</category><category>thesaurus</category><category>VB.NET</category><pubDate>Fri, 28 May 2010 09:52:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-3837254031071867409</guid><description>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;
In some cases two values with similar meaning should be matched. I have created a Thesaurus class based on &lt;a href="http://msdn.microsoft.com/en-us/library/system.collections.hashtable%28VS.71%29.aspx"&gt;Hashtable&lt;/a&gt; to realise this functionality.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Source Code(vb.net)&lt;/b&gt;&lt;br /&gt;
Download thesaurus classes &lt;a href="http://www.flat-file.net/downloads/code/thesaurus.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Thesaurus File&lt;/b&gt;&lt;br /&gt;
The thesaurus source file is text file that contains a group of synonyms in each line separated by the specified char (see example file for nicknames with &amp;gt; used as value separator &lt;a href="http://www.flat-file.net/downloads/nicknames.txt"&gt;here&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using the Code&lt;/b&gt;&lt;br /&gt;
Here is an example in which I compare two forenames using the &lt;i&gt;Nicknames &lt;/i&gt;thesaurus file:&lt;br /&gt;
&lt;pre class="vb" lang="vb.net" name="code"&gt;Public Sub test_thesaurus() As Boolean
 Dim t As New Thesaurus("Nicknames","c:\nicknames.txt", "&amp;gt;"c)
 t.Load()
 Dim s1 As String = "Robert"
 Dim s2 As String = "Bob"
 Return  (t.GetKey(s2) = t.GetKey(s1))
End Sub
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Similarity Distance&lt;/b&gt;&lt;br /&gt;
One thing that can be also useful is distance between synonyms. Now you can specify distance value enclosed in square brackets in the thesaurus file. This functionality can be extended for score based matching.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.codeproject.com/script/Membership/View.aspx?mid=5425273" rel="tag" style="display: none;"&gt;CodeProject&lt;/a&gt;</description><author>bulat@flat-file.net (Bulat Yapparov)</author><enclosure length="6176" type="application/zip" url="http://www.flat-file.net/downloads/code/thesaurus.zip"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>Introduction In some cases two values with similar meaning should be matched. I have created a Thesaurus class based on Hashtable to realise this functionality. Source Code(vb.net) Download thesaurus classes here. Thesaurus File The thesaurus source file is text file that contains a group of synonyms in each line separated by the specified char (see example file for nicknames with &amp;gt; used as value separator here). Using the Code Here is an example in which I compare two forenames using the Nicknames thesaurus file: Public Sub test_thesaurus() As Boolean Dim t As New Thesaurus("Nicknames","c:\nicknames.txt", "&amp;gt;"c) t.Load() Dim s1 As String = "Robert" Dim s2 As String = "Bob" Return (t.GetKey(s2) = t.GetKey(s1)) End Sub Similarity Distance One thing that can be also useful is distance between synonyms. Now you can specify distance value enclosed in square brackets in the thesaurus file. This functionality can be extended for score based matching. CodeProject</itunes:subtitle><itunes:author>Bulat Yapparov</itunes:author><itunes:summary>Introduction In some cases two values with similar meaning should be matched. I have created a Thesaurus class based on Hashtable to realise this functionality. Source Code(vb.net) Download thesaurus classes here. Thesaurus File The thesaurus source file is text file that contains a group of synonyms in each line separated by the specified char (see example file for nicknames with &amp;gt; used as value separator here). Using the Code Here is an example in which I compare two forenames using the Nicknames thesaurus file: Public Sub test_thesaurus() As Boolean Dim t As New Thesaurus("Nicknames","c:\nicknames.txt", "&amp;gt;"c) t.Load() Dim s1 As String = "Robert" Dim s2 As String = "Bob" Return (t.GetKey(s2) = t.GetKey(s1)) End Sub Similarity Distance One thing that can be also useful is distance between synonyms. Now you can specify distance value enclosed in square brackets in the thesaurus file. This functionality can be extended for score based matching. CodeProject</itunes:summary><itunes:keywords>Class, CodeProject, thesaurus, VB.NET</itunes:keywords></item><item><title>AnyValue and NullValue</title><link>http://blog.flat-file.net/2010/05/anyvalue-and-nullvalue.html</link><category>Any Value</category><category>Match Duplicates</category><category>Null Value</category><category>Release v.0.7.0.9</category><pubDate>Wed, 26 May 2010 13:58:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-2315970853590074555</guid><description>I came a cross a difficulty with matching duplicate contact records due to the issue with special values in some of the fields. For example &lt;b&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #0c343d;"&gt;Dr&amp;nbsp;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;the &lt;b&gt;Titles &lt;/b&gt;field should match any other value - Mr/Sir/Mrs/Ms. On the other hand if &lt;span class="Apple-style-span" style="color: #0c343d;"&gt;&lt;b&gt;&lt;i&gt;Unknown&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;was found in the address line it should not be matched to any other value including itself.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
To overcome this problem&amp;nbsp;I have added functionality that supports following parameters in &lt;b&gt;Column &lt;/b&gt;node of the &lt;b&gt;Unique &lt;/b&gt;constraint:&lt;br /&gt;
1. &lt;b&gt;&lt;span class="Apple-style-span" style="color: #20124d;"&gt;AnyValue - &lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;value that equals any other element&lt;b&gt;&lt;span class="Apple-style-span" style="color: #20124d;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;--- if this parameter is set, then value in the field that equals to parameter's value will match values in all other records. By setting this parameter you will get more matches and therefore can increase the number of false matches.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
2. &lt;span class="Apple-style-span" style="color: #20124d;"&gt;&lt;b&gt;NullValue -&amp;nbsp;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;value that does not equal any element including itself&lt;span class="Apple-style-span" style="color: #20124d;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;--- if this parameter is set, then row where field equals to parameter's value will not match any other row in the file. By setting this parameter you will get more unique records and therefore less false matches. &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #20124d;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black; font-weight: normal;"&gt;Schema example for contact details matching: &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="xml" lang="xml" name="code"&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;
&amp;lt;?xml-stylesheet type='text/xsl' href='http://www.flat-file.net/schema/file-set.xslt'?&amp;gt;
&amp;lt;Files ErrorLog="data.log" ExecutionLog="execution.log"&amp;gt;
  &amp;lt;Synonyms&amp;gt;
    &amp;lt;Synonym Name="Nicknames" File="C:\match\nicknames.txt" Delimiter="&amp;gt;" /&amp;gt;
    &amp;lt;Synonym Name="Titles" File="C:\match\titles.txt" Delimiter="&amp;gt;" /&amp;gt;
  &amp;lt;/Synonyms&amp;gt;
  &amp;lt;File Alias="Contacts" 
Name="contacts.csv" 
HasHeader="True" 
Path="C:\match\" 
StringQualifier='"' 
Delimiter=","&amp;gt;
    &amp;lt;Columns&amp;gt;
      &amp;lt;Column Name="ContactKey" Index="0"&amp;gt;
        &amp;lt;Unique&amp;gt;
          &amp;lt;Action&amp;gt;
            &amp;lt;DupesReport Path="C:\match\duplicates.csv" /&amp;gt;
          &amp;lt;/Action&amp;gt;
          &amp;lt;Column Name="Address_Line1" /&amp;gt;
          &amp;lt;Column Name="Postcode" Index="Hash" /&amp;gt;
          &amp;lt;Column Name="NickName" NullValue='' /&amp;gt;
          &amp;lt;Column Name="SoundSurname" /&amp;gt;
          &amp;lt;Column Name="Gender" AnyValue='U' /&amp;gt;
          &amp;lt;Column Name="Initials" /&amp;gt;
        &amp;lt;/Unique&amp;gt;
      &amp;lt;/Column&amp;gt;
      &amp;lt;Column Name="Title" /&amp;gt;
      &amp;lt;Column Name="Forenames" /&amp;gt;
      &amp;lt;Column Name="Initials" /&amp;gt;
      &amp;lt;Column Name="Surname" /&amp;gt;
      &amp;lt;Column Name="Address_Line1" /&amp;gt;
      &amp;lt;Column Name="Postcode" /&amp;gt;
    &amp;lt;/Columns&amp;gt;
    &amp;lt;Expressions&amp;gt;
      &amp;lt;Expression Name="NickName" Value="[Synonym('Nicknames',Field('Forenames'))]" /&amp;gt;
      &amp;lt;Expression Name="SoundSurname" Value="[Soundex(Field('Surname'))]" /&amp;gt;
      &amp;lt;Expression Name="Gender" Value="[Synonym('Titles',Field('Title'))]" /&amp;gt;
    &amp;lt;/Expressions&amp;gt;
  &amp;lt;/File&amp;gt;
&amp;lt;/Files&amp;gt;&lt;/pre&gt;&lt;br /&gt;
The the source file for the schema above must contain the following fields in the header:&lt;br /&gt;
&lt;div style="color: #0c343d;"&gt;&lt;b&gt;&lt;i&gt;ContactKey,Title,Forenames,Initials, Surname, Address_Line1, Postcode&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
You can use both &lt;b&gt;AnyValue &lt;/b&gt;and &lt;b&gt;NullValue &lt;/b&gt;in the same field.&lt;br /&gt;
&lt;br /&gt;
If you want to define more then one value of special type, then check &amp;nbsp;&lt;a href="http://blog.flat-file.net/2010/05/match-synonym-values-via-custom.html"&gt;thesaurus functionality&lt;/a&gt; which can be used in combination with AnyValue/NullValue to achieve this.&lt;br /&gt;
&lt;br /&gt;
You can try thesaurus files that were used in the sample schema:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.flat-file.net/downloads/nicknames.txt"&gt;nicknames.txt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.flat-file.net/downloads/titles.txt"&gt;titles.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Match synonym values via custom thesaurus</title><link>http://blog.flat-file.net/2010/05/match-synonym-values-via-custom.html</link><category>duplicates</category><category>match</category><category>synonym</category><category>thesaurus</category><pubDate>Wed, 5 May 2010 09:42:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-5036786589630905549</guid><description>&lt;h4&gt;Introduction&lt;/h4&gt;&lt;div style="margin: 0px;"&gt;Sometimes different values have same or similar meaning making it more difficult to find duplicates with exact or even approximate string matching.&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin: 0px;"&gt;To help you to find more duplicate records a functionality that supports thesaurus files was implemented.&amp;nbsp; Thesaurus files are the text files with groups of synonyms at each line separated by a specified character: &lt;/div&gt;&lt;hr /&gt;&lt;pre style="color: black; margin: 0px;"&gt;...
alex,alexandr,sasha
bob,robert
...
&lt;/pre&gt;&lt;hr /&gt;&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;/pre&gt;&lt;div style="margin: 0px;"&gt;Similar approach was used by Oracle in &lt;a href="http://download-llnw.oracle.com/docs/cd/E13183_01/en/alui/ali/docs65/AdministratorGuide_ALI_6-5/con_search_thesaurusfile.html"&gt;search functionality&lt;/a&gt; for AquaLogic.&lt;br /&gt;
&lt;br /&gt;
To get synonym from the thesaurus file for specific value the &lt;b style="color: #073763;"&gt;Synonym(string, string)&lt;/b&gt; should be used with following parameters:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b style="color: #073763;"&gt;name &lt;/b&gt;- name of the thesaurus file (see Figure 1);&lt;/li&gt;
&lt;li&gt;&lt;b style="color: #073763;"&gt;value &lt;/b&gt;- string value for which synonym needs to be found in thesaurus.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;h4&gt;Adding thesaurus functionality to the schema&lt;/h4&gt;&lt;div style="margin: 0px;"&gt;1. Create thesaurus file(s) for titles, forenames, countries, etc. (see examples: &lt;a href="http://www.flat-file.net/downloads/nicknames.txt"&gt;Nickname&lt;/a&gt;, &lt;a href="http://www.flat-file.net/downloads/titles.txt"&gt;Titles&lt;/a&gt;)&lt;br /&gt;
2. Add thesaurus file to the schema.&amp;nbsp;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;Before using Synonym function you will need to add thesaurus file to the schema.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Open "Thesaurus Files" form through main menu&lt;i&gt;&lt;b&gt; Options-&amp;gt;Thesauruses;&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Specify thesaurus logical/alias name, file path and value delimiter (see Figure 1).&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div style="margin: 0px;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVLHmEMrpxYGHaxFxEMJa87oc-mSwVECMlPCtJt6ENB0oImJx1LFOdB5Axq3eF57LFCZsiH5wIVPMR-y-LvTNZfeHAYstjU7kKBg7bYlnoP7n5AxK7gMf3leuuDtJG_WABssv6A0E-Q1w/s1600/thesaurus-file-locations.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Thesaurus Files Form" border="0" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVLHmEMrpxYGHaxFxEMJa87oc-mSwVECMlPCtJt6ENB0oImJx1LFOdB5Axq3eF57LFCZsiH5wIVPMR-y-LvTNZfeHAYstjU7kKBg7bYlnoP7n5AxK7gMf3leuuDtJG_WABssv6A0E-Q1w/s400/thesaurus-file-locations.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Figure 1. Thesaurus Files Form&lt;/div&gt;&lt;br /&gt;
3. Create calculated field.&lt;br /&gt;
After the thesaurus file is added to the schema, add new calculated field that will contain results of&amp;nbsp;Synonym() function.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFHaEc4xgXJSuV554OxYhTrHOlGuC-1-PeNlZZpgZazjrAxUwrzIYGKEsjumw9dTnC162ZNCGdWxahL6ftS4nd1kb0tBZYk_n_72ogOi2chk8sIDFtzADFyQzEbRPUIprbJJjy2-Lgt9Q/s1600/synonym-field-details.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Calculated Field Details" border="0" height="257" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFHaEc4xgXJSuV554OxYhTrHOlGuC-1-PeNlZZpgZazjrAxUwrzIYGKEsjumw9dTnC162ZNCGdWxahL6ftS4nd1kb0tBZYk_n_72ogOi2chk8sIDFtzADFyQzEbRPUIprbJJjy2-Lgt9Q/s400/synonym-field-details.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Figure 2. Calculated Field Details&lt;/div&gt;&lt;br /&gt;
4. Check computed field in the unique constraint&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;add &lt;b&gt;Unique &lt;/b&gt;constraint to the primary key of the file;&lt;/li&gt;
&lt;li&gt;double click on the constraint node and check the fields to be included in the data rule.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVLHmEMrpxYGHaxFxEMJa87oc-mSwVECMlPCtJt6ENB0oImJx1LFOdB5Axq3eF57LFCZsiH5wIVPMR-y-LvTNZfeHAYstjU7kKBg7bYlnoP7n5AxK7gMf3leuuDtJG_WABssv6A0E-Q1w/s72-c/thesaurus-file-locations.JPG" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>How to validate CSV file</title><link>http://blog.flat-file.net/2010/04/how-to-validate-csv-file.html</link><category>Check</category><category>CSV</category><category>Data Validation</category><pubDate>Fri, 9 Apr 2010 09:32:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-5664144606288520800</guid><description>&lt;h4&gt;Introduction&lt;/h4&gt;It is often required to validate a CSV file or other pseudo formatted data against a set of business rules. Though MS Excel offers data validation functionality for simple checks, it is often not enough for advanced data quality assurance.&lt;br /&gt;
&lt;br /&gt;
Flat File Checker is the best option for data validation if you are facing any of those tasks:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Validation of large data file&lt;/li&gt;
&lt;li&gt;Regular validation of files with same or&amp;nbsp;similar structure&lt;/li&gt;
&lt;li&gt;Validation against a set of complex data rules&lt;/li&gt;
&lt;li&gt;Automated data validation / batch processing&lt;/li&gt;
&lt;/ul&gt;It takes few easy steps to validate a file.&lt;br /&gt;
&lt;h4&gt;1. Install Flat File Checker&lt;/h4&gt;1.1 Download Windows installer from &lt;a href="http://sourceforge.net/projects/flafi/"&gt;SourceForge.net&lt;/a&gt;.&lt;br /&gt;
1.2 Install application (click OK on all screens through installation process).&lt;br /&gt;
1.3 Open the application (&lt;strong&gt;&lt;span style="color: #351c75;"&gt;&lt;em&gt;FlaFi -&amp;gt;FlatFileChecker&lt;/em&gt;&lt;/span&gt;&lt;/strong&gt; in the Start menu)&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;2. Create schema with a file&lt;/h4&gt;&lt;h5&gt;2.1 New Schema&lt;/h5&gt;Click on Create New Schema button in the main toolbar which will activate files and fields areas of the form:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6yoAdibFe5c/S78or4mkh5I/AAAAAAAC6g/T40xvsh-TMo/s1600/create-new-schema.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLVEY8QfQwU7fMgqEspJDIB32k1L9dPzg05ksxIlBuaMkDNlPVHM4IE3txFxuF1_OJXzObOsgv5ILO2SY6QHPxI-SyYZvBRvNsFMz2LfYGOmXN8ecGXmnM9idhPBG41BXGumafKTrQqMw/s400/create-new-schema.jpg" width="400" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h5&gt;2.2 Add File&lt;/h5&gt;Now Drag &amp;amp; Drop your data file to the files area of the form:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOMbwnV4bye6CB6gIYVvulr9RcJYhPlhD6zczwWW-EURgoe47PqXXCVui5ihvCaolHRgA6LYqxMMBccUL9VQujS1oqJGV8_GlNkjt9DrbRzhRO9A_E6uXkseLJNYX3P11VYY0aswP3aMo/s1600/drag-and-drop-file.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOMbwnV4bye6CB6gIYVvulr9RcJYhPlhD6zczwWW-EURgoe47PqXXCVui5ihvCaolHRgA6LYqxMMBccUL9VQujS1oqJGV8_GlNkjt9DrbRzhRO9A_E6uXkseLJNYX3P11VYY0aswP3aMo/s640/drag-and-drop-file.jpg" width="640" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="left" class="separator"&gt;This will open a File Details form where you must provide your file details in the underlined fields:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaRHoQwn_ZYfJui60rcEGgM9vV_KVmFb-74Zi-b7QrCY12I6niTqxQrZNIehd9hY4y3TRQBaOPwAxTAVd5jQpcIY8YUonFas9M1OUYunABg_A9aaai2ERDh7_zmJ-U7r5czKZTZK6tQRA/s400/file-definition.jpg" width="342" wt="true" /&gt;&lt;/div&gt;&lt;div align="left" class="separator"&gt;After you click OK in File Definition form, File will appear in the Files area and fields from the header will be created and appear in the Fields area:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1GkyDWr8GkcgrzjgvmMnVlb-qlK9pJ_lmyjDbDmGyN8skovBqCRH2hm228imLM__MWNBFu-f5Pd7bPYBYnTEjvxj1m5G6WBxwU1Soo4Z8-JvWbbsD6IbNbjrYDKU1RLuSDD1gNWXTN68/s400/schema-with-file.jpg" width="400" wt="true" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="left" class="separator"&gt;Now we can save the schema.&lt;/div&gt;&lt;h4&gt;3. Add Data Rules&lt;/h4&gt;&lt;div align="left" class="separator"&gt;Here I will show how to add most common data rules.&lt;/div&gt;&lt;h5&gt;3.1. Required&lt;/h5&gt;&lt;div align="left" class="separator"&gt;To&amp;nbsp;disallow Empty/Null values in the field double click on&amp;nbsp;it in the Fields list which will open&amp;nbsp;Field Details form.&lt;/div&gt;&lt;div align="left" class="separator"&gt;Then right click on the Rules node in the rule builder and select &lt;span style="color: #0c343d;"&gt;&lt;strong&gt;&lt;em&gt;Add-&amp;gt;Required&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt; in the pop-up menu:&lt;/div&gt;&lt;div align="center" class="separator"&gt;&amp;nbsp;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMk7yU3Psu1mpj-Cq8wAkARolQRLwcDhyphenhyphenXzlpowZ5jSROEMvjI4KMYzXt0V3xk8-4ELXMyDXPfnjiW2mxbVxu08X37CgOB9Nbn1I_XfhmYX61LyHLAu-QiR0KynOoNlIPpMwg6acLdtdA/s1600/required-add.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMk7yU3Psu1mpj-Cq8wAkARolQRLwcDhyphenhyphenXzlpowZ5jSROEMvjI4KMYzXt0V3xk8-4ELXMyDXPfnjiW2mxbVxu08X37CgOB9Nbn1I_XfhmYX61LyHLAu-QiR0KynOoNlIPpMwg6acLdtdA/s640/required-add.jpg" width="640" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h5&gt;3.2 Dates&lt;/h5&gt;&lt;div align="left" class="separator"&gt;Dates validation can be a bit tricky as time "goes" ahead and we need to appreciate its dynamic nature.&lt;/div&gt;&lt;div align="left" class="separator"&gt;Let's say for example, that all contacts in our file should be at least 18 years old and we want data rule to work today, tomorrow or any time.&lt;/div&gt;&lt;div align="left" class="separator"&gt;Therefore, we cannot just put static value, i.e.&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #274e13;"&gt; &lt;/span&gt;&lt;span style="color: #38761d; font-size: x-small;"&gt;&lt;strong&gt;08/04/1982&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt; in the data rule. Thanks to Flat File Checker's support of VB Expression we can easily overcome this issue.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;
&lt;div align="left" class="separator"&gt;Double click one of the date fields in (if you have any in your file), which is Date_of_Birth in this example;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
&lt;div align="left" class="separator"&gt;Right click on Rule node in rule build and select &lt;strong&gt;&lt;em&gt;&lt;span style="color: #0c343d;"&gt;Add-&amp;gt;Value Constraint;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
&lt;div align="left" class="separator"&gt;&lt;span style="color: black;"&gt;In the appeared fill-in rule details:&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div align="center" class="separator"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji1ARWZR4jYGkd0JnUpVrEA-1VCse_6268r3ZcImZ8XLNomqSjzKrs8T18SY3sUjE_OiJ38ElX0i8GqPG2_gx9gKl69i4Sckjrc8k0mw9HjTyBCCYxGtl8W27SOQPYf26VtOCfI2tPJZM/s1600/data-value-rule.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji1ARWZR4jYGkd0JnUpVrEA-1VCse_6268r3ZcImZ8XLNomqSjzKrs8T18SY3sUjE_OiJ38ElX0i8GqPG2_gx9gKl69i4Sckjrc8k0mw9HjTyBCCYxGtl8W27SOQPYf26VtOCfI2tPJZM/s400/data-value-rule.jpg" width="400" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="left" class="separator"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div align="left" class="separator"&gt;&lt;span style="color: #990000;"&gt;Notice:&lt;/span&gt; &lt;/div&gt;In this example value is enclosed in square brackets to indicate that it contains VB Expression:&lt;br /&gt;
&lt;div align="left" class="separator"&gt;&lt;/div&gt;&lt;pre class="vb.net" lang="vb.net" name="code"&gt;Format(Now.AddYears(-18),'dd/MM/yyyy')
&lt;/pre&gt;&lt;br /&gt;
Finally we need to populate Date Format field and check Allow Null Values is it is&amp;nbsp;OK for Date_of_Birth field to be blank:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY-eBJXbeXRmXWKxBV6AZ9ieOrDs5J_-QQbWfv_9BJZs88hyIsSGyBVYoTqp4trdZtxAMxhMdNqBq6wEoOTMqo5iqhp8EGcIXhSWBqZbeQ6Mbr0OE627_peuYbjRDblEEpRBvcQdox_ec/s1600/date-field-details.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY-eBJXbeXRmXWKxBV6AZ9ieOrDs5J_-QQbWfv_9BJZs88hyIsSGyBVYoTqp4trdZtxAMxhMdNqBq6wEoOTMqo5iqhp8EGcIXhSWBqZbeQ6Mbr0OE627_peuYbjRDblEEpRBvcQdox_ec/s640/date-field-details.jpg" width="640" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;Now click on OK button to keep all changes in the schema.&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;3.3 Regular Expressions&lt;/h5&gt;To add regular expression validation to the schema:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Double click on the field to open Field Details form;&lt;/li&gt;
&lt;li&gt;Right click on Rules node and select &lt;span style="color: #0c343d;"&gt;&lt;strong&gt;&lt;em&gt;Add-&amp;gt;Value Constraint&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt;Select REGEXP as operator and provide regular expression (UK Postcode in the screenshot): &lt;/li&gt;
&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="42" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA2hqDcvHDP42DFfaIk5TRBZTLw_xue4PQ_VtZ-poXMQLaEICUIsrNWfgEfeJUjpsBbEVF6lGq52TXEPli3PXbw2opXUJiFhwjmjZctR6UbRFGBYrTY5L-ehRmK5khjoZLUhKrHCkcg1s/s400/regexp-value-rule.jpg" width="400" wt="true" /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Click on &lt;span style="color: #274e13;"&gt;&lt;strong&gt;Y &lt;/strong&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;button of the control and OK button of the form to save changes.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h5&gt;3.4 External Lookup&lt;/h5&gt;It is also common requirement that all values in the data file belong to a defined set of values.&lt;br /&gt;
If you have a lookup file that contains this values (vocabulary or primary data) then you can easily validate data against this file with Flat File Checker.&lt;br /&gt;
&lt;br /&gt;
Drag &amp;amp; drop lookup file to files are of the Main form and populate file details (tick on Lookup checkbox).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSUV3JVL9uUxGGKJ7lit1hyjNk97s1mWhbUtdr9eqX95XZEjOAZSb4SZmRk6RLlNlivOHyrH2f_iRCGUJ8_uVfeQcT1c9Y5br4gBHphIuZ_1YIx2J07Ff3-XUZSf9GGvicRaeYPAlp3zs/s1600/file-definition-lookup.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSUV3JVL9uUxGGKJ7lit1hyjNk97s1mWhbUtdr9eqX95XZEjOAZSb4SZmRk6RLlNlivOHyrH2f_iRCGUJ8_uVfeQcT1c9Y5br4gBHphIuZ_1YIx2J07Ff3-XUZSf9GGvicRaeYPAlp3zs/s320/file-definition-lookup.jpg" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Click on Links button in the main menu after the file is added to the schema.&lt;br /&gt;
&lt;br /&gt;
In the Links form select &lt;span style="color: #134f5c;"&gt;MyData.Title&lt;/span&gt; as Foreign Key and &lt;strong&gt;&lt;span style="color: #134f5c;"&gt;Titles.Title&lt;/span&gt;&lt;/strong&gt; as Primary Key and tick Enforce:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgobC9iXXsN5e4ZQZfpAlHCL4Hys9ppaRQeJnlchVdVdZiFmMVIycmfeByD7GSX1JIDFpt53AByvf0ViZ9HtoRebVQbS18EhLB7X6_DeFgrPCmzN0n0ezpeJ6TptY_-Hp8eQ7q9MVL1rEQ/s640/create-link.jpg" width="640" wt="true" /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&amp;nbsp;Click Add button to add link to the schema. Then press OK to close File Links form and save changes.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;4. Execute schema&lt;/h4&gt;To validate file click on Run Checks button in the toolbar:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEECpAJiTiwywAqvillLfQav49iyBNTb7amZDZMNIITYwpMvNrfToIQwKrkwYsiGXPEd6xMpcDHVXPeS9owyWNMFmW18HWzGVx0CpZCoJPixOTgMVUhdOUyX97YNdSWR3s7C4Ulm-S8FM/s1600/run-checks.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEECpAJiTiwywAqvillLfQav49iyBNTb7amZDZMNIITYwpMvNrfToIQwKrkwYsiGXPEd6xMpcDHVXPeS9owyWNMFmW18HWzGVx0CpZCoJPixOTgMVUhdOUyX97YNdSWR3s7C4Ulm-S8FM/s320/run-checks.jpg" width="320" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
You will see progress bar while file is being validated which will be replaced by "CHECK COMPLETE" in the end of the processing:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAf284VPr7vWzIWp1nrWA9Thm9YuteOjZZ267kOpKpufed6BUQ4yiU5YU3Lt7uHMQy3LMfxCwbuwEMeZOTczz2KaXL307o3d97iUfB2dZ2wAaTw0FcXtcf25lktjdqcKNYiO738X6cWv8/s1600/progress-bar.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="44" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAf284VPr7vWzIWp1nrWA9Thm9YuteOjZZ267kOpKpufed6BUQ4yiU5YU3Lt7uHMQy3LMfxCwbuwEMeZOTczz2KaXL307o3d97iUfB2dZ2wAaTw0FcXtcf25lktjdqcKNYiO738X6cWv8/s320/progress-bar.jpg" width="320" wt="true" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h4&gt;5. View and correct errors&lt;/h4&gt;Now you can click on Show Errors button in the toolbar to open Data Errors form in which you can see and correct errors.&lt;br /&gt;
&lt;h4&gt;6. Other information sources on how to use Flat File Checker&lt;/h4&gt;6.1 How to thread on the &lt;a href="http://www.flat-file.net/forum/viewforum.php?f=13"&gt;Forum&lt;/a&gt;.&lt;br /&gt;
6.2 See online documentation &lt;a href="http://www.flat-file.net/help"&gt;here&lt;/a&gt;.&lt;br /&gt;
please feel free to contact me with any questions about Flat File Checker - &lt;a href="mailto:info@flat-file.net"&gt;info@flat-file.net&lt;/a&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLVEY8QfQwU7fMgqEspJDIB32k1L9dPzg05ksxIlBuaMkDNlPVHM4IE3txFxuF1_OJXzObOsgv5ILO2SY6QHPxI-SyYZvBRvNsFMz2LfYGOmXN8ecGXmnM9idhPBG41BXGumafKTrQqMw/s72-c/create-new-schema.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author><enclosure length="28598" type="application/octet-stream" url="http://www.flat-file.net/forum/viewforum.php?f=13"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>IntroductionIt is often required to validate a CSV file or other pseudo formatted data against a set of business rules. Though MS Excel offers data validation functionality for simple checks, it is often not enough for advanced data quality assurance. Flat File Checker is the best option for data validation if you are facing any of those tasks: Validation of large data file Regular validation of files with same or&amp;nbsp;similar structure Validation against a set of complex data rules Automated data validation / batch processing It takes few easy steps to validate a file. 1. Install Flat File Checker1.1 Download Windows installer from SourceForge.net. 1.2 Install application (click OK on all screens through installation process). 1.3 Open the application (FlaFi -&amp;gt;FlatFileChecker in the Start menu) 2. Create schema with a file2.1 New SchemaClick on Create New Schema button in the main toolbar which will activate files and fields areas of the form: 2.2 Add FileNow Drag &amp;amp; Drop your data file to the files area of the form: This will open a File Details form where you must provide your file details in the underlined fields:After you click OK in File Definition form, File will appear in the Files area and fields from the header will be created and appear in the Fields area: Now we can save the schema.3. Add Data RulesHere I will show how to add most common data rules.3.1. RequiredTo&amp;nbsp;disallow Empty/Null values in the field double click on&amp;nbsp;it in the Fields list which will open&amp;nbsp;Field Details form.Then right click on the Rules node in the rule builder and select Add-&amp;gt;Required in the pop-up menu:&amp;nbsp; 3.2 DatesDates validation can be a bit tricky as time "goes" ahead and we need to appreciate its dynamic nature.Let's say for example, that all contacts in our file should be at least 18 years old and we want data rule to work today, tomorrow or any time.Therefore, we cannot just put static value, i.e. 08/04/1982 in the data rule. Thanks to Flat File Checker's support of VB Expression we can easily overcome this issue. Double click one of the date fields in (if you have any in your file), which is Date_of_Birth in this example; Right click on Rule node in rule build and select Add-&amp;gt;Value Constraint; In the appeared fill-in rule details: Notice: In this example value is enclosed in square brackets to indicate that it contains VB Expression: Format(Now.AddYears(-18),'dd/MM/yyyy') Finally we need to populate Date Format field and check Allow Null Values is it is&amp;nbsp;OK for Date_of_Birth field to be blank: &amp;nbsp;Now click on OK button to keep all changes in the schema. 3.3 Regular ExpressionsTo add regular expression validation to the schema: Double click on the field to open Field Details form; Right click on Rules node and select Add-&amp;gt;Value Constraint; Select REGEXP as operator and provide regular expression (UK Postcode in the screenshot): Click on Y button of the control and OK button of the form to save changes. 3.4 External LookupIt is also common requirement that all values in the data file belong to a defined set of values. If you have a lookup file that contains this values (vocabulary or primary data) then you can easily validate data against this file with Flat File Checker. Drag &amp;amp; drop lookup file to files are of the Main form and populate file details (tick on Lookup checkbox). Click on Links button in the main menu after the file is added to the schema. In the Links form select MyData.Title as Foreign Key and Titles.Title as Primary Key and tick Enforce: &amp;nbsp;Click Add button to add link to the schema. Then press OK to close File Links form and save changes. 4. Execute schemaTo validate file click on Run Checks button in the toolbar: You will see progress bar while file is being validated which will be replaced by "CHECK COMPLETE" in the end of the processing: 5. View and correct errorsNow you can click on Show Errors button in the toolbar to open Data Errors form in which you can see and correct errors. 6. Other information sources on how to use Flat File Checker6.1 How to thread on the Forum. 6.2 See online documentation here. please feel free to contact me with any questions about Flat File Checker - info@flat-file.net</itunes:subtitle><itunes:author>Bulat Yapparov</itunes:author><itunes:summary>IntroductionIt is often required to validate a CSV file or other pseudo formatted data against a set of business rules. Though MS Excel offers data validation functionality for simple checks, it is often not enough for advanced data quality assurance. Flat File Checker is the best option for data validation if you are facing any of those tasks: Validation of large data file Regular validation of files with same or&amp;nbsp;similar structure Validation against a set of complex data rules Automated data validation / batch processing It takes few easy steps to validate a file. 1. Install Flat File Checker1.1 Download Windows installer from SourceForge.net. 1.2 Install application (click OK on all screens through installation process). 1.3 Open the application (FlaFi -&amp;gt;FlatFileChecker in the Start menu) 2. Create schema with a file2.1 New SchemaClick on Create New Schema button in the main toolbar which will activate files and fields areas of the form: 2.2 Add FileNow Drag &amp;amp; Drop your data file to the files area of the form: This will open a File Details form where you must provide your file details in the underlined fields:After you click OK in File Definition form, File will appear in the Files area and fields from the header will be created and appear in the Fields area: Now we can save the schema.3. Add Data RulesHere I will show how to add most common data rules.3.1. RequiredTo&amp;nbsp;disallow Empty/Null values in the field double click on&amp;nbsp;it in the Fields list which will open&amp;nbsp;Field Details form.Then right click on the Rules node in the rule builder and select Add-&amp;gt;Required in the pop-up menu:&amp;nbsp; 3.2 DatesDates validation can be a bit tricky as time "goes" ahead and we need to appreciate its dynamic nature.Let's say for example, that all contacts in our file should be at least 18 years old and we want data rule to work today, tomorrow or any time.Therefore, we cannot just put static value, i.e. 08/04/1982 in the data rule. Thanks to Flat File Checker's support of VB Expression we can easily overcome this issue. Double click one of the date fields in (if you have any in your file), which is Date_of_Birth in this example; Right click on Rule node in rule build and select Add-&amp;gt;Value Constraint; In the appeared fill-in rule details: Notice: In this example value is enclosed in square brackets to indicate that it contains VB Expression: Format(Now.AddYears(-18),'dd/MM/yyyy') Finally we need to populate Date Format field and check Allow Null Values is it is&amp;nbsp;OK for Date_of_Birth field to be blank: &amp;nbsp;Now click on OK button to keep all changes in the schema. 3.3 Regular ExpressionsTo add regular expression validation to the schema: Double click on the field to open Field Details form; Right click on Rules node and select Add-&amp;gt;Value Constraint; Select REGEXP as operator and provide regular expression (UK Postcode in the screenshot): Click on Y button of the control and OK button of the form to save changes. 3.4 External LookupIt is also common requirement that all values in the data file belong to a defined set of values. If you have a lookup file that contains this values (vocabulary or primary data) then you can easily validate data against this file with Flat File Checker. Drag &amp;amp; drop lookup file to files are of the Main form and populate file details (tick on Lookup checkbox). Click on Links button in the main menu after the file is added to the schema. In the Links form select MyData.Title as Foreign Key and Titles.Title as Primary Key and tick Enforce: &amp;nbsp;Click Add button to add link to the schema. Then press OK to close File Links form and save changes. 4. Execute schemaTo validate file click on Run Checks button in the toolbar: You will see progress bar while file is being validated which will be replaced by "CHECK COMPLETE" in the end of the processing: 5. View and correct errorsNow you can click on Show Errors button in the toolbar to open Data Errors form in which you can see and correct errors. 6. Other information sources on how to use Flat File Checker6.1 How to thread on the Forum. 6.2 See online documentation here. please feel free to contact me with any questions about Flat File Checker - info@flat-file.net</itunes:summary><itunes:keywords>Check, CSV, Data Validation</itunes:keywords></item><item><title>Version 0.7.0.6 Release</title><link>http://blog.flat-file.net/2010/03/version-0706-release.html</link><pubDate>Mon, 15 Mar 2010 15:46:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-7904396184086568041</guid><description>&lt;b&gt;New Features:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;1.&lt;/b&gt; Computable fields. This feature currently can only be used through direct editing of Schema's Xml.&lt;br /&gt;
To add field that will contain values calculated from other fields add &lt;b&gt;&lt;span style="color: #0c343d;"&gt;Expressions &lt;/span&gt;&lt;/b&gt;and &lt;b&gt;&lt;span style="color: #0c343d;"&gt;Expression &lt;/span&gt;&lt;/b&gt;nodes after &lt;b&gt;&lt;span style="color: #444444;"&gt;Columns &lt;/span&gt;&lt;/b&gt;node before &lt;b&gt;&lt;span style="color: #444444;"&gt;File &lt;/span&gt;&lt;/b&gt;node:&lt;br /&gt;
&lt;hr /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #444444;"&gt; &amp;lt;/Columns&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="color: #0c343d;"&gt;&amp;nbsp; &lt;b&gt;&amp;lt;Expressions&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #0c343d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&amp;lt;Expression&lt;/b&gt; Name="&lt;b&gt;&lt;span style="color: #274e13;"&gt;UpperName&lt;/span&gt;&lt;/b&gt;" Value='&lt;span style="color: #274e13;"&gt;&lt;b&gt;[Upper(Field("Name"))]&lt;/b&gt;'&lt;/span&gt; /&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #0c343d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&amp;lt;/Expressions&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #444444;"&gt;&amp;lt;/File&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;hr /&gt;In this example additional field will be added to the schema with Upper-Cased values from &lt;b style="color: #073763;"&gt;Name &lt;/b&gt;field.&lt;br /&gt;
This field is currently only available from Unique Constraint form in the GUI. But I am planning to make Expression fields similar regular fields, so they will be available anywhere in the GUI. &lt;br /&gt;
&lt;b&gt;2.&lt;/b&gt; Soundex function added to functions that can be used in VB expressions.&lt;br /&gt;
&lt;b&gt;3.&lt;/b&gt; Duplicate reporting action is added. This feature currently can only be used through direct editing of Schema's Xml.&lt;br /&gt;
To create report of duplicate records in the file add Action and DupeReport nodes in the Unique node:&lt;br /&gt;
&lt;hr /&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Unique&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #444444;"&gt;&amp;lt;Column Name="Surname" /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #444444;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Column Name="Address1" /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #444444;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Column Name="Postcode" Index="Hash" /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #444444;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Action&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; &lt;span style="color: #0c343d;"&gt;&amp;lt;DupesReport&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #0c343d;"&gt; &lt;/span&gt;Path="&lt;b&gt;&lt;span style="color: #274e13;"&gt;C:\duplicates.csv&lt;/span&gt;&lt;/b&gt;"&lt;span style="color: #0c343d;"&gt; &lt;/span&gt;&lt;b style="color: #0c343d;"&gt;/&amp;gt;&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #444444;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Action&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #444444;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/Unique&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;hr /&gt;&lt;b&gt;4.&lt;/b&gt; Xslt transformation that allows to see schema in browser was slightly improved.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Bugs Fixed:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;1.&lt;/b&gt; &lt;a href="https://sourceforge.net/tracker/?func=detail&amp;amp;aid=2969309&amp;amp;group_id=244764&amp;amp;atid=1126020"&gt;File lookup check box does not work&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;2.&lt;/b&gt; &lt;a href="https://sourceforge.net/tracker/?func=detail&amp;amp;aid=2969328&amp;amp;group_id=244764&amp;amp;atid=1126020"&gt;Field copy to file failed&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;3.&lt;/b&gt; &lt;a href="https://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=2970615&amp;amp;group_id=244764&amp;amp;atid=1126020"&gt;Data validation stopped on data format&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;4.&lt;/b&gt; &lt;a href="https://sourceforge.net/tracker/?func=detail&amp;amp;aid=2962798&amp;amp;group_id=244764&amp;amp;atid=1126020"&gt;Command Line no longer taking Global variables&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Download from:&lt;/b&gt;&lt;br /&gt;
1. &lt;a href="http://flat-file-checker.googlegroups.com/web/FlaFi.0.7.0.6.msi"&gt;User Group&lt;/a&gt;&lt;br /&gt;
2. &lt;a href="http://www.flat-file.net/forum/viewtopic.php?f=14&amp;amp;t=151&amp;amp;p=207#p207"&gt;Forum&lt;/a&gt;</description><author>bulat@flat-file.net (Bulat Yapparov)</author><enclosure length="68234" type="application/octet-stream" url="http://www.flat-file.net/forum/viewtopic.php?f=14&amp;amp;t=151&amp;amp;p=207#p207"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>New Features: 1. Computable fields. This feature currently can only be used through direct editing of Schema's Xml. To add field that will contain values calculated from other fields add Expressions and Expression nodes after Columns node before File node: &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Columns&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Expressions&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Expression Name="UpperName" Value='[Upper(Field("Name"))]' /&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Expressions&amp;gt; &amp;nbsp; &amp;lt;/File&amp;gt; In this example additional field will be added to the schema with Upper-Cased values from Name field. This field is currently only available from Unique Constraint form in the GUI. But I am planning to make Expression fields similar regular fields, so they will be available anywhere in the GUI. 2. Soundex function added to functions that can be used in VB expressions. 3. Duplicate reporting action is added. This feature currently can only be used through direct editing of Schema's Xml. To create report of duplicate records in the file add Action and DupeReport nodes in the Unique node: &amp;nbsp;&amp;nbsp;&amp;lt;Unique&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Column Name="Surname" /&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Column Name="Address1" /&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Column Name="Postcode" Index="Hash" /&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Action&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;DupesReport Path="C:\duplicates.csv" /&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Action&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/Unique&amp;gt; 4. Xslt transformation that allows to see schema in browser was slightly improved. Bugs Fixed: 1. File lookup check box does not work 2. Field copy to file failed 3. Data validation stopped on data format 4. Command Line no longer taking Global variables Download from: 1. User Group 2. Forum</itunes:subtitle><itunes:author>Bulat Yapparov</itunes:author><itunes:summary>New Features: 1. Computable fields. This feature currently can only be used through direct editing of Schema's Xml. To add field that will contain values calculated from other fields add Expressions and Expression nodes after Columns node before File node: &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Columns&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Expressions&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Expression Name="UpperName" Value='[Upper(Field("Name"))]' /&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Expressions&amp;gt; &amp;nbsp; &amp;lt;/File&amp;gt; In this example additional field will be added to the schema with Upper-Cased values from Name field. This field is currently only available from Unique Constraint form in the GUI. But I am planning to make Expression fields similar regular fields, so they will be available anywhere in the GUI. 2. Soundex function added to functions that can be used in VB expressions. 3. Duplicate reporting action is added. This feature currently can only be used through direct editing of Schema's Xml. To create report of duplicate records in the file add Action and DupeReport nodes in the Unique node: &amp;nbsp;&amp;nbsp;&amp;lt;Unique&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Column Name="Surname" /&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Column Name="Address1" /&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Column Name="Postcode" Index="Hash" /&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Action&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;DupesReport Path="C:\duplicates.csv" /&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Action&amp;gt; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/Unique&amp;gt; 4. Xslt transformation that allows to see schema in browser was slightly improved. Bugs Fixed: 1. File lookup check box does not work 2. Field copy to file failed 3. Data validation stopped on data format 4. Command Line no longer taking Global variables Download from: 1. User Group 2. Forum</itunes:summary></item><item><title>Development plans for 2010. Make a Wish!</title><link>http://blog.flat-file.net/2010/02/development-plans-for-2010-make-wish.html</link><pubDate>Fri, 26 Feb 2010 19:46:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-7909581220275011605</guid><description>I want to get feedback to plan development in 2010.&lt;br /&gt;
&lt;br /&gt;
From the end of 2009 I have stopped developing new features without user request, so if you think something is missing make sure you tell about it. There are still a lot of things that can be done to improve Flat File Checker.&lt;br /&gt;
I have number areas that I think should be developed/improved in 2010, but I am not sure whether they are relevant to you: &lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowtransparency="allowtransparency" frameborder="0" height="300" name="poll-widget8031712330249506485" src="http://www.google.com/reviews/polls/display/8031712330249506485/blogger_template/run_app?txtclr=%23333333&amp;amp;lnkclr=%23333333&amp;amp;chrtclr=%23333333&amp;amp;font=normal+normal+100%25+%27Trebuchet+MS%27%2CVerdana%2CArial%2CSans-serif&amp;amp;hideq=true&amp;amp;purl=http%3A%2F%2Fblog.flat-file.net%2F" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; width: 100%;"&gt;&lt;/iframe&gt;See descriptions for each point bellow.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Match &amp;amp; Merge (De-duplication) &lt;/b&gt;&lt;br /&gt;
a. Duplicates Report - &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;implemented &lt;/span&gt;&lt;/b&gt;- see &lt;a href="http://www.flat-file.net/help/"&gt;User Guide&lt;/a&gt;-&amp;gt;Add Actions-&amp;gt;Report Duplicates.&lt;br /&gt;
b. Fuzzy Logic / Heuristic &lt;br /&gt;
- Soundex - &lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;b&gt;implemented &lt;/b&gt;&lt;/span&gt;- see example of a derived field with Soundex function in the &lt;a href="http://www.flat-file.net/help/"&gt;User Guide&lt;/a&gt;-&amp;gt;Calculated Field-&amp;gt;Add Calculated Field;&lt;br /&gt;
- Levenshtein (distance between two strings) &lt;br /&gt;
- Dictionaries (matches between official names and nicknames, i.e.: Robert - Rob - Robbie - Robin - Rupert - Bob - Bobby - Bert.) - &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;implemented&lt;/span&gt;&lt;/b&gt; - &lt;a href="http://blog.flat-file.net/2010/05/anyvalue-and-nullvalue.html"&gt;how to match records using special values;&lt;/a&gt;&lt;br /&gt;
c. Some kind of conditional logic if it is not too complicated, i.e. If Forename is missing, then check whether Initials are the same - &lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;b&gt;implemented &lt;/b&gt;&lt;/span&gt;- see &lt;a href="http://blog.flat-file.net/2010/05/anyvalue-and-nullvalue.html"&gt;special values for matching&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Web Services (WS)&lt;/b&gt; &lt;br /&gt;
a. Basic functionality to upload Flat File Schema to the server.&lt;br /&gt;
b. Basic functionality to upload data files against Schema that is already on the server.&lt;br /&gt;
c. Run validation of the file set against the schema.&lt;br /&gt;
&lt;br /&gt;
Thanks to Chris (RacerX64), who already spent his weekend (man, I hope you got bonus for that) to write the most of needed functionality, so it should take couple of days to accomplish this task. The biggest challenge with WS is to set up public server which could be available to everybody. If somebody can help with IIS hosting, it will be highly appreciated. IF WS is UP and running I will think of basic web interface for file upload and error reporting.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Data Error Log &amp;amp; Execution&lt;/b&gt;&lt;br /&gt;
a. Make HTML or XML+XSLT version of report that will be user friendly enough to send reports to data providers. -&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;implemented.&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: black;"&gt;Now the output format of the log depends on its extension and can be Text, Xml or Htlm (see&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;a href="http://www.flat-file.net/help/"&gt;User Guide&lt;/a&gt;-&amp;gt;Create New Schema-&amp;gt;Log Formats)&lt;br /&gt;
b. Replace current execution logging with standard Tracing mechanism which is more flexible and robust way of logging.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4. Data File Preview &lt;/b&gt;&lt;br /&gt;
a.&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Implemented&lt;/span&gt;&lt;/b&gt;&amp;nbsp;- Add a form to GUI that will show data from the file in the table with errors being highlighted.&lt;br /&gt;
b. Add a form for managing fields setting of the fixed position file. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5. Documentation &lt;/b&gt;&lt;br /&gt;
a. I want to make it easy to use and read. Please help me with this! &lt;br /&gt;
b. I have started shooting short videos to build up a tutorial. I think there is space for about 6 more movies. Please leave your feedback or produce your own video. &lt;br /&gt;
c. I need to make a sample schema and data set that everybody could see and play with. &lt;br /&gt;
d. If you use Flat File Checker extensively, please write an article or a business case and share it with other users. You can post them on the forum, in your blog, or here. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;6. XSLT Schema &lt;/b&gt;&lt;br /&gt;
a. I don't know whether somebody uses IE to view the schema, but I find it quite handy. I want to change the way schema is presented slightly. Your thoughts on ways to improve transformation will be appreciated. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;7. Data Rule Templates &lt;/b&gt;&lt;br /&gt;
a. The last, but not the least I need to create a GUI to create Query rules template files. This is a very powerful peace of functionality and I use it for data QA of marketing selections. Though it is possible to write template file from scratch or use Custom Query Xml as a base, it is not the easiest task and not something I like to do. Feel free to ask about Template Queries, while GUI functionality for them is under development consideration. &lt;br /&gt;
b. I’m also thinking about generic rule templates that will cover other then Query Rule templates. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Please post your wishes or vote here. You feedback is much appreciated!&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;UPD - June 2010:&lt;/b&gt;&lt;br /&gt;
I have done almost everything I wanted on&amp;nbsp;duplicate records&amp;nbsp;matching (releases after v.0.7.0.9), so will start working on improving of error logs and execution logs. Any requests are welcome.&lt;br /&gt;
&lt;b&gt;UPD2 - June 2010:&lt;/b&gt;&lt;br /&gt;
Logs are now available in &lt;b&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;Html &lt;/span&gt;&lt;/b&gt;and &lt;b&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;Xml &lt;/span&gt;&lt;/b&gt;formats (releases after v.0.7.1.0)&lt;br /&gt;
&lt;b&gt;UPD3 - Jan 2011&lt;/b&gt;&lt;br /&gt;
Now data preview is available which allows to edit original data files directly in Flat File Checker (see details &lt;a href="http://blog.flat-file.net/2010/09/preview-data-with-error-highlighting.html"&gt;here&lt;/a&gt;).</description><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Video Tutorials for Flat File Checker</title><link>http://blog.flat-file.net/2010/02/video-tutorials-for-flat-file-checker.html</link><category>Tutorial</category><category>Video</category><pubDate>Thu, 11 Feb 2010 10:06:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-51287710767257900</guid><description>I am not sure whether this will be very helpful but I decided to make a number of videos that show how to use Flat File Checker.&lt;br /&gt;
&lt;br /&gt;
Firstly, I want to thank guys who made and support &lt;a href="http://camstudio.org/"&gt;CamStudio&lt;/a&gt; which was used to create these videos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Secondly, I want you to see the amazing microphone that was used to capture my voice:&lt;br /&gt;
&lt;div align="left"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEik4q8dWy-pHqBANKtPOd73hTXS8SqsyU-Tt0OVMVfiZ1qZ7Xv5UH5ff0Sa-SDKewldYzg-Jm9uPzF4pO2HjG72QcfQXGt4N7r72Sohp14vZFpYG2KlVGZp-H4zRzmfU2V9cdmW0O7Vc/s1600-h/mic.jpg" imageanchor="1" style="cssfloat: left; margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" ct="true" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEik4q8dWy-pHqBANKtPOd73hTXS8SqsyU-Tt0OVMVfiZ1qZ7Xv5UH5ff0Sa-SDKewldYzg-Jm9uPzF4pO2HjG72QcfQXGt4N7r72Sohp14vZFpYG2KlVGZp-H4zRzmfU2V9cdmW0O7Vc/s320/mic.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
I hope you are impressed and ready to&amp;nbsp;watch the videos:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;How to create&amp;nbsp;a new schema and add file:&lt;/strong&gt;&lt;br /&gt;
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/uKYLRUvxSco&amp;hl=en_GB&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/uKYLRUvxSco&amp;hl=en_GB&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;How to add lookup and link files&lt;/strong&gt;&lt;br /&gt;
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/fg_XvACIuYo&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/fg_XvACIuYo&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;How to create data rule&lt;/strong&gt;&lt;br /&gt;
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wyIj0qoSe9Q&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/wyIj0qoSe9Q&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;How to add regular expressions&lt;/strong&gt;&lt;br /&gt;
&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IZ25XLKEHeM&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/IZ25XLKEHeM&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/li&gt;
&lt;/ul&gt;I hope this will be helpful to start worknig with Flat File Checker. I am planning to create onther 4-6 video tutorials on other topics. If you have suggestions for these topics please let me know.</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEik4q8dWy-pHqBANKtPOd73hTXS8SqsyU-Tt0OVMVfiZ1qZ7Xv5UH5ff0Sa-SDKewldYzg-Jm9uPzF4pO2HjG72QcfQXGt4N7r72Sohp14vZFpYG2KlVGZp-H4zRzmfU2V9cdmW0O7Vc/s72-c/mic.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Batch Data Validation with Flat File Checker</title><link>http://blog.flat-file.net/2010/02/batch-data-validation-with-flat-file.html</link><category>Batch Processing</category><category>CodeProject</category><category>Data Validation</category><pubDate>Sun, 7 Feb 2010 12:28:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-4097278610203519294</guid><description>&lt;pre style="display: none;"&gt;Title: Batch Data Validation with Flat File Checker
Author:      Bulat Yapparov, Chris Ellison
Email:       byapparov@gmail.com
Member ID:   5425273
Language:    VB.Net, VBScript
Platform:    Windows
Technology:  VBScript, Flat File Checker, Scheduled Tasks
Level:       Intermediate
Description: This is a real life example of data validation using conslole version of Flat File Checker and VBScript
Section      Database
SubSection   Database
License:     CPOL (default - select your desired license from our list)&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;In my previous &lt;a href="http://www.codeproject.com/KB/files/datavalidation.aspx"&gt;article&lt;/a&gt; I have mentioned that data validation with &lt;a href="http://www.flat-file.net/"&gt;Flat File Checker&lt;/a&gt; can be done through command line.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://racerx64.users.sourceforge.net/"&gt;Chris Ellison&lt;/a&gt; wrote a brilliant VBScript based solution &lt;a href="http://www.flat-file.net/downloads/articles/ffcbatch/FFCBAtch2b.zip"&gt;(download)&lt;/a&gt; that allows validating multiple data files using different Flat File Checker schemas depending on file name prefix.&lt;br /&gt;
This script can be used as a source of inspiration if you want to automate your data validation process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Background&lt;/h2&gt;Sometimes it is required to validate many similar data files, which is not possible through Flat File Checkers GUI.&lt;br /&gt;
However, there is an easy solution for that with console version (FlaFi.exe). &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Main console tokens&lt;/b&gt; are parameters that you can pass to console application: &lt;br /&gt;
&lt;b&gt;-silent&lt;/b&gt; - executes schema without echo to console window and closes console when validation is complete.&lt;br /&gt;
&lt;b&gt;-errors&lt;/b&gt; - echoes data errors to console window.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Custom tokens&lt;/b&gt; are user specified tokens that can be used to pass values to control schema's attributes. Custom tokens allow parameterising  the schema and reusing it for similar data files. You can pass values through command line and change parameters of validation i.e.: file name suffix, product code, dates, etc.&lt;br /&gt;
All you need to create a custom token is to:&lt;br /&gt;
1) add &lt;a href="http://blog.flat-file.net/2009/12/version-068-is-released.html"&gt;Global Variables&lt;/a&gt; to you schema.&lt;br /&gt;
2) call FlaFi with command that has the following format:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;C:\Program Files\Flat File Checker\FlaFi {Schema Path} -{Variable Name} {Variable Value}&lt;/pre&gt;3) add global variable named "campaign" to the schema.&lt;br /&gt;
4) use "Constant" function in VB Expressions for any attribute in the schema:&lt;br /&gt;
&lt;pre&gt;FileName=[Constant('campaign')]-import.csv&lt;/pre&gt;5) run validation: &lt;br /&gt;
&lt;pre&gt;C:\Program Files\Flat File Checker\FlaFi {Schema Path} 
                                                   -campaign SRP54A&lt;/pre&gt;Let's have a look at the most important function of the script - &lt;b&gt;ValidateFile&lt;/b&gt;&lt;br /&gt;
&lt;h2&gt;Using the code&lt;/h2&gt;&lt;a href="http://www.flat-file.net/downloads/articles/ffcbatch/FFCBAtch2b.zip"&gt;Download&lt;/a&gt; the solution and see instructions file&lt;br /&gt;
for more details on how to try the code.&lt;br /&gt;
&lt;b&gt;&lt;code&gt;ValidateFile&lt;/code&gt;&lt;/b&gt; function has following parameters:&lt;br /&gt;
&lt;b&gt;strFolder&lt;/b&gt; - Folder that contains schema files&lt;br /&gt;
&lt;b&gt;strSchema&lt;/b&gt; - Schema file name&lt;br /&gt;
&lt;b&gt;strFileDir&lt;/b&gt; - Directory that contains files&lt;br /&gt;
&lt;b&gt;strFile&lt;/b&gt; - File Name&lt;br /&gt;
&lt;b&gt;strLogFileDir&lt;/b&gt;- Folder that contains logs&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="vb" lang="vbscript" name="code"&gt;Private Function ValidateFile (strFolder, strSchema, strFileDir, _
                               strFile, strLogFileDir)
 'Execute FFC and return 1 of 4 return values
 'FFC ERRORLEVEL 0 = "VALID" File Valid
 'FFC ERRORLEVEL 1 = "DATA" Data Exception
 'FFC ERRORLEVEL 2 = "EXEC" Execution Exception
 'FFC ERRORLEVEL &amp;gt; 2 = "SEVR" Severe Error
 dim sh
 dim strCommand
 dim return

 ValidateFile = "NO_SCHEMA"

 if SchemaFileExists(strSchemaFolder, strSchema) then
 Set sh = CreateObject("WScript.Shell")
 WriteLogEntry objLogFile, "Validating File " &amp;amp; strFile &amp;amp; _
               " against FFC Schema " &amp;amp; strSchema
 strCommand = Chr(34) &amp;amp; strFlatFileExe &amp;amp; Chr(34) &amp;amp; " -silent " &amp;amp; _
   strFolder &amp;amp; strSchema  &amp;amp; " -InFileName " &amp;amp; strFile &amp;amp; " -InFileDir " &amp;amp; _
   strFileDir &amp;amp; " -InLogDir " &amp;amp; strLogFileDir
 WriteLogEntry objLogFile, "Running Command " &amp;amp; strCommand
 'wscript.echo "Running Command " &amp;amp; strCommand

 return = sh.Run(strCommand, 0, True)

 if return = 0 then
       WriteLogEntry objLogFile, _
         "File Successfully Validated Return Code = " &amp;amp; return
    ValidateFile = "VALID"
 else
  if return = 1 then
   WriteLogEntry objLogFile,"Data File Validation Failed, Return Code " _
    &amp;amp; return
   ValidateFile = "DATA"
  else
   if return = 2 then
    WriteLogEntry objLogFile,"Execution error, Return Code " &amp;amp; return
    ValidateFile = "EXEC"
   else
    WriteLogEntry objLogFile,"Serious, Return Code " &amp;amp; return
    ValidateFile = "SEVR"
   end if
  end if
 end if
 set sh = nothing

 else
 ValidateFile = "NO_SCHEMA"
end if
end function
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Points of Interest&lt;/h2&gt;It will be useful to transfer this solution to VBA which provides better environment for debugging and logging.&lt;br /&gt;
See forum for more information about &lt;b&gt;Flat File Checker&lt;/b&gt; command line execution:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.flat-file.net/forum/viewtopic.php?f=2&amp;amp;t=12"&gt;command line execution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.flat-file.net/forum/viewtopic.php?f=13&amp;amp;t=14"&gt;automate data validation process&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;a href="http://www.codeproject.com/script/Membership/View.aspx?mid=5425273" rel="tag" style="display: none;"&gt;CodeProject&lt;/a&gt;</description><author>bulat@flat-file.net (Bulat Yapparov)</author><enclosure length="220301" type="application/zip" url="http://www.flat-file.net/downloads/articles/ffcbatch/FFCBAtch2b.zip"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>Title: Batch Data Validation with Flat File Checker Author: Bulat Yapparov, Chris Ellison Email: byapparov@gmail.com Member ID: 5425273 Language: VB.Net, VBScript Platform: Windows Technology: VBScript, Flat File Checker, Scheduled Tasks Level: Intermediate Description: This is a real life example of data validation using conslole version of Flat File Checker and VBScript Section Database SubSection Database License: CPOL (default - select your desired license from our list) IntroductionIn my previous article I have mentioned that data validation with Flat File Checker can be done through command line. Chris Ellison wrote a brilliant VBScript based solution (download) that allows validating multiple data files using different Flat File Checker schemas depending on file name prefix. This script can be used as a source of inspiration if you want to automate your data validation process. BackgroundSometimes it is required to validate many similar data files, which is not possible through Flat File Checkers GUI. However, there is an easy solution for that with console version (FlaFi.exe). Main console tokens are parameters that you can pass to console application: -silent - executes schema without echo to console window and closes console when validation is complete. -errors - echoes data errors to console window. Custom tokens are user specified tokens that can be used to pass values to control schema's attributes. Custom tokens allow parameterising the schema and reusing it for similar data files. You can pass values through command line and change parameters of validation i.e.: file name suffix, product code, dates, etc. All you need to create a custom token is to: 1) add Global Variables to you schema. 2) call FlaFi with command that has the following format: C:\Program Files\Flat File Checker\FlaFi {Schema Path} -{Variable Name} {Variable Value}3) add global variable named "campaign" to the schema. 4) use "Constant" function in VB Expressions for any attribute in the schema: FileName=[Constant('campaign')]-import.csv5) run validation: C:\Program Files\Flat File Checker\FlaFi {Schema Path} -campaign SRP54ALet's have a look at the most important function of the script - ValidateFile Using the codeDownload the solution and see instructions file for more details on how to try the code. ValidateFile function has following parameters: strFolder - Folder that contains schema files strSchema - Schema file name strFileDir - Directory that contains files strFile - File Name strLogFileDir- Folder that contains logs Private Function ValidateFile (strFolder, strSchema, strFileDir, _ strFile, strLogFileDir) 'Execute FFC and return 1 of 4 return values 'FFC ERRORLEVEL 0 = "VALID" File Valid 'FFC ERRORLEVEL 1 = "DATA" Data Exception 'FFC ERRORLEVEL 2 = "EXEC" Execution Exception 'FFC ERRORLEVEL &amp;gt; 2 = "SEVR" Severe Error dim sh dim strCommand dim return ValidateFile = "NO_SCHEMA" if SchemaFileExists(strSchemaFolder, strSchema) then Set sh = CreateObject("WScript.Shell") WriteLogEntry objLogFile, "Validating File " &amp;amp; strFile &amp;amp; _ " against FFC Schema " &amp;amp; strSchema strCommand = Chr(34) &amp;amp; strFlatFileExe &amp;amp; Chr(34) &amp;amp; " -silent " &amp;amp; _ strFolder &amp;amp; strSchema &amp;amp; " -InFileName " &amp;amp; strFile &amp;amp; " -InFileDir " &amp;amp; _ strFileDir &amp;amp; " -InLogDir " &amp;amp; strLogFileDir WriteLogEntry objLogFile, "Running Command " &amp;amp; strCommand 'wscript.echo "Running Command " &amp;amp; strCommand return = sh.Run(strCommand, 0, True) if return = 0 then WriteLogEntry objLogFile, _ "File Successfully Validated Return Code = " &amp;amp; return ValidateFile = "VALID" else if return = 1 then WriteLogEntry objLogFile,"Data File Validation Failed, Return Code " _ &amp;amp; return ValidateFile = "DATA" else if return = 2 then WriteLogEntry objLogFile,"Execution error, Return Code " &amp;amp; return ValidateFile = "EXEC" else WriteLogEntry objLogFile,"Serious, Return Code " &amp;amp; return ValidateFile = "SEVR" end if end if end if set sh = nothing else ValidateFile = "NO_SCHEMA" end if end function Points of InterestIt will be useful to transfer this solution to VBA which provides better environment for debugging and logging. See forum for more information about Flat File Checker command line execution: command line execution automate data validation process CodeProject</itunes:subtitle><itunes:author>Bulat Yapparov</itunes:author><itunes:summary>Title: Batch Data Validation with Flat File Checker Author: Bulat Yapparov, Chris Ellison Email: byapparov@gmail.com Member ID: 5425273 Language: VB.Net, VBScript Platform: Windows Technology: VBScript, Flat File Checker, Scheduled Tasks Level: Intermediate Description: This is a real life example of data validation using conslole version of Flat File Checker and VBScript Section Database SubSection Database License: CPOL (default - select your desired license from our list) IntroductionIn my previous article I have mentioned that data validation with Flat File Checker can be done through command line. Chris Ellison wrote a brilliant VBScript based solution (download) that allows validating multiple data files using different Flat File Checker schemas depending on file name prefix. This script can be used as a source of inspiration if you want to automate your data validation process. BackgroundSometimes it is required to validate many similar data files, which is not possible through Flat File Checkers GUI. However, there is an easy solution for that with console version (FlaFi.exe). Main console tokens are parameters that you can pass to console application: -silent - executes schema without echo to console window and closes console when validation is complete. -errors - echoes data errors to console window. Custom tokens are user specified tokens that can be used to pass values to control schema's attributes. Custom tokens allow parameterising the schema and reusing it for similar data files. You can pass values through command line and change parameters of validation i.e.: file name suffix, product code, dates, etc. All you need to create a custom token is to: 1) add Global Variables to you schema. 2) call FlaFi with command that has the following format: C:\Program Files\Flat File Checker\FlaFi {Schema Path} -{Variable Name} {Variable Value}3) add global variable named "campaign" to the schema. 4) use "Constant" function in VB Expressions for any attribute in the schema: FileName=[Constant('campaign')]-import.csv5) run validation: C:\Program Files\Flat File Checker\FlaFi {Schema Path} -campaign SRP54ALet's have a look at the most important function of the script - ValidateFile Using the codeDownload the solution and see instructions file for more details on how to try the code. ValidateFile function has following parameters: strFolder - Folder that contains schema files strSchema - Schema file name strFileDir - Directory that contains files strFile - File Name strLogFileDir- Folder that contains logs Private Function ValidateFile (strFolder, strSchema, strFileDir, _ strFile, strLogFileDir) 'Execute FFC and return 1 of 4 return values 'FFC ERRORLEVEL 0 = "VALID" File Valid 'FFC ERRORLEVEL 1 = "DATA" Data Exception 'FFC ERRORLEVEL 2 = "EXEC" Execution Exception 'FFC ERRORLEVEL &amp;gt; 2 = "SEVR" Severe Error dim sh dim strCommand dim return ValidateFile = "NO_SCHEMA" if SchemaFileExists(strSchemaFolder, strSchema) then Set sh = CreateObject("WScript.Shell") WriteLogEntry objLogFile, "Validating File " &amp;amp; strFile &amp;amp; _ " against FFC Schema " &amp;amp; strSchema strCommand = Chr(34) &amp;amp; strFlatFileExe &amp;amp; Chr(34) &amp;amp; " -silent " &amp;amp; _ strFolder &amp;amp; strSchema &amp;amp; " -InFileName " &amp;amp; strFile &amp;amp; " -InFileDir " &amp;amp; _ strFileDir &amp;amp; " -InLogDir " &amp;amp; strLogFileDir WriteLogEntry objLogFile, "Running Command " &amp;amp; strCommand 'wscript.echo "Running Command " &amp;amp; strCommand return = sh.Run(strCommand, 0, True) if return = 0 then WriteLogEntry objLogFile, _ "File Successfully Validated Return Code = " &amp;amp; return ValidateFile = "VALID" else if return = 1 then WriteLogEntry objLogFile,"Data File Validation Failed, Return Code " _ &amp;amp; return ValidateFile = "DATA" else if return = 2 then WriteLogEntry objLogFile,"Execution error, Return Code " &amp;amp; return ValidateFile = "EXEC" else WriteLogEntry objLogFile,"Serious, Return Code " &amp;amp; return ValidateFile = "SEVR" end if end if end if set sh = nothing else ValidateFile = "NO_SCHEMA" end if end function Points of InterestIt will be useful to transfer this solution to VBA which provides better environment for debugging and logging. See forum for more information about Flat File Checker command line execution: command line execution automate data validation process CodeProject</itunes:summary><itunes:keywords>Batch Processing, CodeProject, Data Validation</itunes:keywords></item><item><title>Eval3 wrapper</title><link>http://blog.flat-file.net/2010/02/eval3-wrapper.html</link><category>Eval3</category><category>Evaluator</category><category>Interpreter</category><category>VB</category><pubDate>Sun, 7 Feb 2010 08:46:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-3484836513707998294</guid><description>&lt;pre style="display: none;"&gt;Title:       Eval3  wrapper
Author:      Bulat Yapparov, Chris Ellison
Email:       byapparov@gmail.com
Member ID:   5425273
Language:    Vb.Net
Platform:    Windows
Technology:  dotNet
Level:       Intermediate
Description: Evaluator for multiple VB expressions based on Eval3 library
Section      Type the Code Project Section you Wish the Article to Appear
SubSection   Type the Code Project SubSection you Wish the Article to Appear
License:     CPOL (default - select your desired license from our list)&lt;/pre&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;a href="http://www.codeproject.com/KB/recipes/eval3.aspx"&gt;Eval3 library&lt;/a&gt; writen by &lt;a href="http://www.codeproject.com/script/Membership/View.aspx?mid=455825"&gt;Pascal Ganaye&lt;/a&gt; allows to parse and evaluate VB code, which is great but often it is not enough.&lt;br /&gt;
What I needed was a class that would interprit a string that contains multiple expressions inclosed in square brakets.&lt;br /&gt;
For example this string: &lt;br /&gt;
&lt;code&gt;GIS_[Format(Now, 'yy-MM-dd')]-[Field('ID')]-[Field('Source')]&lt;/code&gt;&lt;br /&gt;
Will be evaluated to something like this:&lt;br /&gt;
&lt;code&gt;GIS_10-01-13-5324523-DFS235F&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Background&lt;/h2&gt;Lets assume we have an exprsion similar to the shown example above which we need to evaluate multiple times.&lt;br /&gt;
I have writen a class that will parse the whole expression once and store "formulas" for future evaluations.&lt;br /&gt;
This sighnificantly reduces execution time while keeping it really simple&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Using the code&lt;/h2&gt;Download Code: &lt;a href="http://www.flat-file.net/downloads/articles/eval3/EvalFormulaCollection.vb"&gt;Eval3 Wrapper&lt;/a&gt;; &lt;a href="http://www.flat-file.net/downloads/articles/eval3/EvalFunctions.vb"&gt;Evalutation functions&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
It is very easy to use EvalFormulaCollection class once you have Eval3 added to your project.&lt;br /&gt;
You just need to:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Create new instance of &lt;code&gt;EvalFormulaCollection&lt;/code&gt; class with expression that you need to evaluate&lt;/li&gt;
&lt;li&gt;Add "environment" object that provides functions that can be used in expression&lt;/li&gt;
&lt;li&gt;Call Initiate() method that will make reusable array of parsed "formulas".&lt;/li&gt;
&lt;li&gt;Call Value() property to get the interpreted value of the expression which is evaluated without parsing!&lt;/li&gt;
&lt;/ul&gt;Code example:&lt;br /&gt;
&lt;pre class="vb.net" lang="vb.net" name="code"&gt;' Test evaluation of the expression with multiple VB Expressions
Sub Test()
 Dim c As New MyClass
 dim e as New evaluationFunctions
 Dim expression As String = _ 
     "GIS_[Format(Now, 'yy-MM-dd')]-[Field('ID')]-[Field('Source')]"
 Dim ev as New EvalFormulaCollection(expression)
 ev.AddEnvironment(c)
 ev.AddEnvironment(e)
 ev.Initiate()
 MsgBox ev.Value()
End Sub
&lt;/pre&gt;&lt;h2&gt;Points of Interest&lt;/h2&gt;The best thing about this code is its size. It is quite impressive what you can do with &lt;b&gt;&lt;code&gt;Regex&lt;/code&gt;&lt;/b&gt; class from &lt;b&gt;&lt;code&gt;RegularExpressions&lt;/code&gt;&lt;/b&gt; library with one line of code:&lt;br /&gt;
&lt;pre name="code" class="vb.net"&gt;' Find all expression in square brackets
Public Sub New(ByVal expression As String)
     ...
    _matches = Regex.Matches(_expression, "[\[][^\[\]]{1,}[\]]")
End Sub
&lt;/pre&gt;&lt;a href="http://www.codeproject.com/script/Membership/View.aspx?mid=5425273" rel="tag" style="display: none;"&gt;CodeProject&lt;/a&gt;</description><author>bulat@flat-file.net (Bulat Yapparov)</author><enclosure length="2975" type="application/octet-stream" url="http://www.flat-file.net/downloads/articles/eval3/EvalFormulaCollection.vb"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>Title: Eval3 wrapper Author: Bulat Yapparov, Chris Ellison Email: byapparov@gmail.com Member ID: 5425273 Language: Vb.Net Platform: Windows Technology: dotNet Level: Intermediate Description: Evaluator for multiple VB expressions based on Eval3 library Section Type the Code Project Section you Wish the Article to Appear SubSection Type the Code Project SubSection you Wish the Article to Appear License: CPOL (default - select your desired license from our list)IntroductionEval3 library writen by Pascal Ganaye allows to parse and evaluate VB code, which is great but often it is not enough. What I needed was a class that would interprit a string that contains multiple expressions inclosed in square brakets. For example this string: GIS_[Format(Now, 'yy-MM-dd')]-[Field('ID')]-[Field('Source')] Will be evaluated to something like this: GIS_10-01-13-5324523-DFS235F BackgroundLets assume we have an exprsion similar to the shown example above which we need to evaluate multiple times. I have writen a class that will parse the whole expression once and store "formulas" for future evaluations. This sighnificantly reduces execution time while keeping it really simple Using the codeDownload Code: Eval3 Wrapper; Evalutation functions It is very easy to use EvalFormulaCollection class once you have Eval3 added to your project. You just need to: Create new instance of EvalFormulaCollection class with expression that you need to evaluate Add "environment" object that provides functions that can be used in expression Call Initiate() method that will make reusable array of parsed "formulas". Call Value() property to get the interpreted value of the expression which is evaluated without parsing! Code example: ' Test evaluation of the expression with multiple VB Expressions Sub Test() Dim c As New MyClass dim e as New evaluationFunctions Dim expression As String = _ "GIS_[Format(Now, 'yy-MM-dd')]-[Field('ID')]-[Field('Source')]" Dim ev as New EvalFormulaCollection(expression) ev.AddEnvironment(c) ev.AddEnvironment(e) ev.Initiate() MsgBox ev.Value() End Sub Points of InterestThe best thing about this code is its size. It is quite impressive what you can do with Regex class from RegularExpressions library with one line of code: ' Find all expression in square brackets Public Sub New(ByVal expression As String) ... _matches = Regex.Matches(_expression, "[\[][^\[\]]{1,}[\]]") End Sub CodeProject</itunes:subtitle><itunes:author>Bulat Yapparov</itunes:author><itunes:summary>Title: Eval3 wrapper Author: Bulat Yapparov, Chris Ellison Email: byapparov@gmail.com Member ID: 5425273 Language: Vb.Net Platform: Windows Technology: dotNet Level: Intermediate Description: Evaluator for multiple VB expressions based on Eval3 library Section Type the Code Project Section you Wish the Article to Appear SubSection Type the Code Project SubSection you Wish the Article to Appear License: CPOL (default - select your desired license from our list)IntroductionEval3 library writen by Pascal Ganaye allows to parse and evaluate VB code, which is great but often it is not enough. What I needed was a class that would interprit a string that contains multiple expressions inclosed in square brakets. For example this string: GIS_[Format(Now, 'yy-MM-dd')]-[Field('ID')]-[Field('Source')] Will be evaluated to something like this: GIS_10-01-13-5324523-DFS235F BackgroundLets assume we have an exprsion similar to the shown example above which we need to evaluate multiple times. I have writen a class that will parse the whole expression once and store "formulas" for future evaluations. This sighnificantly reduces execution time while keeping it really simple Using the codeDownload Code: Eval3 Wrapper; Evalutation functions It is very easy to use EvalFormulaCollection class once you have Eval3 added to your project. You just need to: Create new instance of EvalFormulaCollection class with expression that you need to evaluate Add "environment" object that provides functions that can be used in expression Call Initiate() method that will make reusable array of parsed "formulas". Call Value() property to get the interpreted value of the expression which is evaluated without parsing! Code example: ' Test evaluation of the expression with multiple VB Expressions Sub Test() Dim c As New MyClass dim e as New evaluationFunctions Dim expression As String = _ "GIS_[Format(Now, 'yy-MM-dd')]-[Field('ID')]-[Field('Source')]" Dim ev as New EvalFormulaCollection(expression) ev.AddEnvironment(c) ev.AddEnvironment(e) ev.Initiate() MsgBox ev.Value() End Sub Points of InterestThe best thing about this code is its size. It is quite impressive what you can do with Regex class from RegularExpressions library with one line of code: ' Find all expression in square brackets Public Sub New(ByVal expression As String) ... _matches = Regex.Matches(_expression, "[\[][^\[\]]{1,}[\]]") End Sub CodeProject</itunes:summary><itunes:keywords>Eval3, Evaluator, Interpreter, VB</itunes:keywords></item><item><title>Version 0.7.0 is released</title><link>http://blog.flat-file.net/2010/02/version-070-is-released.html</link><pubDate>Fri, 5 Feb 2010 08:24:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-7754426208514842437</guid><description>&lt;strong&gt;&lt;span style="font-size: large;"&gt;New Functionality&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;1. &lt;a href="https://sourceforge.net/tracker/?func=detail&amp;amp;aid=2941539&amp;amp;group_id=244764&amp;amp;atid=1126021"&gt;Option to overwrite schema attributes in command line&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
Now you can parameterize you schema and control any of its&amp;nbsp;attributes through command line parameters.&lt;br /&gt;
&lt;br /&gt;
I you want to pass&amp;nbsp;value to the schema through&amp;nbsp;command line you need to do the following:&lt;br /&gt;
1) Add Global Variable (in Options) to your schema to define a part of the file name i.e.: &lt;strong&gt;&lt;span style="color: #351c75;"&gt;filesufix&lt;/span&gt;&lt;/strong&gt; &lt;br /&gt;
2) Change file name in the schema to something like this: &lt;br /&gt;
&lt;strong&gt;&lt;span style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Name="MyFile-[Constant('filesufix')].csv"&lt;/span&gt; &lt;/strong&gt;&lt;br /&gt;
3) Call FlaFi in command line like this: &lt;br /&gt;
&lt;span style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;strong&gt;C:\Program Files\Flat File Checker\FlaFi "SchemaPath.xml" -filesufix 20100124&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Does any other application have something cool like that?&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;2. &lt;/strong&gt;&lt;a href="https://sourceforge.net/tracker/?func=detail&amp;amp;aid=2841810&amp;amp;group_id=244764&amp;amp;atid=1126021"&gt;&lt;strong&gt;Drag and Drop Rules&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Now you can drag &amp;amp; drop rules in the rule builder which is an amasing experience!&lt;br /&gt;
&lt;br /&gt;
3. &lt;a href="https://sourceforge.net/tracker/?func=detail&amp;amp;aid=2939429&amp;amp;group_id=244764&amp;amp;atid=1126021"&gt;&lt;strong&gt;StdOut Show Errors&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Now you can use &lt;strong&gt;&lt;span style="color: #351c75; font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;-errors&lt;/span&gt;&lt;/strong&gt; token in the console version of the application to echo data errors.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Bug Fixes&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Command line execution not returning errorlevel&lt;/li&gt;
&lt;li&gt;"Has Header" checkbox not preserved&lt;/li&gt;
&lt;li&gt;Global Variable without value - unhandled exception&lt;/li&gt;
&lt;li&gt;Start and End positions are not saved.&lt;/li&gt;
&lt;li&gt;Start Column default value&lt;/li&gt;
&lt;li&gt;Custom Query Screen - improved interface&lt;/li&gt;
&lt;li&gt;Mid function in the VB Expression &lt;/li&gt;
&lt;li&gt;Constant not working in data and error file specifications&lt;/li&gt;
&lt;/ul&gt;See project's issue&amp;nbsp;&lt;a href="https://sourceforge.net/tracker/?group_id=244764"&gt;tracker&lt;/a&gt; for details.&lt;br /&gt;
&lt;br /&gt;
Join &lt;a href="http://groups.google.com/group/flat-file-checker/"&gt;project group&lt;/a&gt; to dowload this version!</description><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>How to make data exchange work?</title><link>http://blog.flat-file.net/2010/01/how-to-make-data-exchange-work.html</link><category>data exchange</category><category>export</category><category>import</category><pubDate>Sat, 30 Jan 2010 12:40:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-4712214617497163166</guid><description>&lt;h4&gt;Introduction&lt;/h4&gt;&lt;p&gt;Organisations need to get data from external sources and load it to a database. With outsourcing of processes this need is growing fast. Customer databases (CRM) base the core for business processes and data management becomes the priority. It is common that data is exchanged within text files in pseudo formats (.csv, .psv, fixed position) and loaded with special utilities.&lt;br /&gt;
&lt;br /&gt;
Though the process may look simple, it often fails to work. The reason behind this is the difference between business rules and database schemas between organisations.&lt;br /&gt;
&lt;br /&gt;
The ETL (Extract, Transform, Load) process is not that simple because tables, fields and constraints are not the same for two different systems. Moreover, data quality of&amp;nbsp;external&amp;nbsp;sources is often inadequate and causes problems. &lt;/p&gt;&lt;h4&gt;Prepare lookup files&lt;/h4&gt;&lt;div&gt;Create data files that contain internal codes or &lt;a href="http://en.wikipedia.org/wiki/Master_Data_Management"&gt;master data&lt;/a&gt; from your system against which data providers will be able to validate exported data. Such file could contain:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Product codes&lt;/li&gt;
&lt;li&gt;Titles&lt;/li&gt;
&lt;li&gt;Marketing campaigns&amp;nbsp;&lt;/li&gt;
&lt;li&gt;And other reference data.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;h4&gt;Create the specification &lt;/h4&gt;Data exchange is based on a specification that can be used by database programmers to understand the format of the data in the file. Therefore, it should be a well structured document with description of all tables and fields. Descriptions can be formal (based on programming language) or informal. Flat File Checker provides an easy way to build such schema in which each data element (table, field) can be defined by both data rule and free text comment. The benefit of using &lt;a href="http://www.flat-file.net/"&gt;Flat File Checker&lt;/a&gt; is that this schema is both readable and executable.&lt;br /&gt;
&lt;h4&gt;Build your knowledge&lt;/h4&gt;&lt;p&gt;With FFC you can easily extend schema without writing any code. It is important to add new rules to the schema each time it fails to catch errors.&lt;/p&gt;&lt;h4&gt;Let them do it or automate it&lt;/h4&gt;&lt;div&gt;As soon as your&amp;nbsp;specification&amp;nbsp;is ready you can&amp;nbsp;delegate data validation to your data provider by just sending them the schema and the link to the Flat File Checker's &lt;a href="http://www.flat-file.net/download.html"&gt;download page&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you need to validate data yourself you can use command line version of the application to &lt;a href="http://www.flat-file.net/forum/viewtopic.php?f=13&amp;amp;t=14"&gt;automate the process&lt;/a&gt;.&lt;/div&gt;</description><author>bulat@flat-file.net (Bulat Yapparov)</author><enclosure length="68234" type="application/octet-stream" url="http://www.flat-file.net/forum/viewtopic.php?f=13&amp;amp;t=14"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>Introduction Organisations need to get data from external sources and load it to a database. With outsourcing of processes this need is growing fast. Customer databases (CRM) base the core for business processes and data management becomes the priority. It is common that data is exchanged within text files in pseudo formats (.csv, .psv, fixed position) and loaded with special utilities. Though the process may look simple, it often fails to work. The reason behind this is the difference between business rules and database schemas between organisations. The ETL (Extract, Transform, Load) process is not that simple because tables, fields and constraints are not the same for two different systems. Moreover, data quality of&amp;nbsp;external&amp;nbsp;sources is often inadequate and causes problems. Prepare lookup filesCreate data files that contain internal codes or master data from your system against which data providers will be able to validate exported data. Such file could contain:Product codes Titles Marketing campaigns&amp;nbsp; And other reference data. Create the specification Data exchange is based on a specification that can be used by database programmers to understand the format of the data in the file. Therefore, it should be a well structured document with description of all tables and fields. Descriptions can be formal (based on programming language) or informal. Flat File Checker provides an easy way to build such schema in which each data element (table, field) can be defined by both data rule and free text comment. The benefit of using Flat File Checker is that this schema is both readable and executable. Build your knowledge With FFC you can easily extend schema without writing any code. It is important to add new rules to the schema each time it fails to catch errors.Let them do it or automate itAs soon as your&amp;nbsp;specification&amp;nbsp;is ready you can&amp;nbsp;delegate data validation to your data provider by just sending them the schema and the link to the Flat File Checker's download page. If you need to validate data yourself you can use command line version of the application to automate the process.</itunes:subtitle><itunes:author>Bulat Yapparov</itunes:author><itunes:summary>Introduction Organisations need to get data from external sources and load it to a database. With outsourcing of processes this need is growing fast. Customer databases (CRM) base the core for business processes and data management becomes the priority. It is common that data is exchanged within text files in pseudo formats (.csv, .psv, fixed position) and loaded with special utilities. Though the process may look simple, it often fails to work. The reason behind this is the difference between business rules and database schemas between organisations. The ETL (Extract, Transform, Load) process is not that simple because tables, fields and constraints are not the same for two different systems. Moreover, data quality of&amp;nbsp;external&amp;nbsp;sources is often inadequate and causes problems. Prepare lookup filesCreate data files that contain internal codes or master data from your system against which data providers will be able to validate exported data. Such file could contain:Product codes Titles Marketing campaigns&amp;nbsp; And other reference data. Create the specification Data exchange is based on a specification that can be used by database programmers to understand the format of the data in the file. Therefore, it should be a well structured document with description of all tables and fields. Descriptions can be formal (based on programming language) or informal. Flat File Checker provides an easy way to build such schema in which each data element (table, field) can be defined by both data rule and free text comment. The benefit of using Flat File Checker is that this schema is both readable and executable. Build your knowledge With FFC you can easily extend schema without writing any code. It is important to add new rules to the schema each time it fails to catch errors.Let them do it or automate itAs soon as your&amp;nbsp;specification&amp;nbsp;is ready you can&amp;nbsp;delegate data validation to your data provider by just sending them the schema and the link to the Flat File Checker's download page. If you need to validate data yourself you can use command line version of the application to automate the process.</itunes:summary><itunes:keywords>data exchange, export, import</itunes:keywords></item><item><title>Version 0.6.9 is released</title><link>http://blog.flat-file.net/2009/12/version-069-is-released.html</link><category>correct errors</category><category>new version</category><pubDate>Fri, 11 Dec 2009 06:59:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-5230582206924112343</guid><description>Version 0.6.9 includes a feature that&amp;nbsp;hopefully will make you scream with joy.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Finally it is&amp;nbsp;possible&amp;nbsp;to correct erroneous values directly from Flat File Checker with out going to any text editors or MS Excel.&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Lets see how it works:&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;1) After the validation was complete we open the data error list (&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEx7VyMvHMcE7pW_mMYg50KY12VzRTFTZSOA51B-MvSiQn9FJKkirBKONL39R5oUAcw0syPFfzKDlTLG1bGSxUMd4Quu_439qifQqReA-nzZmPSW2B5vmspKGLBryLOMEx_DuarLFJO1w/s320/error_list_ico.jpg" /&gt;) : &lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqYE6xPTcXqLvh5h3pSBrzNF5KCwc-nK7qGn2txXiaJ8Y_yRaG2wWTnu-RZvx_LLy9Dz5rzxvKV1kkCh_Getf5GbAIO2B5ScP2OBlldNXIRX8vYEOoCOrsyakiBIsNrn4U5l1wxLaNua0/s1600-h/data_errors.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqYE6xPTcXqLvh5h3pSBrzNF5KCwc-nK7qGn2txXiaJ8Y_yRaG2wWTnu-RZvx_LLy9Dz5rzxvKV1kkCh_Getf5GbAIO2B5ScP2OBlldNXIRX8vYEOoCOrsyakiBIsNrn4U5l1wxLaNua0/s400/data_errors.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
2) Change one or more values directly in the grid:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1aLQTNQWufw49CsIzDeUv9RF4OmeS943acB9J-viANe4Wnzjs2QzzaNJ8ohAGshtLLcK4OvTn49ktcMnYoW4yW2wK6rwMtjnz-EZTCHpnDVqD2nCwvcYGHtiMVnSZMDDlnvRFx5kUSQ0/s1600-h/data_errors_changed.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1aLQTNQWufw49CsIzDeUv9RF4OmeS943acB9J-viANe4Wnzjs2QzzaNJ8ohAGshtLLcK4OvTn49ktcMnYoW4yW2wK6rwMtjnz-EZTCHpnDVqD2nCwvcYGHtiMVnSZMDDlnvRFx5kUSQ0/s320/data_errors_changed.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Now few things are new on this form&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;changed values are&amp;nbsp;highlighted with blue&amp;nbsp;background;&lt;/li&gt;
&lt;li&gt;message in the left-bottom conner tells how many values were changed;&lt;/li&gt;
&lt;li&gt;"Apply Changes" button allows to apply corrections done in the form to the original data files.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;3) After we click on "Apply Changes" button few things will happen:&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Corrected values will disappear from the errors list;&lt;/li&gt;
&lt;li&gt;"Apply Changes" button&amp;nbsp;itself &amp;nbsp;will&amp;nbsp;disappear or become disabled;&lt;/li&gt;
&lt;li&gt;Message will show the status of file update:&lt;/li&gt;
&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKfiKfccp-fj6tFHnZrsZbfs1A-iUaLId82OsIBgJjcPQfIiHro2rmnGuiakG9vMvu7hyphenhyphennWujQkQRE1YsxLDP5JQGiLKvyOdTK1bUnyUDFh36uht2WiyxTuJS7qobGnaZ5Iim7f9mUGpM/s1600-h/data_errors_applied.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKfiKfccp-fj6tFHnZrsZbfs1A-iUaLId82OsIBgJjcPQfIiHro2rmnGuiakG9vMvu7hyphenhyphennWujQkQRE1YsxLDP5JQGiLKvyOdTK1bUnyUDFh36uht2WiyxTuJS7qobGnaZ5Iim7f9mUGpM/s320/data_errors_applied.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Hope this new feature will streamline the work with data in flat files even more!&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
Windows installer can be downloaded&amp;nbsp;&lt;a href="http://groups.google.com/group/flat-file-checker"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEx7VyMvHMcE7pW_mMYg50KY12VzRTFTZSOA51B-MvSiQn9FJKkirBKONL39R5oUAcw0syPFfzKDlTLG1bGSxUMd4Quu_439qifQqReA-nzZmPSW2B5vmspKGLBryLOMEx_DuarLFJO1w/s72-c/error_list_ico.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Version 0.6.8 is released</title><link>http://blog.flat-file.net/2009/12/version-068-is-released.html</link><pubDate>Sun, 6 Dec 2009 05:37:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-7301247522666817279</guid><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
New features in v.0.6.8:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Global Variables&lt;/b&gt;&lt;br /&gt;
It is now possible to define global variables that are accessible from different parts of the schema.&lt;br /&gt;
&lt;br /&gt;
To add new variables or edit existing ones click on &lt;i&gt;&lt;b&gt;Options-&amp;gt;Global Variables&lt;/b&gt;&lt;/i&gt; in main form menu:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWLI4XR-EKs6uE25LCCpws0k3tv2N2_7v3GFmOhFY8_CzswmEBW2gxtC2Kj5bvfqR3hyi41-_sJ1rnyJKR9OCAZoX4qGc6Ye0t8M2tPkebk1L08u2tawlgqO3ThNjePXp5IPCv1ZaQkGk/s1600-h/global_variables.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWLI4XR-EKs6uE25LCCpws0k3tv2N2_7v3GFmOhFY8_CzswmEBW2gxtC2Kj5bvfqR3hyi41-_sJ1rnyJKR9OCAZoX4qGc6Ye0t8M2tPkebk1L08u2tawlgqO3ThNjePXp5IPCv1ZaQkGk/s640/global_variables.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;In the Global Constant Variables form fill in names of&amp;nbsp;variables&amp;nbsp;and their values.&lt;br /&gt;
&lt;br /&gt;
Now you can use these values in different places of the schema through &lt;b&gt;&lt;span style="color: #20124d;"&gt;Constant &lt;/span&gt;&lt;span style="font-weight: normal;"&gt;function in VB expression, i.e.:&amp;nbsp;[Constant('AgencyCode')] will be replaced with "RK".&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This functionality can be useful if you want to use same schema for data files where some parameters change&amp;nbsp;regularly.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Copy objects&lt;/b&gt;&lt;br /&gt;
Now it is&amp;nbsp;possible&amp;nbsp;to copy existing files or fields through GUI.&lt;br /&gt;
For example you can copy field with all rules from one file to another:&lt;br /&gt;
&lt;b&gt;Copy field:&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA3NzFOYn4_Ed4U7VC96cyRwbG8C9oeXtN-i63zNlrlkqyMB-PZquFstpUPsxykFl4h7DPXIkQaji__eqe3rbZwe1kcwD9FQ8bwj9aWQD-EjnxpMG_shKqw2qv0WvMB58MewWXoNz9SJI/s1600-h/copy_field.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA3NzFOYn4_Ed4U7VC96cyRwbG8C9oeXtN-i63zNlrlkqyMB-PZquFstpUPsxykFl4h7DPXIkQaji__eqe3rbZwe1kcwD9FQ8bwj9aWQD-EjnxpMG_shKqw2qv0WvMB58MewWXoNz9SJI/s320/copy_field.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt; Paste field:&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtxtdiIwnXNx-jqVejOLMMgiWBPtIgoA9n2Ottp6P-URJeDsBE6vOodwRnYeOQ0U9HdOnHDl1QGvMfFr2ziy4O4d_QYtGF77GSVhU9wfsLFOe00xN734SdTc9I_YK-v6g8wsdd-Rgp2eM/s1600-h/paste_field.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtxtdiIwnXNx-jqVejOLMMgiWBPtIgoA9n2Ottp6P-URJeDsBE6vOodwRnYeOQ0U9HdOnHDl1QGvMfFr2ziy4O4d_QYtGF77GSVhU9wfsLFOe00xN734SdTc9I_YK-v6g8wsdd-Rgp2eM/s320/paste_field.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWLI4XR-EKs6uE25LCCpws0k3tv2N2_7v3GFmOhFY8_CzswmEBW2gxtC2Kj5bvfqR3hyi41-_sJ1rnyJKR9OCAZoX4qGc6Ye0t8M2tPkebk1L08u2tawlgqO3ThNjePXp5IPCv1ZaQkGk/s72-c/global_variables.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Freeware and Motivation</title><link>http://blog.flat-file.net/2009/11/donationware-and-motivation.html</link><category>Donationware</category><category>motivation</category><pubDate>Thu, 26 Nov 2009 08:13:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-7680905427787569277</guid><description>You have probably seen a good open source project getting abandoned (&lt;a href="http://camstudio.org/blog/help-me-keep-camstudio-alive"&gt;CamStudio&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/NDoc"&gt;NDoc&lt;/a&gt; and many more) by developers due to poor motivation to continue. I have been thinking whether there is a way to sustain the motivation, and have explored the examples of both open source and proprietary software projects on the subject.&lt;br /&gt;
&lt;br /&gt;
The findings of my research are easy to understand, but difficult to accept:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Developers need external motivation to keep the project running after the "magic" of the initial idea is gone.&lt;/li&gt;
&lt;li&gt;Users only contribute when they have a clear incentive to do so.&lt;/li&gt;
&lt;/ul&gt;Keeping this in mind, I have decided to create a brief outline of the main factors that can help any open source project to stay alive.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Developers' Motivation to Contribute&lt;/strong&gt;&lt;br /&gt;
At the start of the project, I as a developer was motivated by the mere idea that &lt;a href="http://www.flat-file.net/"&gt;Flat File Checker&lt;/a&gt; can optimise the way organisations exchange data, improve the quality of data and spare the data people from mundane and tedious manual work. As the project moved ahead, it brought about loads of little tasks that I was happy to solve as they came. I have extended my knowledge in various areas&amp;nbsp;of application design and data quality, and this alone was quite exciting. &lt;br /&gt;
&lt;br /&gt;
Today, as the development phase has essentially passed, my motivation has become much more prosaic. Now I have to face a different set of goals such as marketing and promotion, and recruiting new users is not something I like to do, so obviously just running the project for fun does not make sense to me anymore. What would be the alternative source of motivation? In theory, a developer expects two main benefits from his work: recognition (of his efforts, intelligence etc.) and revenues. In my case, these two would be: feedback from users (so I know that I don't waste my time) and earnings sufficient to cover project expenses including my precious time.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Users' Motivation to Contribute&lt;/strong&gt;&lt;br /&gt;
The user's motivation to use the application is quite straightforward: it depends on the application's ability to efficiently solve the given task. However, when it comes to motivation to contribute, there is none even when the user is happy with the application. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Get Your User Involved&lt;/strong&gt;&lt;br /&gt;
It seems that an open source project is unlikely to progress when the user community does not support it. Without users contributing to the project, developers feel frustrated about their apparently meaningless work. As a result, either the project is dropped, or developers start charging. &lt;br /&gt;
&lt;br /&gt;
Since neither of these options appeals to me, I kept trying to figure out how to&amp;nbsp;motivate users to provide feedback or to make donations to keep the project going. The next section of the post lists the conclusions I came up with; I also include a diagram that helps illustrate my thoughts.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Framework&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;span style="background-color: #eeeeee; color: #351c75;"&gt;&lt;strong&gt;H1&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #eeeeee;"&gt;: User is more likely to spent more money if he can save time by doing it.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
Vendors request users to register every year and this is a good&amp;nbsp;artificial&amp;nbsp;way to make user to spend time.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;span style="background-color: #eeeeee; color: #351c75;"&gt;&lt;strong&gt;H2&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #eeeeee;"&gt;: User is more likely to spent more money if he will get a better&amp;nbsp;product&amp;nbsp;for it.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
This is a microeconomics rule for most of the products.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;span style="background-color: #eeeeee; color: #351c75;"&gt;&lt;strong&gt;H3&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #eeeeee;"&gt;: User is more&amp;nbsp;likely&amp;nbsp;to spend time on the project if he will get a better product for it.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
H3 is the same as H2 if we can find the price of user's time.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;span style="background-color: #eeeeee; color: #351c75;"&gt;&lt;strong&gt;H4&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #eeeeee;"&gt;: User is more&amp;nbsp;likely&amp;nbsp;to spend time on the project if his effort is recognised.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
This is a&amp;nbsp;behaviour dogma that is used in many social web projects (digg, facebook, etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;span style="background-color: #eeeeee; color: #351c75;"&gt;&lt;strong&gt;H5(A)&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #eeeeee;"&gt;: Developer's perceived&amp;nbsp;recognition depends on how much&amp;nbsp;time users spend on the project.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
That is my personal opinion which can be tested.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;span style="background-color: #eeeeee; color: #351c75;"&gt;&lt;strong&gt;H5(B)&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #eeeeee;"&gt;: Developer's motivation depends on his perceived recognition.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
H5 is similar to H4 but applied to developer.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;span style="background-color: #eeeeee; color: #351c75;"&gt;&lt;strong&gt;H6&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #eeeeee;"&gt;: Developer is more likely to work on the project if he gets money for it.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
Conclusion derived from motivation theories but can be tested.&lt;br /&gt;
&lt;br /&gt;
A priory statement that defines user contribution to the project: &lt;br /&gt;
&lt;em&gt;&lt;span style="background-color: #eeeeee; color: #351c75;"&gt;&lt;strong&gt;A1&lt;/strong&gt;&lt;/span&gt;&lt;span style="background-color: #eeeeee;"&gt;: User needs to spend time or donate to make a contribution. Therefore, user's &lt;strong&gt;contribution consists of time and money&lt;/strong&gt; spent on the project.&amp;nbsp;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Here is the diagram that represents set of hypothesises that were discussed above:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2yGQct7E6ofc-caUc1LZZm2PXA4NABc6OoFub4vL2yVWkGdJIdgz84DuoEZZpIgtAm0cS6Bddm-WJcyu76ZgbKIw84lO16GYosvYcQsUFh8UPfmtRXQM6n1AgB4pduXd8zfBh1X6oukY/s1600-h/os_motivation.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2yGQct7E6ofc-caUc1LZZm2PXA4NABc6OoFub4vL2yVWkGdJIdgz84DuoEZZpIgtAm0cS6Bddm-WJcyu76ZgbKIw84lO16GYosvYcQsUFh8UPfmtRXQM6n1AgB4pduXd8zfBh1X6oukY/s640/os_motivation.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
So what I&amp;nbsp;want from a user&amp;nbsp;boils&amp;nbsp;down to&amp;nbsp;contribution that will motivate me to continue working on the project. And to motivate users to spend their time or money (see &lt;span style="color: #351c75;"&gt;&lt;strong&gt;A1&lt;/strong&gt;&lt;/span&gt;) on the project I need to give them better version of the product and recognition for their contribution. Simple market exchange is healthy for both developers and users.&amp;nbsp;So if user does not get involved then he does not get the best available version and his name will not be on an "I saved the world today" list. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Definition&amp;nbsp;of Variables&lt;/strong&gt;&lt;br /&gt;
&lt;span style="color: #351c75;"&gt;&lt;strong&gt;User contribution&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;- is measured in&amp;nbsp;&lt;span style="color: #351c75;"&gt;&lt;strong&gt;points&lt;/strong&gt;&lt;/span&gt; that will be credited for any activity&amp;nbsp;beneficial&amp;nbsp;to the project, such as: donation,&amp;nbsp;submission&amp;nbsp;of&amp;nbsp;a bug, feature request, link from blog,&amp;nbsp;etc.&lt;br /&gt;
I think that the points based system is the most appropriate, though a bit complicated.&amp;nbsp;The problem is to define how exactly points should be credited. As an old book wrongly says - "&lt;span style="color: #444444;"&gt;&lt;strong&gt;People only do for what they are paid for"&lt;/strong&gt;&lt;/span&gt; (If no book says such things, at least some book says about money and motivation).&lt;br /&gt;
&lt;br /&gt;
Let's see a theoretical example of how &lt;span style="color: #351c75;"&gt;&lt;strong&gt;&lt;em&gt;contribution&amp;nbsp;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;can be&amp;nbsp;calculated in&amp;nbsp;&lt;span style="color: #351c75;"&gt;&lt;strong&gt;&lt;em&gt;points&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;$1 donation - 1 point.&lt;/li&gt;
&lt;li&gt;Submitted&amp;nbsp;bug - 5-20 points (on &lt;a href="http://sourceforge.net/projects/flafi/"&gt;SourceForge.net&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Feature request - 10 points (on &lt;a href="http://sourceforge.net/projects/flafi/"&gt;SourceForge.net&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Links from relevant&amp;nbsp;web page&amp;nbsp;or blog - 10-100 points (to &lt;a href="http://www.flat-file.net/"&gt;project's website&lt;/a&gt;&amp;nbsp;page;&amp;nbsp;rated by&amp;nbsp;&lt;a href="http://websitegrader.com/"&gt;Website Grader&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Business case- 50-100 points (submitted&amp;nbsp;on the&amp;nbsp;Forum)&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Name of the organisation&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Description of how software is used and what problems it solves&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Allow to use organisation name and logo on "&lt;strong&gt;&lt;em&gt;Users&lt;/em&gt;&lt;/strong&gt;" page - 50-150 points&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Join the project - 10-200 points&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Programmer;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Technical writer;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Translator.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;em&gt;&lt;strong&gt;Note: &lt;/strong&gt;All this points are subject to conditions. For example if feature request is absolutely irrelevant, then points for it will not be granted. Also where credited points are given as range, it is developers right to decide the final number of points that will be credited to the user for specific action. I will need to spend some time to finalise my estimates of each action before this "point based system" will appear on the main page of the website.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #351c75;"&gt;&lt;strong&gt;Donation&lt;/strong&gt;&lt;/span&gt; - Money spent in $&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #351c75;"&gt;&lt;strong&gt;Product's Quality&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;- Release delay in months.&lt;br /&gt;
This is an open project and I don't want to produce cripple-ware&amp;nbsp;versions with limited functions and make users to pay for "pro" versions.&amp;nbsp;So the only option I see is delays in release times. Users&amp;nbsp;who&amp;nbsp;got involved or&amp;nbsp;donated to the&amp;nbsp;project will get new&amp;nbsp;releases first without any delays, while other users will get&amp;nbsp;releases with a delay. Though&amp;nbsp;this&amp;nbsp;model is not exactly what open source is about, I&amp;nbsp;think it is fair.&lt;br /&gt;
&lt;br /&gt;
So application&amp;nbsp;release delay depends on how much points you have:&lt;br /&gt;
&lt;table border="0" style="border-collapse: collapse;"&gt;&lt;caption&gt;        &lt;div style="background: #a4ac86; text-align: center;"&gt;&lt;strong&gt;Fairware* "price" structure&lt;/strong&gt;&lt;/div&gt;&lt;/caption&gt; &lt;colgroup&gt;&lt;col style="width: 85px;"&gt;&lt;/col&gt;&lt;col style="width: 111px;"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;
&lt;tr style="background: #c4bc96;"&gt;&lt;td colspan="2" style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;&lt;strong&gt;Release delay &lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 8pt;"&gt;&lt;strong&gt;(months)&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="border-bottom: solid 0.5pt; border-right: solid 0.5pt; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;&lt;strong&gt;User Contribution &lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 8pt;"&gt;&lt;strong&gt;(points)&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="background: #ddd9c3;"&gt;&lt;td colspan="2" style="border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;0&lt;/div&gt;&lt;/td&gt;&lt;td style="border-right: solid 0.5pt; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;199&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="background: #eeece1;"&gt;&lt;td colspan="2" style="border-left: solid 0.5pt; border-right: solid 0.5pt; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;1&lt;/div&gt;&lt;/td&gt;&lt;td style="border-right: solid 0.5pt; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;99&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="background: #ddd9c3;"&gt;&lt;td colspan="2" style="border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;3&lt;/div&gt;&lt;/td&gt;&lt;td style="border-right: solid 0.5pt; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;49&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="background: #eeece1;"&gt;&lt;td colspan="2" style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: none; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;6&lt;/div&gt;&lt;/td&gt;&lt;td style="border-bottom: solid 0.5pt; border-right: solid 0.5pt; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px;" valign="middle"&gt;&lt;div style="text-align: center;"&gt;0&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;span xmlns=""&gt;&lt;em&gt;* Modified version of open source software, in which user's contribution towards the project gives him access to the most recent versions.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
So if user did not contribute to the project his version of software will be maximum 6 months out of date. I think this is a fair play and would like to hear what other people think?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #351c75;"&gt;&lt;strong&gt;Developer's Motivation&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;- Can be measured through developer's performance, which can be in its turn measured by the number of lines of code&amp;nbsp;written within a period. Though this is a primitive measure (often I would rather "bonus" myself&amp;nbsp;for reducing the number of code lines) it is easy to understand and to measure. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;
this was just a though and I am sure that I am not going to implement all that. Managing such system within one open source project will impossible and pointless as all this is based on hypothesis. &lt;br /&gt;
&lt;br /&gt;
However, I have decided to make new releases available only to &lt;a href="http://groups.google.com/group/flat-file-checker"&gt;the smaller group of users&lt;/a&gt; who are ready to register to download the application. Moreover, license for these latest releases is slightly different from basic GNU Licence and requires commercial users of application to contribute.&lt;br /&gt;
&lt;br /&gt;
This article was an attempt to define fair-ware instead of donation-ware, which is a concept that does not work to well in the real world (list of examples includes all communist countries). It would be nice if SourceForge and other software hosting providers had&amp;nbsp;such functionality to support developers and award users who make contributions.&lt;/span&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2yGQct7E6ofc-caUc1LZZm2PXA4NABc6OoFub4vL2yVWkGdJIdgz84DuoEZZpIgtAm0cS6Bddm-WJcyu76ZgbKIw84lO16GYosvYcQsUFh8UPfmtRXQM6n1AgB4pduXd8zfBh1X6oukY/s72-c/os_motivation.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>API Documentation</title><link>http://blog.flat-file.net/2009/11/api-documentation.html</link><category>API</category><category>Documentation</category><pubDate>Tue, 24 Nov 2009 10:30:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-4746051178129781954</guid><description>This week I was working hard to produce API&amp;nbsp;documentation for application's core DLL -&amp;nbsp;FlatFileLibrary.dll.&amp;nbsp;It takes quite a while to feel in all the gaps in the comments but I am nearly there.&lt;br /&gt;
&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;a href="http://www.flat-file.net/api/index.html"&gt;&lt;b&gt;On-line API documentation&lt;/b&gt;&lt;/a&gt;&amp;nbsp;is now available, which will help if you are using the code in your project.&lt;br /&gt;
&lt;br /&gt;
This documentation is still not complete but it is evolving&amp;nbsp;rapidly. As Flat File Checker is at its Beta stage of development, names of classes and their members can change.&amp;nbsp;&amp;nbsp;&lt;b&gt;Everybody is invited to review the code and the documentation&lt;/b&gt;. You can leave your comments or questions on this post or send me an email.&lt;br /&gt;
&lt;br /&gt;
This documentation was created with&amp;nbsp;&lt;a href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt;&amp;nbsp;that is why it looks so good.&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;</description><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Version 0.6.7 is released</title><link>http://blog.flat-file.net/2009/11/version-067-is-released.html</link><pubDate>Sat, 14 Nov 2009 09:52:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-3187244362014719977</guid><description>New in 0.6.7 release:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Data rule based on VB Expression:&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSxXbFsC3oIPnDluEGRpwZd-6hHgYdOnoukbln5_-5pVovjLL-uyO6poJ3xjHaDut9MBrYvJaoPlN-ZqktnVgoYS_P9wW7sDQRVANctaiB2L6oGxUIe9aVT5rfrR0d4w8g25ObtUUr48s/s1600-h/expression_checker.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSxXbFsC3oIPnDluEGRpwZd-6hHgYdOnoukbln5_-5pVovjLL-uyO6poJ3xjHaDut9MBrYvJaoPlN-ZqktnVgoYS_P9wW7sDQRVANctaiB2L6oGxUIe9aVT5rfrR0d4w8g25ObtUUr48s/s320/expression_checker.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Validation of fixed position files. Field position in the line can be defined in the Field Details form:&lt;/li&gt;
&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM_SOpn3-dKudVFZDuCcRx32B59h6n9m6crQw2DPQq_obFdysulrVTpZ-5GNgv6YageFbZaW5al0UhL1bxlw7bRENy6DAiJTYYvW9ghfF-bQkcYG9HAuAFj_kD3b8FOWwv99TbBS_htqk/s1600-h/fixed_len_field.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM_SOpn3-dKudVFZDuCcRx32B59h6n9m6crQw2DPQq_obFdysulrVTpZ-5GNgv6YageFbZaW5al0UhL1bxlw7bRENy6DAiJTYYvW9ghfF-bQkcYG9HAuAFj_kD3b8FOWwv99TbBS_htqk/s320/fixed_len_field.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSxXbFsC3oIPnDluEGRpwZd-6hHgYdOnoukbln5_-5pVovjLL-uyO6poJ3xjHaDut9MBrYvJaoPlN-ZqktnVgoYS_P9wW7sDQRVANctaiB2L6oGxUIe9aVT5rfrR0d4w8g25ObtUUr48s/s72-c/expression_checker.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Version 0.6.6 is released</title><link>http://blog.flat-file.net/2009/11/version-066-is-released.html</link><pubDate>Sun, 8 Nov 2009 09:31:00 -0800</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-2254604761572847561</guid><description>New in v.0.6.6 release:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Validation of files without headers;&lt;/li&gt;
&lt;li&gt;Field index in Field details form;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp1P14DQwWn23NJKPHp7lJ595Beez9AnehZGUt6VaKWKIWiN2ATn8x0vgWo04zrI7rC5I6mpHWbW-qUrodeEgNq8kqaHFLdBdmFNVNfdkBTkXo1TdTrtyiwEZxBAQNL8WTtdPkEKfMkRQ/s1600-h/field_details.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp1P14DQwWn23NJKPHp7lJ595Beez9AnehZGUt6VaKWKIWiN2ATn8x0vgWo04zrI7rC5I6mpHWbW-qUrodeEgNq8kqaHFLdBdmFNVNfdkBTkXo1TdTrtyiwEZxBAQNL8WTtdPkEKfMkRQ/s320/field_details.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Default folder for file set is shown in File Definition form:&lt;/li&gt;
&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVo6Nv9owDtqkHJPyVMoh_y1FsA5IOu_65F8YVUnHKilHP3mf3UoV_6ubjvCwl8-rrjPrTMwCswC5crdcheq8M1n77-rMEOzN-R_t77yqY-EpafzWfRljsKUsTkGdE5veHrrjdHePHtXc/s1600-h/file_definition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVo6Nv9owDtqkHJPyVMoh_y1FsA5IOu_65F8YVUnHKilHP3mf3UoV_6ubjvCwl8-rrjPrTMwCswC5crdcheq8M1n77-rMEOzN-R_t77yqY-EpafzWfRljsKUsTkGdE5veHrrjdHePHtXc/s320/file_definition.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="display:none;"&gt;&lt;a href="http://www.technorati.com/tags/Release" rel="tag"&gt;Release&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp1P14DQwWn23NJKPHp7lJ595Beez9AnehZGUt6VaKWKIWiN2ATn8x0vgWo04zrI7rC5I6mpHWbW-qUrodeEgNq8kqaHFLdBdmFNVNfdkBTkXo1TdTrtyiwEZxBAQNL8WTtdPkEKfMkRQ/s72-c/field_details.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item><item><title>Version 0.6.5 is released</title><link>http://blog.flat-file.net/2009/10/version-065-is-released.html</link><category>Version Release</category><pubDate>Sat, 31 Oct 2009 04:04:00 -0700</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8146935842722801828.post-4037463942512111877</guid><description>New in 0.6.5 release:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Custom query form - validate values in the file against external database.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzCrTB7UO41FeQPA-u4pCMG4dw7-QrVu8b_gPnRUS1C5T5wDObZRpEes2FfJlVXK6HwIIOLZDbbJLm8YHgF3fI32qoMUNp69LEApMbiftOUeuMfxKkH5bj4W4x30P8215EmAxiUegIITk/s1600-h/custom_query.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzCrTB7UO41FeQPA-u4pCMG4dw7-QrVu8b_gPnRUS1C5T5wDObZRpEes2FfJlVXK6HwIIOLZDbbJLm8YHgF3fI32qoMUNp69LEApMbiftOUeuMfxKkH5bj4W4x30P8215EmAxiUegIITk/s320/custom_query.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Compare fields form - compare fields within the file set.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJ-UEal1ftKQbdHMWtVJ3QvHvxX7JUoym_-jHvBbwS6wUnfx9IJGEoi9ZPSXgokieYPDnR4kytVogyj4dbaBbbZQ7Cnw_TxcGcK6M71Qow-BuwakNoQ0Pr1h1W-IaypHRftKCXrZtMOE/s1600-h/compare_fields.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJ-UEal1ftKQbdHMWtVJ3QvHvxX7JUoym_-jHvBbwS6wUnfx9IJGEoi9ZPSXgokieYPDnR4kytVogyj4dbaBbbZQ7Cnw_TxcGcK6M71Qow-BuwakNoQ0Pr1h1W-IaypHRftKCXrZtMOE/s320/compare_fields.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzCrTB7UO41FeQPA-u4pCMG4dw7-QrVu8b_gPnRUS1C5T5wDObZRpEes2FfJlVXK6HwIIOLZDbbJLm8YHgF3fI32qoMUNp69LEApMbiftOUeuMfxKkH5bj4W4x30P8215EmAxiUegIITk/s72-c/custom_query.jpg" width="72"/><author>bulat@flat-file.net (Bulat Yapparov)</author></item></channel></rss>