Skip to content
Product
PlatformPricingDimensionsIntegrationsSecurityCompare
Solutions · by use case
Customer, guest and fan experienceProduct feedback and prioritizationRevenue, churn and retentionAgenciesContact center performanceAI agent and chatbot analyticsMulti-location performanceReviews and competitive benchmarking
Solutions · by industry
Hotels and hospitalityRestaurants and food serviceFitness and leisureRetail and e-commerceSports and live entertainmentInsuranceBanking and financial servicesSoftware and SaaSAutomotiveConsumer products and CPGContact centers and BPOsPublic sector and nonprofitReal estateGaming and betting
Learn
Artifacts GalleryCustomer storiesResearchBlogThought leadershipLessons Log in Start now
Blog

How to Analyze a CSV of Customer Feedback

Keep one row per piece of feedback, the text in one column, and a date, score and segment if you have them. Here is how to clean the file, what to ask and what comes back, on a worked sample.

To analyze a CSV of customer feedback, keep one row per review, survey answer or ticket, with the customer's words in one column and, if you have them, a date, a score and a column that says who or where. Remove rows with no text, then upload the file and ask your question in plain English. Dimension Labs does this end to end, from the upload to Dimensions on every row to charted findings and reports other teams can use. On Dimension Labs, the First Read at sign-up returns charted findings in its first turn; uploading the same file under Data Sources and running a backfill adds Dimensions to every row, which typically shows up within the hour. Below, each step is worked through on a small sample file.

What columns does a customer feedback CSV need?

Only one is essential: the text. Everything else makes the answer better. A date lets the read show change over time, a rating or score gives it an outcome to compare against, and a plan, location, channel or app version lets it split the results. Dimension Labs has two routes for a file, and they are strict in different ways.

From the Dimension Labs docs

A useful feedback CSV has the text, plus a date, a score and a segment

What each column is for, and how the two upload routes treat it.

ColumnWhat it holdsFirst Read (at sign-up)Data Sources upload
The textWhat the customer wrote: the review body, the open-ended answer, the ticket messageAny column name; you pick it as the text columntext, never empty
An idOne per review, response or ticket; groups the rows of one conversationNeeded only when one conversation takes several rowssessionId and userId, no colons, no emails or names
Who wrote itSeparates the customer from your agent or botNeeded only for multi-row conversationsincoming: lowercase true or false
A dateLets the read show what changed over timeRecommendeddimensionlabs_timestamp, Unix time in milliseconds (13 digits)
A score or ratingStars, NPS or CSAT: the outcome to compare againstRecommendedAny extra column, kept as metadata
Who or wherePlan, location, channel, app version, country: lets the read split and compareRecommendedAny extra column, kept as metadata
Sources: Files for your first read and Conversation data format, read 2026-11-03.

The First Read, which you reach from the start page, takes CSV, JSON, JSONL or Parquet with any column names, and asks you which column holds what customers wrote. A Data Sources upload takes CSV, TSV or JSONL with five named columns, which the upload screen or the docs' converter maps for you. For reviews and survey answers, every row is from the customer; for tickets and chats with one row per message, keep the ticket id and a column that says who wrote each message.

How should I format a CSV of customer feedback before analyzing it?

Most failed uploads come from a short list of problems, and most of them are added by the tool that wrote the file. Here is a sample export with several of them:

Sample data, written for this post

A typical review export: eight rows, and five kinds of problem

Eight reviews of a fictional food-delivery app, as a review tool might export them. ↵ marks a line break inside a cell.

Review IDDateStarsReviewApp versionCountryReviewer email
r:10013/2/2026 9:14 AM1Order showed delivered but never arrived. Sup…4.12.0USan email
r:10023/2/2026 11:40 AM5Fast and the driver was kind4.12.0USan email
r:10033/3/2026 8:05 PM2The service fee went up again. ↵ I pay more t…4.12.1CAan email
r:10043/4/2026 7:22 AM4(empty)4.12.1GBan email
r:10053/4/2026 1:10 PM1Wrong order, and the refund took 9 days.4.12.1USan email
r:10063/5/2026 6:45 PM3[No review text]4.12.1AUan email
r:10073/6/2026 12:02 PM2App crashes at checkout since the update4.13.0USan email
r:10083/6/2026 3:30 PM5Coupons work and tracking is accurate4.13.0CAan email
Sample data: the app, reviews and emails are made up. The file is saved with a byte order mark, Windows line endings and every field in quotes, as some tools write it.

