<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mahizul Islam</title>
    <description>The latest articles on DEV Community by Mahizul Islam (@mahizul).</description>
    <link>https://dev.to/mahizul</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3954282%2F53c71126-da8e-4c11-a964-a07be814336d.jpg</url>
      <title>DEV Community: Mahizul Islam</title>
      <link>https://dev.to/mahizul</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mahizul"/>
    <language>en</language>
    <item>
      <title>5 Common CSV Problems and How to Fix Them</title>
      <dc:creator>Mahizul Islam</dc:creator>
      <pubDate>Thu, 02 Jul 2026 07:37:08 +0000</pubDate>
      <link>https://dev.to/mahizul/5-common-csv-problems-and-how-to-fix-them-10dm</link>
      <guid>https://dev.to/mahizul/5-common-csv-problems-and-how-to-fix-them-10dm</guid>
      <description>&lt;h1&gt;
  
  
  5 Common CSV Problems and How to Fix Them
&lt;/h1&gt;

&lt;p&gt;CSV files are everywhere — database exports, spreadsheet &lt;br&gt;
data, API responses, analytics reports. But anyone who &lt;br&gt;
works with CSV regularly knows the frustration: files &lt;br&gt;
that look fine but break on import, columns that won't &lt;br&gt;
split, characters that turn into gibberish.&lt;/p&gt;

&lt;p&gt;Here are the 5 most common CSV problems and exactly &lt;br&gt;
how to fix each one.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Broken or Garbled Characters (â€™, Ã©, Â£)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it looks like:&lt;/strong&gt;&lt;br&gt;
Your CSV opens and instead of apostrophes you see â€™, &lt;br&gt;
instead of é you see Ã©, instead of £ you see Â£.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt;&lt;br&gt;
Your file was saved in Windows-1252 encoding (Excel's &lt;br&gt;
default on Windows) but opened as UTF-8. The two &lt;br&gt;
encodings interpret the same bytes differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;file.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;windows-1252&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fixed.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;iconv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;iconv-lite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file.csv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;iconv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;win1252&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fixed.csv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No-code option: Use a free &lt;a href="https://csvtojsonconverter.com/csv-to-utf-8-converter/" rel="noopener noreferrer"&gt;CSV to UTF-8 Converter&lt;/a&gt; &lt;br&gt;
that auto-detects the encoding and converts instantly &lt;br&gt;
in your browser.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. All Data Appears in One Column
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it looks like:&lt;/strong&gt;&lt;br&gt;
You open a CSV in Excel and instead of separate columns, &lt;br&gt;
everything is crammed into column A.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt;&lt;br&gt;
Your file uses a semicolon, tab, or pipe as the delimiter &lt;br&gt;
instead of a comma. Excel in European countries defaults &lt;br&gt;
to semicolons because commas are used as decimal separators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Excel: Don't double-click the file. Instead go to &lt;br&gt;
Data → From Text/CSV → select your file → choose the &lt;br&gt;
correct delimiter in the preview.&lt;/p&gt;

