Parsing a VCF contact file with AutoHotkey

Grid of 18 numbered thumbnails of the same contact card icon, labeled 1.vcf through 18.vcf, used to show multiple VCF test filesMy friend had over 3,000 contacts in his Android phone and we wanted to automate texting & emailing them. Android exports to VCF files but it is a crappy format! Maestrith and I wrote this script which “flattens” the file into a tab delimited format.

Source code for Parsing a VCF contact file with AutoHotkey

#SingleInstance,Force
FileRead, Text, *P65001 B:\Custom\Win\Desktop\Ryan\example.vcf ; Read data in
Headers:=[], Object:=[] ;Define two objects. one for Headers, one for the data
for a,b in StrSplit(Text,"`n","`r`n"){
	if(SubStr(b,1,6)="Begin:"){
		Object.Push(Obj:=[]) ;Create a key placeholder obj for each contact
		Continue
	}if(SubStr(b,1,4)="End:"||SubStr(b,1,8)="VERSION:") ;Don't grab "End" or "Version"
		Continue
	Str:=StrSplit(b,":") ;split out b by the :
	if(Str.2&&!InStr(Str.1,"PHOTO;ENCODING")){ ;Only do for those that Values are not "PHOTO;ENCODING"
		Headers[Str.1]:=1 ;create a header with the key
		Obj[Str.1]:= RegExReplace(Str.2,";+",";") ;Replace mulitiple semilcolons with one, then shove data to Object		
	}
}
;********************Now extract them from the data we've created***********************************
for a,b in Headers
	Total.=a "`t" ;write headers in tab delimmited format
Total:=Trim(Total,"`t") "`r`n" ;remove last tab and add line return and new line
for a,b in Object{ ;Iterate over data object pushign in data
	for c in Headers
		Row.=RegExReplace(b[c],"\t") "`t" ;If there is a tab in the data replace it, then add a tab to the data
	
	Total.=SubStr(Row,1,-1) "`r`n" ;Drop last tab charachter (Apparently Rtrim with tabs can be problematic) & add new end line/new line
	Row:="" ;Blank out row variable
}
Clipboard:=Total
DebugWindow(Total,Clear:=1,LineBreak:=1,Sleep:=500,AutoHide:=0)
FileAppend,% Total,Example_Output.txt,UTF-8 ;Write the data to a file

Parsing a VCF contact file with AutoHotkey

 

Comments are closed.