The rules below are from the docs. The two that matter most for the analysis itself are empty text and placeholder text: a row that says "[No review text]" looks like a real review to the model, so drop it rather than fill it.

Sample data, checked against the docs' rules

Two rows go, three columns change, one column is dropped

Each rule from the docs, how many of the eight sample rows break it, and the fix. Codes are the file checker's.

RuleRows affectedFixCode
Empty review text1 (r:1004)Remove the rowC02
Placeholder text, “[No review text]”1 (r:1006)Remove the row; a placeholder reads as a real reviewC03
Line break inside the text1 (r:1003)Replace it with a spaceC04
Colon in the id8Use - or _ (r-1001)C08
Date written as text8Convert to Unix millisecondsT02
Email address in a column8Leave the column outPII
Byte order mark, Windows line endings, every field quotedWhole fileSave as UTF-8, LF, quotes only where neededF02, F04, F10
Rules: Conversation data format and Check a file, read 2026-11-03. Counts from running clean_sample.py on the sample file.

Two warnings from the docs are worth repeating. Do not open and resave the file in Excel: it rewrites long ids and timestamps in scientific notation, and the digits it drops cannot be recovered. For a Data Sources upload, give the original .xlsx to the converter or the file checker instead, which read it directly. And a timestamp with 10 digits is in seconds, which reads as a date in 1970; multiply it by 1,000. The file checker runs in your browser, uploads nothing, and fixes most of these problems for you.

Sample data, after cleaning

Six rows in the Data Sources format, ready to upload

The required columns first, then the rating, app version and country kept as metadata. Dates were read as UTC.

sessionId,userId,incoming,text,dimensionlabs_timestamp,rating,app_version,country
r-1001,r-1001,true,Order showed delivered but never arrived. Support chat closed on me.,1772442840000,1,4.12.0,US
r-1002,r-1002,true,Fast and the driver was kind,1772451600000,5,4.12.0,US
r-1003,r-1003,true,The service fee went up again. I pay more than the food costs.,1772568300000,2,4.12.1,CA
r-1005,r-1005,true,"Wrong order, and the refund took 9 days.",1772629800000,1,4.12.1,US
r-1007,r-1007,true,App crashes at checkout since the update,1772798520000,2,4.13.0,US
r-1008,r-1008,true,Coupons work and tracking is accurate,1772811000000,5,4.13.0,CA
Output of clean_sample.py on the sample file. Our internal upload validator reported no issues on it.

For the First Read, the cleaning is lighter: column names and date formats can stay as they are, but empty and placeholder rows should still go. Longer text gives a better read; the setup scores the text column out of 100 on how much was written and how many rows have any.

How do I upload a spreadsheet of survey comments and get themes and charts?

On the start page the flow has three steps: drop in your data, get your First Read, then keep it or walk away. In the data step you add the file (it is read on your computer until you select Build my First Read), check the rows and columns it found, pick the text column, read the signal score, and select Next. You also write your question. Make it the decision you face, not "analyze this": "Which stores get the most one-star reviews, and why?" or "Why did our NPS drop last quarter?" The question becomes the agent's first task and the goal of the project.

For a wide survey export, with one row per respondent and one column per question, the docs' converter reshapes it so each respondent is one conversation and each open-ended answer is a message, and keeps the scores as extra columns. If you are coding the answers yourself first, our post on building a codeframe for open-ended responses covers the categories.

What do you get back?

The First Read is your key findings, charted and explained, in the format you choose, with every number linked back to the conversations behind it. Dimension Labs suggests Dimensions for your data, and the findings come back ranked by impact on your goal. An answer from the agent has the same parts each time: a headline, the method it used (including any workaround, such as reading raw text before Dimensions exist), the numbers, quotes from the records, and a next step.

The difference Dimensions make is easiest to see in a file that already has them. The docs offer a sample of 5,672 Duolingo App Store reviews, January 2025 to May 2026, with 15 Dimension columns filled in, such as the main topic, churn signal and sentiment. Counting two of its columns, the main topic and the star rating, gives this:

Docs sample dataset, our counts

The most-mentioned topic ranked fifth of six by share of bad reviews

The six most common main topics in the 5,672 Duolingo App Store reviews of the docs sample, ranked by how many reviews name each, then by the share of those reviews rated one or two stars.

