Convert VCF to CSV

Converting VCF to CSV turns an address book export into one row per contact, which is what a CRM import or a mail-merge needs. The interesting part is what happens to the fields that repeat: a contact with three phone numbers and two addresses has to fit a table that has one column for each.

  • Where it runs In your browser. The file is never uploaded.
  • Rebuilt CSV works differently from a VCF, so this is not the gradual degradation a lossy codec applies. What CSV can express is reproduced faithfully; what it has no equivalent for does not survive at all.
  • File size limit Up to 100 MB per file, free, without an account.
  • Worth knowing Repeating fields — several phone numbers, several attendees — are collected into one cell rather than spread across invented columns. Recurrence rules, alarms and attachments have no place in a table and are left out.

Up to 100 files at once. Mixed formats are fine.

An address book export is a migration, not a document

Nobody converts contacts to read them. The file exists because something has to move: a phone’s address book into a CRM, a departing colleague’s contacts into a shared account, a mailing list out of Outlook and into a newsletter tool, five hundred cards collected at a conference into whatever the sales team uses.

That makes the destination’s expectations the thing that matters, and destinations are opinionated. A CRM import screen wants a column called something like "Mobile Phone" and another called "Work Email", mapped one to one. A vCard has neither concept: it has a list of telephone properties with type labels attached, any number of them, in any order. The whole of this page is about that mismatch.

Nine columns, and why phone1 to phone5 was not the answer

Every contact becomes a row of `name`, `first name`, `last name`, `organisation`, `title`, `emails`, `phones`, `addresses` and `note`. The three plural columns hold everything of that kind for the contact, separated by a semicolon and a space, with the type in front where the card supplied one: `cell: +49 30 1234567; work: +49 30 7654321`.

The alternative was numbered columns, and it is worse in both directions. Choose five and the contact with six numbers loses one silently. Choose the maximum found in the file and everybody else gets a row with a dozen empty columns whose meaning shifts from contact to contact, since the fourth number is a fax for one person and a home line for another. Collecting them keeps the table honest about what a vCard actually is, and moves the splitting to the point where you know what the destination wants.

Splitting the phone and email cells for an import

Two routes, depending on how uniform the export is. If almost every contact has the same shape — one mobile, one work number — Text to Columns on the semicolon in Excel or Google Sheets does it in one step, and you then delete the type prefixes with a find-and-replace.

If the shape varies, Power Query is the tool: Split Column by Delimiter into rows gives you one row per number, which you can then pivot on the type prefix into properly named columns and merge back. It is ten minutes and it survives the next export, which matters because this is rarely a one-off job. Whichever route you take, do the splitting in the spreadsheet rather than asking the CRM to interpret a compound cell — most will accept it, store it whole, and produce an address book where nobody’s number is dialable.

The address column loses which part was which

A vCard address is a structured value with seven components in a fixed order: post office box, extended address, street, locality, region, postal code and country. Most cards leave several empty, so an ordinary German address is written with two leading semicolons and an empty box and extension.

Those empty components are dropped and what remains is joined with commas, which gives a readable `Hauptstraße 3, Berlin, 10115, Germany` and destroys the structure. Nothing in the resulting cell says that `10115` was the postal code rather than a house number, and a contact with two addresses has both in the cell separated by a semicolon. For a mail-merge that prints an address block, this is exactly right. For a CRM that wants separate city and postcode fields, the column has to be reviewed by hand or re-derived from the source, and there is no rule that will do it reliably across countries.

The structured name field is in the opposite order to how it reads

A vCard carries the name twice: once as a formatted string for display, which becomes the `name` column, and once as a structured value in the order family, given, additional, prefix, suffix. That structured value populates `last name` and `first name`, in that order, which is the usual way to get it wrong when reading a vCard by eye.

Both are kept because they disagree more often than you would expect. Cards created by scanning a business card frequently have a formatted name and an empty structured one. Cards from an Asian-language address book may have the structured field filled and a formatted name in a different order. Sorting on `last name` is right when it is populated; falling back to `name` when it is not is the safest rule, and having both columns in front of you is what makes that decision possible.

Fields the nine columns leave out entirely

A modern vCard can carry a photograph, a birthday, several web addresses, instant-messaging handles, a geographic position, a time zone, categories, a related-contact list and any number of vendor-specific extensions with an `X-` prefix. None of them appears in the output.

The photograph is the one worth naming, because it is usually the bulk of the file — a base64-encoded image on every card is why a five-hundred-contact export is several megabytes rather than a hundred kilobytes. Nothing about a table could hold it. The others are omissions of scope rather than of possibility, and if a birthday or a website matters to the migration, the honest answer is that this conversion does not carry it and the source file still does.

Old exports, folded lines and quoted-printable text

Both this format and its calendar sibling wrap long values at seventy-five octets and mark the continuation with a leading space or tab. Those are rejoined before anything is parsed, which is what stops every long note and every long address being silently truncated at the wrap point.

