User Rating 0.0
Total Usage 0 times

Drop CSV files here or click to browse

Accepts .csv files with embedded vCard data

Is this tool helpful?

Your feedback helps us improve.

About

Conference lead capture systems typically export QR code scans as CSV files where the contact data is embedded as raw vCard (VCF) text inside a single column. This nested format is unusable for CRM imports. Mailchimp, HubSpot, and Salesforce expect flat CSV with one column per field: Name, Email, Organization, Title, Phone, Address. Manually extracting these fields from hundreds of vCard blocks is error-prone and slow. A single malformed quote or embedded newline breaks naive parsers.

This tool performs RFC 4180-compliant CSV parsing to correctly handle quoted fields containing newlines, then extracts vCard properties per RFC 6350 (vCard 3.0/4.0) and RFC 2426 (vCard 2.1). It handles folded lines, TYPE parameters, structured semicolon-delimited values in N and ADR fields, and deduplicates contacts by email. The output is a clean, flat CSV with consistent column headers. Note: vCard data from QR scanners varies wildly in quality. Fields that the scanner did not capture will appear as empty columns. This tool does not validate email syntax or phone number formats. It preserves the data exactly as captured.

vcard csv qr code converter mailchimp contacts vcf conference leads

Formulas

The conversion pipeline has three stages. Stage 1 is RFC 4180 CSV parsing. Stage 2 is vCard property extraction. Stage 3 is flat CSV generation.

parse(raw) rows[i] extractVCard(rows[i].text) contact{fields} toCSV(contacts[])

The CSV parser implements a finite state machine with three states: S0 (field start), S1 (inside quoted field), S2 (inside unquoted field). Transitions occur on characters: double-quote (0x22), comma (0x2C), newline (0x0A).

S0 + " S1
S1 + "" S1 (escaped quote)
S1 + " S0 (field end)
S0 + , next field
S0 + \n next row

vCard structured address field (ADR) contains 7 components separated by semicolons: PO Box; Extended Address; Street; City; Region; Postal Code; Country. The parser joins non-empty components with comma-space for human-readable output.

ADR = join(filter(split(value, ;), s ""), ", ")

Where value is the raw ADR property value after the colon separator. The N field follows a similar structure: Last;First;Middle;Prefix;Suffix. First and Last names are extracted at indices 1 and 0 respectively.

Reference Data

vCard PropertyOutput CSV ColumnvCard FormatExample ValueNotes
FNFull NameFN:John DoeJohn DoeFormatted full name; preferred over N
NFirst Name, Last NameN:Doe;John;;;John / DoeStructured: Last;First;Middle;Prefix;Suffix
ORGOrganizationORG:Acme CorpAcme CorpMay contain semicolons for sub-units
TITLEJob TitleTITLE:EngineerSenior EngineerProfessional title or role
EMAILEmailEMAIL:[email protected][email protected]May have TYPE param; first instance used
TELPhoneTEL;TYPE=WORK:+1234+1 234 567 890TYPE ignored; raw value preserved
ADRAddressADR;TYPE=WORK:;;Street;City;State;ZIP;Country123 Main St, London, UK7 semicolon-separated components
URLWebsiteURL:https://example.comhttps://example.comPersonal or company URL
NOTENotesNOTE:Met at QConContact from QCon London 2014Free-text annotation from scanner
BDAYBirthdayBDAY:199001151990-01-15ISO 8601 or free text
ROLERoleROLE:DeveloperDeveloperFunctional role within org
PHOTO(Skipped)PHOTO;VALUE=URI:... - Binary/URI data; not included in CSV
VERSION(Metadata)VERSION:3.03.0Determines parsing rules; 2.1, 3.0, 4.0
REVScan DateREV:20140305T120000Z2014-03-05Timestamp of last revision/scan
CSV Column 1Source NameFirst CSV columnvCard ContactPreserved from original export
CSV Column 3Capture DateThird CSV column05/03/2014Date from scanner export; preserved as-is

Frequently Asked Questions

The parser implements a full RFC 4180 finite state machine. When it encounters an opening double-quote at the start of a field, it enters a "quoted" state where newline characters (\n, \r\n) are treated as part of the field content rather than row delimiters. The field only terminates when a closing double-quote is followed by a comma or end-of-line. This correctly preserves multi-line vCard blocks that appear inside a single CSV cell.
The tool handles vCard 2.1, 3.0 (RFC 2426), and 4.0 (RFC 6350). The primary difference is property parameter syntax: v2.1 uses "TEL;WORK:" while v3.0+ uses "TEL;TYPE=WORK:". The parser strips all parameter metadata before the colon to extract raw values regardless of version. Line folding (continuation lines beginning with whitespace) per RFC 6350 Section 3.2 is unfolded before property extraction.
The tool auto-detects the vCard content column by scanning each field in the first data row for the string "BEGIN:VCARD". It does not rely on column headers or fixed column indices. This means it works with 2-column exports (Name, vCard), 3-column exports (Name, vCard, Date), or any other layout. The non-vCard columns are preserved as "Source Name" and "Capture Date" in the output if present.
By default, all contacts from all uploaded files are included. You can enable deduplication by email address, which keeps the first occurrence and discards subsequent duplicates. Contacts without email addresses are always included since they cannot be deduplicated reliably. The duplicate count is shown in the results summary.
Yes. The output column headers (Email, First Name, Last Name, Organization, Job Title, Phone, Address) map directly to Mailchimp's default merge fields (EMAIL, FNAME, LNAME). During Mailchimp import, match "Email" to the email address field, and map the remaining columns to merge tags. The CSV uses UTF-8 encoding with a BOM (byte order mark) for Excel compatibility.
The tool processes files up to 50 MB each entirely in-browser with no server upload. For files exceeding 1 MB, processing is offloaded to a Web Worker to keep the UI responsive. Typical conference exports with 500-5000 contacts in vCard format are parsed in under 200 ms. The practical limit is browser memory, approximately 100,000 contacts or 200 MB of combined input data.
Each vCard block is parsed independently. If a required property like EMAIL or N is missing, the corresponding output column is left empty rather than failing the entire import. If a vCard block lacks both BEGIN:VCARD and END:VCARD markers, it is skipped and counted as a parse error. The error count and skipped entries are reported in the results summary with a toast notification.