summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/ctov.sh82
1 files changed, 82 insertions, 0 deletions
diff --git a/bin/ctov.sh b/bin/ctov.sh
new file mode 100755
index 0000000..018b70c
--- /dev/null
+++ b/bin/ctov.sh
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+vfmt="BEGIN:VCARD\r\n\
+VERSION:3.0\r\n\
+N:%s;;;;\r\n\
+FN:%s\r\n\
+TEL;TYPE=CELL:%s\r\n\
+END:VCARD\r\n"
+
+die()
+{
+ : "${1:?}"
+
+ printf "\033[31;1merr: %b\033[0m\n" "$1" 1>&2
+ exit "${2:-1}"
+}
+
+usage()
+{
+ cat <<- EOF
+ Usage: ${0##*/} [options] [ contacts.csv ]
+ convert csv file to vcf file
+ Options:
+ -h show this help cruft
+ -f path to csv file
+
+ EOF
+}
+
+trimstr()
+{
+ # usage trimstr <string>
+ : "${1:?}"
+
+ _str="${1%"${1##*[![:space:]]}"}"
+ _str="${_str#"${_str%%[![:space:]]*}"}"
+
+ printf "%s" "$_str"
+ unset _str
+}
+
+makev()
+{
+ # usage makev <name> <no>
+ : "${1:?}"
+ : "${2:?}"
+ # shellcheck disable=SC2059
+ printf "$vfmt" "$1" "$1" "$2"
+}
+
+########
+# MAIN #
+########
+
+file=
+
+while getopts "hf:" f; do
+ case "$f" in
+ f)
+ file="$OPTARG"
+ ;;
+ h)
+ usage
+ exit
+ ;;
+ *)
+ usage
+ exit 1
+ esac
+done
+
+if [ -n "$file" ] &&
+ [ "$(file --brief --dereference --mime-type "$file")" != "application/csv" ]; then
+ die "input is not a csv file"
+fi
+
+while read -r entry; do
+ name=$(trimstr "${entry%%,*}")
+ no=$(trimstr "${entry#*,}")
+
+ makev "$name" "$no"
+done <"${file:-/dev/stdin}"