diff --git a/Project/Tools/whatsapp2csv.sh b/Project/Tools/whatsapp2csv.sh new file mode 100755 index 0000000..6583d4a --- /dev/null +++ b/Project/Tools/whatsapp2csv.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash + +SCRIPT=`realpath $0` +SCRIPTPATH=`dirname $SCRIPT` + +# toolset:--------------------------------------------------------------------- + +command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done) + +function lineprint { + printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = +} + +function message { + lineprint + printf "$1\n" + lineprint +} + +function error_message { + lineprint + printf "$1\n" >&2 + lineprint +} + +current_action="IDLE" + +function confirm_action { + message "successfully finished action: $current_action" +} + +function set_action { + current_action="$1" + message "$1" +} + +function perform { + "$@" + local status=$? + if [ $status -ne 0 ] + then + error_message "$current_action failed!" + fi + return $status +} + +function perform_and_exit { + perform "$@" || exit 1 +} + +# ----------------------------------------------------------------------------- +# reading input + +INPUT=$1 +OUTPUT="$INPUT.csv" + +if [ $# -eq 0 ] +then + error_message "Error: no input file given. Usage: $0 " + exit 1 +fi + +set_action "processing File: ${INPUT}" + +if [ ! -e "$INPUT" ] +then + error_message "Error: file '$INPUT' not found" + exit 1 +fi + +perform_and_exit echo -e "date\ttime\tperson\tmessage" > "$OUTPUT" + +# doing the following things in the pipeline below: +# +# 1. merging multiline messages by replacing newlines with spaces if they are not starting with a number followed by '/' (not stating with a date) +# 2. delete all lines containing the keywords: "added, creates, end-to-end, Media ommited" (which are most probably system messages) +# 3. replace separators of whatsapp's txt-format with '\t' as separator for csv +# 4. delete all double-quotes. Because people are too stupid to type them in pairs and that breaks some csv-interpreters 🤦‍♂ + +perform_and_exit sed ':a;N;/\n[0-9]\{1,\}\+\//!s/\n/ /;ta;P;D' "$INPUT" | grep -v -E 'added|created|end-to-end|Media omitted' | sed 's/, /\t/1; s/- /\t/1; s/: /\t/1;' | tr -d '"' >> "$OUTPUT" + +confirm_action + +message "Wrote output to $OUTPUT" +