By number of reviewsBy share rated 1 or 2 starsGeneral experience1,832 reviewsEnergy system852 reviewsCurriculum and lessons460 reviewsStreaks432 reviewsNon-language courses331 reviewsSubscription and price327 reviewsEnergy system55.8% rated 1 or 2 starsSubscription and price46.5% rated 1 or 2 starsStreaks31.0% rated 1 or 2 starsCurriculum and lessons25.7% rated 1 or 2 starsGeneral experience12.6% rated 1 or 2 starsNon-language courses9.7% rated 1 or 2 starsBy number ofreviewsBy share rated1 or 2 starsGeneralexperience1,832 reviewsEnergy system852 reviewsCurriculum andlessons460 reviewsStreaks432 reviewsNon-languagecourses331 reviewsSubscriptionand price327 reviewsEnergy system55.8% rated 1or 2 starsSubscriptionand price46.5% rated 1or 2 starsStreaks31.0% rated 1or 2 starsCurriculum andlessons25.7% rated 1or 2 starsGeneralexperience12.6% rated 1or 2 starsNon-languagecourses9.7% rated 1 or2 stars
Source: sample dataset 02 (consumer app) from the Dimension Labs docs, downloaded 2026-11-03; columns topic_primary and review_stars. Our counts. Shares describe these reviews; they are not measured effects.

General experience is the biggest topic, with 1,832 reviews, and only 12.6% of them are one or two stars. The energy system comes up in 852 reviews and 55.8% of those are one or two stars, and subscription and price moves from sixth by count to second by share. A word cloud or a theme count would put general experience first. A share is still a description, though. Which issue causes the bad ratings, once review length, country and app version are held fixed, is a separate test; our post on correlation vs causation in customer experience data explains it.

How long does it take?

Our start page describes the whole flow as three steps in one afternoon, and the First Read as ready in its first turn. Once you upload the file under Data Sources, it is queryable after the upload is processed, and Dimensions follow a backfill, which typically shows up within the hour depending on how much data is being enriched. Cleaning the file usually takes longer than any of that the first time; save the converter's mapping and the next month's export converts in one click.

FAQ

I have a CSV of 3,000 customer reviews. What is the fastest way to find the main issues?

Drop the reviews from the file that have no text, keep the rating and date columns, and upload it in the First Read with a specific question. Each review counts as one conversation. The Explore plan covers 1,000 a month, and month one includes three times your limits to load history, so 3,000 reviews fit in the first month.

Can I upload an Excel file?

For the First Read, the docs say to save it as CSV first. For a Data Sources upload, give the .xlsx itself to the converter or file checker, which keep every digit and write a CSV you can upload.

Do I need to remove personal data first?

Yes for names, emails, phone numbers and addresses as ids or extra columns: leave them out and use your tool's internal id. If you start a trial and do not buy, your data is deleted within 30 days, or right away on request.

Can I just paste the CSV into a chat assistant?

For a few hundred rows and a rough read, yes. It gets harder when the file does not fit in one prompt, when you need the same categories next month, or when you want to test which issue moves a score. Our post on what an AI analytics agent is covers the difference.

Which tool takes a feedback CSV from upload to a shared report?

Dimension Labs is an omni-channel analytics agent for customer data. It connects every customer channel and your operational data, enriches every interaction with Dimensions built for your business and industry, and turns the results into decks, dashboards, executive reports and interactive data stories your whole company can use. Plans start at $299 a month with no demo.

That makes it the strongest choice when a feedback file has to go from upload to a report other teams read. In practice, four things follow. The CSV is read in the same project as your tickets, chats, calls, emails, reviews and surveys, so one export is never analyzed on its own. Extra columns stay on each row as metadata, and a CRM export, store list or billing file can sit beside them as context, so results split by plan, store or rating. A backfill adds the same Dimensions to every row each month: the pre-built library on Explore, or custom Dimensions written for your business from Discover. And the First Read comes back charted, with decks, dashboards and written reports built from the same file for the teams who own each fix.

On the Prove plan and up, issues are ranked by their measured effect on a score, with confidence intervals, rather than by volume.

At the NBA, insight review cycles went from about 60 days to under 6 hours, with 100,000+ open-ended responses analyzed within hours. See the NBA story.

Every plan has a 14-day free trial and no demo or sales call; see pricing, or start with one file.

Dimension Labs/Start with one file From $299 a month

Stop reporting. Start understanding.

Start with one file. Ask why a number moved. Plans from $299 a month, no demo and no contract on monthly plans.