{"id":122,"date":"2025-11-05T21:53:47","date_gmt":"2025-11-05T21:53:47","guid":{"rendered":"http:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/?page_id=122"},"modified":"2025-11-05T21:53:47","modified_gmt":"2025-11-05T21:53:47","slug":"cleaning-tabular-data-using-talend","status":"publish","type":"page","link":"https:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/cleaning-tabular-data-using-talend\/","title":{"rendered":"Cleaning Tabular Data using Talend"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Talend Data Preparation Lab \u2014 Cleaning \u201ccustomers.xlsx\u201d<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Duration: 60\u201390 minutes | Difficulty: Beginner to Intermediate<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Overview &amp; Learning Outcomes<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In this lab you will import an Excel file into Talend Data Preparation (TDP), profile its quality, add column metadata, build a reproducible cleaning recipe, and export a clean version of the dataset. An optional section shows how to implement the same logic in Talend Studio (Data Integration) as a batch job.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Learning outcomes:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Import and profile a dataset in Talend Data Preparation (TDP).<\/li>\n\n\n\n<li>Add and curate metadata (column names, types, semantic types).<\/li>\n\n\n\n<li>Build a step-by-step cleaning recipe that fixes real data issues.<\/li>\n\n\n\n<li>Export a clean dataset and summarize before\/after quality metrics.<\/li>\n\n\n\n<li>Optionally, reproduce the logic in Talend Studio as a batch job.<\/li>\n<\/ol>\n\n\n\n<h1 class=\"wp-block-heading\">Files &amp; Setup<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You will use the provided file: customers.xlsx (sheet \u201csheet1\u201d, ~6,040 rows, 16 columns).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open Talend Data Preparation (Talend Cloud or on\u2011premise): sign in \u2192 open the Data Preparation app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Data&nbsp;costumers.xlsx :&nbsp;<a href=\"https:\/\/docs.google.com\/spreadsheets\/d\/1woGsb2ArNN0QSJUgklQRylfzz47E9HQ-\/edit?usp=sharing&amp;ouid=106532920956410672496&amp;rtpof=true&amp;sd=true\">https:\/\/docs.google.com\/spreadsheets\/d\/1woGsb2ArNN0QSJUgklQRylfzz47E9HQ-\/edit?usp=sharing&amp;ouid=106532920956410672496&amp;rtpof=true&amp;sd=true<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Part A \u2014 Import &amp; Profile the Dataset (TDP)<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>From the TDP home page, click \u201cDatasets\u201d in the left menu.<\/li>\n\n\n\n<li>Click \u201cAdd dataset\u201d (or \u201cAdd\u201d \u2192 \u201cFrom local file\u201d).<\/li>\n\n\n\n<li>Select the file customers.xlsx and upload it.<\/li>\n\n\n\n<li>If prompted for sheet selection, choose \u201csheet1\u201d. Keep \u201cFirst row is header\u201d enabled.<\/li>\n\n\n\n<li>Name the dataset customers_raw and click \u201cCreate\u201d (or \u201cAdd\u201d).<\/li>\n\n\n\n<li>Open the dataset by clicking its name. The grid view appears with column quality bars.<\/li>\n\n\n\n<li>Open the right\u2011hand \u201cStatistics\u201d \/ \u201cDetails\u201d panel (if hidden, use the panel toggle).<\/li>\n\n\n\n<li>Scroll columns and observe the quality bars (valid \/ empty \/ invalid) and top value distributions.<\/li>\n\n\n\n<li>Record short notes about issues you see (examples below).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Typical issues you will see in this file:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Email has missing values (~5.9%) and duplicate emails (~25).<\/li>\n\n\n\n<li>Phone contains many entries that are not 10 digits after removing punctuation (~700 invalid).<\/li>\n\n\n\n<li>Zip requires leading\u2011zero padding for many rows (~950).<\/li>\n\n\n\n<li>State should be 2\u2011letter uppercase codes; verify and standardize.<\/li>\n\n\n\n<li>subscription_date is parseable but formats may be inconsistent.<\/li>\n\n\n\n<li>marital_status has ~24% missing values.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Deliverable A: 5\u20138 lines describing the main data quality issues you observed, with 1\u20132 screenshots.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Part B \u2014 Add Metadata &amp; Semantic Types<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Rename columns, set data types, and assign semantic types.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>1) Rename columns (Right\u2011click column header \u2192 \u201cRename\u201d):<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Original name<\/td><td>New name<\/td><\/tr><tr><td>Id<\/td><td>id<\/td><\/tr><tr><td>First_Name<\/td><td>first_name<\/td><\/tr><tr><td>Last_Name<\/td><td>last_name<\/td><\/tr><tr><td>Gender<\/td><td>gender<\/td><\/tr><tr><td>Age<\/td><td>age<\/td><\/tr><tr><td>Occupation<\/td><td>occupation<\/td><\/tr><tr><td>MaritalStatus_Out<\/td><td>marital_status<\/td><\/tr><tr><td>Salary_Out<\/td><td>salary_band<\/td><\/tr><tr><td>Address<\/td><td>address<\/td><\/tr><tr><td>City<\/td><td>city<\/td><\/tr><tr><td>State<\/td><td>state<\/td><\/tr><tr><td>Zip<\/td><td>zip<\/td><\/tr><tr><td>Phone<\/td><td>phone<\/td><\/tr><tr><td>Email<\/td><td>email<\/td><\/tr><tr><td>SubDate<\/td><td>subscription_date<\/td><\/tr><tr><td>Number_of_rentals<\/td><td>rentals_count<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li>2) Set column data types:<\/li>\n\n\n\n<li>&#8211; id \u2192 Integer<\/li>\n\n\n\n<li>&#8211; first_name, last_name, full_name \u2192 Text<\/li>\n\n\n\n<li>&#8211; gender, age, occupation, marital_status, salary_band, address, city, state, zip, email, phone \u2192 Text<\/li>\n\n\n\n<li>&#8211; subscription_date \u2192 Date (set format: yyyy-MM-dd)<\/li>\n\n\n\n<li>&#8211; rentals_count \u2192 Integer (non\u2011negative)<\/li>\n\n\n\n<li>3) Assign semantic types (Column menu \u2192 \u201cSemantic type\u201d):<\/li>\n\n\n\n<li>&#8211; email \u2192 Email; state \u2192 US state code (or Code); zip \u2192 Zip\/Postal Code; subscription_date \u2192 Date.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Deliverable B: Screenshot of the schema panel and 1\u20132 lines justifying choices (e.g., zip stored as text to preserve leading zeros).<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Part C \u2014 Build the Cleaning Recipe (TDP)<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Apply the following steps in order. Each action is recorded in the \u201cRecipe\u201d panel. You can reorder steps by dragging them if needed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step C1 \u2014 Trim &amp; Normalize Text<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>On columns first_name, last_name, city, occupation: Column \u25b8 Clean \u25b8 Trim.<\/li>\n\n\n\n<li>Then Column \u25b8 Case \u25b8 Proper case (Title case) on first_name, last_name, city, occupation.<\/li>\n\n\n\n<li>On email: Column \u25b8 Clean \u25b8 Trim, then Column \u25b8 Case \u25b8 Lowercase.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Step C2 \u2014 Standardize US State Codes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On state: Column \u25b8 Case \u25b8 Uppercase.<\/li>\n\n\n\n<li>Column \u25b8 Validate \u25b8 \u201cValue is in list\u201d (paste the 2\u2011letter codes from Appendix A). Mark non\u2011matches as Invalid.<\/li>\n\n\n\n<li>Optionally: Column \u25b8 Find &amp; replace to fix frequent variants (e.g., \u2018Calif.\u2019\u2192\u2018CA\u2019, \u2018N.Y.\u2019\u2192\u2018NY\u2019). Add each replacement as a separate action so it is documented.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step C3 \u2014 Fix ZIP Codes (Preserve Leading Zeros)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On zip: Column \u25b8 Change type \u25b8 Text (String).<\/li>\n\n\n\n<li>Column \u25b8 Pad left \u25b8 Length = 5, Padding char = \u20180\u2019.<\/li>\n\n\n\n<li>Optional: Validate \u25b8 \u201cMatches pattern\u201d with regex ^\\d{5}$ to mark non\u20115\u2011digit ZIPs invalid.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step C4 \u2014 Normalize Phone Numbers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Goal: keep only digits, validate length = 10, and format as (XXX) XXX-XXXX.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create helper column phone_digits: Column \u25b8 Duplicate. Rename the duplicate to phone_digits.<\/li>\n\n\n\n<li>On phone_digits: Column \u25b8 Replace with RegEx. Pattern: \\D\u00a0\u00a0Replacement: (empty). This removes all non\u2011digits.<\/li>\n\n\n\n<li>Validate: Column \u25b8 Compute length (or Validate \u25b8 Matches pattern ^\\d{10}$). Mark non\u201110\u2011digit as Invalid.<\/li>\n\n\n\n<li>Create formatted column phone_formatted: Add column \u25b8 Formula (or Derived column). Build:\u00a0\u00a0&#8216;(&#8216; + SUBSTR(phone_digits,1,3) + &#8216;) &#8216; + SUBSTR(phone_digits,4,3) + &#8216;-&#8216; + SUBSTR(phone_digits,7,4)\u00a0<\/li>\n\n\n\n<li>Replace original phone with phone_formatted (Column \u25b8 Replace values from another column), or keep both and later delete helpers.<\/li>\n\n\n\n<li>Delete helper columns phone_digits and phone_formatted after verifying results.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step C5 \u2014 Validate &amp; De\u2011duplicate Emails<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On email: Column \u25b8 Validate \u25b8 Email format.\u00a0Review invalid values.<\/li>\n\n\n\n<li>Optional standardizations: Column \u25b8 Find &amp; replace common typos (e.g., \u2018gmal.com\u2019\u2192\u2018gmail.com\u2019).<\/li>\n\n\n\n<li>Remove duplicates: Toolbar \u25b8 Remove duplicates \u25b8 Select column email \u25b8 Keep first occurrence.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step C6 \u2014 Parse Dates &amp; Derive Year\/Month<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On subscription_date: Column \u25b8 Change type \u25b8 Date. Specify the input format if asked (e.g., MM\/dd\/yyyy).<\/li>\n\n\n\n<li>Standardize display format to yyyy\u2011MM\u2011dd (Column \u25b8 Format date).<\/li>\n\n\n\n<li>Add derived columns: Column \u25b8 Extract \u25b8 Year (signup_year) and Extract \u25b8 Month (signup_month).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step C7 \u2014 Normalize Categorical Values<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On gender: Column \u25b8 Find &amp; replace to map variations to a canonical set (e.g., \u2018F\u2019\u2192\u2018Female\u2019, \u2018M\u2019\u2192\u2018Male\u2019).<\/li>\n\n\n\n<li>On marital_status: Decide a policy. If you need a value for analytics, Column \u25b8 Fill empty cells \u25b8 with \u2018Unknown\u2019. Otherwise leave empty.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step C8 \u2014 Validate Numeric Columns<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On rentals_count: Column \u25b8 Change type \u25b8 Integer.<\/li>\n\n\n\n<li>Validate non\u2011negative: Filter or Validate \u25b8 \u201cGreater or equal to 0\u201d. If invalid, choose to set to 0 (Column \u25b8 Replace invalids) or exclude rows.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step C9 \u2014 Optional: Addresses and Full Name<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create full_name: Add column \u25b8 Concatenate \u2192 first_name + &#8216; &#8216; + last_name.<\/li>\n\n\n\n<li>Standardize address abbreviations (Column \u25b8 Find &amp; replace list): St.\u2192Street, Rd.\u2192Road, Ave.\u2192Avenue, Blvd.\u2192Boulevard.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step C10 \u2014 Final Validation<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Re\u2011scan quality bars for email, phone, zip, state; no reds ideally.<\/li>\n\n\n\n<li>Remove columns you no longer need (Column \u25b8 Delete).<\/li>\n\n\n\n<li>Sort by id (Toolbar \u25b8 Sort) for deterministic output.<\/li>\n\n\n\n<li>Save the preparation. Give it a clear name, e.g., customers_clean_recipe.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Part D \u2014 Export the Clean Dataset<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Click Export.<\/li>\n\n\n\n<li>Choose CSV (UTF\u20118) or Excel (XLSX).<\/li>\n\n\n\n<li>Set file name: customers_clean.csv (or .xlsx).<\/li>\n\n\n\n<li>Confirm delimiter (comma) and date format (yyyy\u2011MM\u2011dd).<\/li>\n\n\n\n<li>Export and download the file.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Target schema of the clean file:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Column<\/td><td>Type<\/td><td>Notes<\/td><\/tr><tr><td>id<\/td><td>Integer<\/td><td>Primary key<\/td><\/tr><tr><td>first_name<\/td><td>Text<\/td><td>Trimmed, Proper Case<\/td><\/tr><tr><td>last_name<\/td><td>Text<\/td><td>Trimmed, Proper Case<\/td><\/tr><tr><td>full_name<\/td><td>Text<\/td><td>Derived<\/td><\/tr><tr><td>gender<\/td><td>Text<\/td><td>Canonical values<\/td><\/tr><tr><td>age<\/td><td>Text<\/td><td>Keep bands as text<\/td><\/tr><tr><td>occupation<\/td><td>Text<\/td><td>Proper Case<\/td><\/tr><tr><td>marital_status<\/td><td>Text<\/td><td>\u2018Unknown\u2019 or empty<\/td><\/tr><tr><td>salary_band<\/td><td>Text<\/td><td>Category<\/td><\/tr><tr><td>address<\/td><td>Text<\/td><td>Optional normalized abbreviations<\/td><\/tr><tr><td>city<\/td><td>Text<\/td><td>Proper Case<\/td><\/tr><tr><td>state<\/td><td>Text<\/td><td>2\u2011letter uppercase<\/td><\/tr><tr><td>zip<\/td><td>Text<\/td><td>5 chars, zero\u2011padded<\/td><\/tr><tr><td>phone<\/td><td>Text<\/td><td>(XXX) XXX\u2011XXXX or empty<\/td><\/tr><tr><td>email<\/td><td>Text<\/td><td>Lowercase, valid, unique<\/td><\/tr><tr><td>subscription_date<\/td><td>Date<\/td><td>yyyy\u2011MM\u2011dd<\/td><\/tr><tr><td>rentals_count<\/td><td>Integer<\/td><td>&gt;= 0<\/td><\/tr><tr><td>signup_year<\/td><td>Integer<\/td><td>Derived<\/td><\/tr><tr><td>signup_month<\/td><td>Integer<\/td><td>Derived<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Deliverable D: the exported file plus a 1\u2011page summary with before\/after quality metrics (valid emails\/phones\/ZIPs, duplicate emails removed).<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Appendix A \u2014 US State Codes (2\u2011letter)<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">AL, AK, AZ, AR, CA, CO, CT, DE, FL, GA, HI, ID, IL, IN, IA, KS, KY, LA, ME, MD, MA, MI, MN, MS, MO, MT, NE, NV, NH, NJ, NM, NY, NC, ND, OH, OK, OR, PA, RI, SC, SD, TN, TX, UT, VT, VA, WA, WV, WI, WY, DC<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Appendix B \u2014 Before\/After Quality Metrics to Report<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Email: % valid, % missing, duplicate count.<\/li>\n\n\n\n<li>Phone: % with 10 digits after normalization.<\/li>\n\n\n\n<li>Zip: % 5\u2011digit after padding.<\/li>\n\n\n\n<li>State: % valid 2\u2011letter codes.<\/li>\n\n\n\n<li>Dates: % successfully parsed (subscription_date).<\/li>\n\n\n\n<li>Rows removed (if any) and reason (invalid state\/phone, duplicate email, etc.).<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Talend Data Preparation Lab \u2014 Cleaning \u201ccustomers.xlsx\u201d Duration: 60\u201390 minutes | Difficulty: Beginner to Intermediate Overview &amp; Learning Outcomes In this lab you will import an Excel file into Talend Data Preparation (TDP), profile its quality, add column metadata, build &hellip; <a href=\"https:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/cleaning-tabular-data-using-talend\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":11,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-122","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/wp-json\/wp\/v2\/pages\/122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/wp-json\/wp\/v2\/comments?post=122"}],"version-history":[{"count":1,"href":"https:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/wp-json\/wp\/v2\/pages\/122\/revisions"}],"predecessor-version":[{"id":124,"href":"https:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/wp-json\/wp\/v2\/pages\/122\/revisions\/124"}],"wp:attachment":[{"href":"https:\/\/vargas-solar.com\/data-ware-lake-houses-bi\/wp-json\/wp\/v2\/media?parent=122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}