&lt;p&gt;In Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="c1"&gt;# Try semicolon delimiter
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;file.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Or tab
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;file.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No-code option: Use a free &lt;a href="https://csvtojsonconverter.com/csv-delimiter-changer/" rel="noopener noreferrer"&gt;CSV Delimiter Changer&lt;/a&gt; &lt;br&gt;
to convert between comma, semicolon, tab, and pipe &lt;br&gt;
delimiters instantly.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Inconsistent Column Count
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it looks like:&lt;/strong&gt;&lt;br&gt;
Row 1 has 5 columns, row 47 has 4, row 203 has 6. &lt;br&gt;
Your import fails with an error like "too many values &lt;br&gt;
to unpack."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt;&lt;br&gt;
Values containing commas weren't properly quoted, &lt;br&gt;
or rows were manually edited and a field was accidentally &lt;br&gt;
deleted or duplicated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;file.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Row &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; columns (expected &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No-code option: Use a free &lt;a href="https://csvtojsonconverter.com/csv-validator/" rel="noopener noreferrer"&gt;CSV Validator&lt;/a&gt; &lt;br&gt;
that checks column consistency, empty headers, &lt;br&gt;
duplicate rows, and broken quotes with a detailed &lt;br&gt;
line-by-line report.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Duplicate Rows
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it looks like:&lt;/strong&gt;&lt;br&gt;
You import your CSV into a database and get primary &lt;br&gt;
key conflicts, or your analytics show inflated numbers &lt;br&gt;
because the same record appears multiple times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt;&lt;br&gt;
Data was exported twice, two files were merged without &lt;br&gt;
deduplication, or a sync process ran multiple times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;file.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df_clean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop_duplicates&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Or deduplicate on a specific column
&lt;/span&gt;&lt;span class="n"&gt;df_clean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop_duplicates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;df_clean&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;clean.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No-code option: Use a free &lt;a href="https://csvtojsonconverter.com/csv-duplicate-remover/" rel="noopener noreferrer"&gt;CSV Duplicate Remover&lt;/a&gt; &lt;br&gt;
that supports full-row and column-specific deduplication &lt;br&gt;
with case-insensitive matching.&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Empty Rows and Trailing Whitespace
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it looks like:&lt;/strong&gt;&lt;br&gt;
Your row count is wrong, or string comparisons fail &lt;br&gt;
because "Alice" and "Alice " are treated as different &lt;br&gt;
values.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt;&lt;br&gt;
Exported data often includes empty rows at the end, &lt;br&gt;
and spreadsheet editors sometimes add invisible &lt;br&gt;
trailing spaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;file.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Remove empty rows
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dropna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;how&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Trim whitespace from all string columns
&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dtype&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;clean.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No-code option: Use a free &lt;a href="https://csvtojsonconverter.com/csv-cleaner/" rel="noopener noreferrer"&gt;CSV Cleaner&lt;/a&gt; &lt;br&gt;
that removes empty rows, trims spaces, removes &lt;br&gt;
duplicate rows, and strips non-printable characters &lt;br&gt;
in one click.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Quick Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Garbled characters&lt;/td&gt;
&lt;td&gt;Convert to UTF-8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All data in one column&lt;/td&gt;
&lt;td&gt;Change delimiter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inconsistent columns&lt;/td&gt;
&lt;td&gt;Validate before import&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate rows&lt;/td&gt;
&lt;td&gt;Deduplicate on key column&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empty rows / whitespace&lt;/td&gt;
&lt;td&gt;Clean before processing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;All the tools linked in this article are free and &lt;br&gt;
browser-based — your data never leaves your device. &lt;br&gt;
Check out the full &lt;a href="https://csvtojsonconverter.com/csv-tools/" rel="noopener noreferrer"&gt;CSV Toolkit&lt;/a&gt; &lt;br&gt;
for 16 tools covering everything CSV.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>data</category>
      <category>datascience</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Fix CSV Encoding Issues (UTF-8, Windows-1252, and More)</title>
      <dc:creator>Mahizul Islam</dc:creator>
      <pubDate>Wed, 27 May 2026 12:12:01 +0000</pubDate>
      <link>https://dev.to/mahizul/how-to-fix-csv-encoding-issues-utf-8-windows-1252-and-more-1i03</link>
      <guid>https://dev.to/mahizul/how-to-fix-csv-encoding-issues-utf-8-windows-1252-and-more-1i03</guid>
      <description>&lt;h1&gt;
  
  
  How to Fix CSV Encoding Issues (UTF-8, Windows-1252, and More)
&lt;/h1&gt;

&lt;p&gt;If you've ever opened a CSV file and seen broken characters like &lt;code&gt;â€™&lt;/code&gt; instead of apostrophes, or &lt;code&gt;Ã©&lt;/code&gt; instead of &lt;code&gt;é&lt;/code&gt;, you've encountered a CSV encoding problem. This is one of the most common issues developers and data analysts face when working with CSV files.&lt;/p&gt;

&lt;p&gt;In this guide, I'll explain why encoding issues happen, how to detect them, and how to fix them — without writing a single line of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does CSV Encoding Matter?
&lt;/h2&gt;

&lt;p&gt;CSV files don't store information about their encoding. When you open a CSV, your software has to guess which encoding was used. If it guesses wrong, you get garbled text.&lt;/p&gt;

&lt;p&gt;The most common culprits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows-1252&lt;/strong&gt; — the default encoding for Excel on Windows. Fine for Western European languages, but breaks on special characters from other languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ISO-8859-1 (Latin-1)&lt;/strong&gt; — similar to Windows-1252, commonly used in older systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UTF-16&lt;/strong&gt; — used by some Windows applications, includes a BOM (Byte Order Mark) at the start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shift-JIS, GBK, EUC-KR&lt;/strong&gt; — common in Japanese, Chinese, and Korean systems respectively.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;UTF-8&lt;/strong&gt; is the universal standard. Every modern database, API, and web application expects UTF-8. If your CSV isn't UTF-8, you'll run into import errors, broken characters, and data loss.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Detect CSV Encoding
&lt;/h2&gt;

&lt;p&gt;Before fixing, you need to know what encoding your file is using. Look out for these signs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strange characters&lt;/strong&gt; like &lt;code&gt;â€™&lt;/code&gt;, &lt;code&gt;Ã©&lt;/code&gt;, &lt;code&gt;Â£&lt;/code&gt; — classic Windows-1252 misread as UTF-8&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Question marks&lt;/strong&gt; &lt;code&gt;?&lt;/code&gt; replacing characters — encoding mismatch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extra invisible characters&lt;/strong&gt; at the start — this is a BOM (Byte Order Mark)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import errors&lt;/strong&gt; in MySQL, PostgreSQL, or MongoDB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can check your CSV encoding instantly using the free &lt;a href="https://csvtojsonconverter.com/csv-encoding-checker/" rel="noopener noreferrer"&gt;CSV Encoding Checker&lt;/a&gt; — it detects UTF-8, Windows-1252, UTF-16, and more directly in your browser without uploading your file anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Fix CSV Encoding
&lt;/h2&gt;

&lt;p&gt;Once you know the encoding, converting to UTF-8 is straightforward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Use a Free Online Tool (No Code)
&lt;/h3&gt;

&lt;p&gt;The easiest way is to use the &lt;a href="https://csvtojsonconverter.com/csv-to-utf-8-converter/" rel="noopener noreferrer"&gt;CSV to UTF-8 Converter&lt;/a&gt;. It supports 14 encodings including Windows-1252, ISO-8859-1, Shift-JIS, GBK, and UTF-16. Everything runs in your browser — your file is never uploaded to a server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;your-file.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;windows-1252&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fixed-file.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option 3: Node.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;iconv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;iconv-lite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-file.csv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;iconv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;win1252&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fixed-file.csv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decoded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option 4: Excel
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Excel → Data → From Text/CSV&lt;/li&gt;
&lt;li&gt;In the import wizard, change &lt;strong&gt;File Origin&lt;/strong&gt; to &lt;code&gt;65001: Unicode (UTF-8)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Save as CSV&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The UTF-8 BOM Problem
&lt;/h2&gt;

&lt;p&gt;Even after converting to UTF-8, Excel sometimes still shows garbled characters. This is because Excel on Windows needs a &lt;strong&gt;BOM (Byte Order Mark)&lt;/strong&gt; — a hidden 3-byte marker at the start of the file — to recognize UTF-8.&lt;/p&gt;

&lt;p&gt;When downloading from the &lt;a href="https://csvtojsonconverter.com/csv-to-utf-8-converter/" rel="noopener noreferrer"&gt;CSV to UTF-8 Converter&lt;/a&gt;, the file automatically includes a BOM so Excel opens it correctly every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Reference: Common Encoding Issues
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Broken text&lt;/th&gt;
&lt;th&gt;Original character&lt;/th&gt;
&lt;th&gt;Likely encoding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;â€™&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;'&lt;/code&gt; (apostrophe)&lt;/td&gt;
&lt;td&gt;Windows-1252&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ã©&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;é&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Windows-1252&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Â£&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;£&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Windows-1252&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?????&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Japanese/Chinese/Korean&lt;/td&gt;
&lt;td&gt;Wrong encoding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invisible chars at start&lt;/td&gt;
&lt;td&gt;(none)&lt;/td&gt;
&lt;td&gt;UTF-16 BOM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Check your encoding with a &lt;a href="https://csvtojsonconverter.com/csv-encoding-checker/" rel="noopener noreferrer"&gt;CSV Encoding Checker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Convert to UTF-8 using Python, Node.js, Excel, or an &lt;a href="https://csvtojsonconverter.com/csv-to-utf-8-converter/" rel="noopener noreferrer"&gt;online converter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Include a UTF-8 BOM if opening in Excel on Windows&lt;/li&gt;
&lt;li&gt;Always save exports as UTF-8 to avoid future issues&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;All the tools mentioned in this article are free and browser-based — your data never leaves your device. Check out the full &lt;a href="https://csvtojsonconverter.com/csv-tools/" rel="noopener noreferrer"&gt;CSV toolkit&lt;/a&gt; for more tools like CSV Validator, CSV Formatter, and CSV Duplicate Remover.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>csv</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