What is not handled is quoted-printable, the encoding vCard 2.1 used for anything outside plain ASCII. Exports from older phones and some Outlook versions write `Müller` as `M=C3=BCller` and break long lines with a trailing equals sign rather than a leading space, which is a different folding rule. Those values come through as they are written. If your names are full of equals signs and hex pairs, re-export as vCard 3.0 or 4.0 from the source if you can, and decode the file first if you cannot.

Type labels come from the card, and only the first one

The label in front of a phone number or an email address is the card’s own type parameter, lowercased. Where a property carries several types — a number marked as both work and voice, which is common — only the first is used, so `TYPE="WORK,VOICE"` becomes `work`.

That is usually the informative half, since `voice` distinguishes a phone from a fax and everybody has phones. It does mean the labels are as consistent as the source, which is to say not very: one export writes `cell`, another `mobile`, a third `iphone`, and a card created by a web form may carry no type at all and produce a bare number with no prefix. Normalising those into whatever your destination expects is a find-and-replace worth doing once on the whole column.

Duplicates, and the identifier the table does not give you

A contact export from a phone that has been synchronised with two accounts routinely contains the same person twice, and the CSV reproduces that faithfully. There is no identifier column to deduplicate on — the vCard identifier property is not among the nine, and in practice it is unstable across systems anyway.

So deduplication is a matching problem. Email address is the strongest key when it is present, followed by the formatted name plus the organisation. Do it in the spreadsheet before the import rather than after: most CRMs have their own merge tooling and all of it is slower and more consequential than sorting a column and deleting rows. Sorting by the emails column and scanning for repeats takes a couple of minutes on a few hundred contacts.

The contacts are read here and go no further

The conversion is plain JavaScript in this browser tab. No engine is downloaded, nothing is uploaded, there is no account and no daily allowance, and the network tab during a conversion is how to confirm that rather than this sentence.

For this file type that is not a nicety. An address book is other people’s personal data — names, private numbers, home addresses — held by you and belonging to them, and uploading one to a converter is a transfer to a third party that most organisations would have to record and most individuals would not want. There is nothing here to record. Note also that this direction is one-way by design: writing a CSV back into vCards would mean guessing which column is a mobile and which is a home number, and a contacts file that imports looking correct while being subtly wrong is worse than no file at all.

How to turn a VCF export into a contacts spreadsheet

  1. Export as vCard 3.0 or 4.0 if the source offers a choice, then drop the .vcf here.
  2. Each contact becomes a row with its phones, emails and addresses collected, in your browser.
  3. Split the compound columns in your spreadsheet before mapping them to the destination.

VCF and CSV: repeating properties against fixed columns

VCF compared with CSV
VCFCSV
Full namevCard ContactComma-Separated Values
File extension.vcf, .vcard.csv
Media typetext/vcardtext/csv
First published19951972
SpecificationRFC 6350RFC 4180
LicensingOpen standardOpen standard
Standing todayCurrentCurrent
Opens in a browserNo browserNo browser
Considered insteadXLSX, JSON, Parquet

Opening the result

The usual programs do not overlap: VCF opens in Google Contacts, Apple Contacts and Microsoft Outlook, CSV in Microsoft Excel, LibreOffice Calc and pandas — so whoever receives the result needs something from the second list.

What each format is for

VCF was published in 1995. The specification is RFC 6350, and it is worth reading if the file has to outlive the tool that wrote it.

CSV dates from 1972, specified as RFC 4180. Microsoft Excel, LibreOffice Calc and pandas all read it.

CSV was published in 1972 and VCF in 1995. The older one is generally the safer file to hand to somebody; the newer one usually does the job in fewer bytes.

VCF to CSV: phones, addresses and old exports

Are my VCF files uploaded anywhere?

No. This conversion runs entirely inside your browser, so the file never leaves your device. You can confirm it yourself: open the network tab of your browser's developer tools and convert something. You will see the page load, plus the analytics and advertising the site is paid for with — and nothing carrying your file.

Where did my three phone numbers go?

Into one cell, separated by semicolons and labelled with the type the card gave — cell, work, home. That keeps the table a fixed width instead of inventing phone1 to phone5 and truncating whoever has six.

How do I split the phone cell for a CRM import?

With Text to Columns on the semicolon in a spreadsheet, or Power Query’s Split Column if the numbers per contact vary. Most CRMs want one column per phone type, so split first and then map the labelled parts.

Why is the address one long string?

Because a vCard address is a structured value with seven components and the empty ones are dropped before the rest are joined with commas. Nothing afterwards distinguishes street from city from postcode, which is why a CRM import needs the address column reviewed by hand.

Are photos included?

No. Contact photos, birthdays, web addresses, instant-messaging handles and any custom fields the source added are not among the nine columns and are left out. Photos are the largest thing in most vCard files and would not fit a cell in any case.

My old export has =C3=A4 in the names. What is that?

Quoted-printable encoding, used by vCard 2.1 exports from older phones and some Outlook versions. It is not decoded here. Re-export as vCard 3.0 or 4.0 if the source allows it, or decode the file before converting.

Can I convert a CSV back into a VCF?

Not here, deliberately. Writing contacts back means deciding which column is a mobile and which is a home number, and inventing that produces files that import looking correct and are subtly wrong.

More about these formats