read csv files to vars

This commit is contained in:
olli 2024-06-18 16:20:45 +02:00
parent 1bb22864e6
commit c0d0287dd2

78
gaboshlib/g_read_csv.sh Normal file
View File

@ -0,0 +1,78 @@
function g_read_csv {
local g_csvfile="$1"
local g_last_lines=$2
local g_headline=$3
local g_separator=$4
local g_headline_item i l r g_headline_item_varname
# check for individual separator
[ -z "$g_separator" ] && g_separator=","
# only one/first character
g_separator=${g_separator:0:1}
# check given file
if ! [ -s "$g_csvfile" ]
then
g_echo_error "${g_csvfile} does not exist or is empty"
return 1
fi
# check for ,
if ! grep -q $g_separator "$g_csvfile"
then
g_echo_error "${g_csvfile} does not contain \",\""
return 1
fi
# is there a headline file
if [ -z "$g_headline" ]
then
[ -s "${g_csvfile}.headline" ] && g_headline=$(<"${g_csvfile}.headline")
fi
# if no given headline and no headlinfile use forst line
[ -z "$g_headline" ] && g_headline=$(head -n1 "${g_csvfile}")
# read the headline
g_array "$g_headline" g_csv_headline_array_ref $g_separator
# prepare varnames from headline(s)
for g_headline_item in "${g_csv_headline_array_ref[@]}"
do
#g_csv_headline_array="${g_csv_headline_array_ref//[^a-zA-Z0-9]/}"
g_headline_item_varname="${g_headline_item//[^a-zA-Z0-9]/}"
echo "$g_headline_item_varname"
g_csv_headline_array+=("$g_headline_item_varname")
done
# read last lines if defined or complete csv file
if [ -n "$g_last_lines" ]
then
tail -n $g_last_lines "$g_csvfile" >"${g_tmp}/g_csv_tmp.csv"
g_csvfile="${g_tmp}/g_csv_tmp.csv"
fi
# read csv file to array
g_array "$g_csvfile" g_csv_array_ref
g_csv_array=("${g_csv_array_ref[@]}")
# go reverse through array
l=0
for (( r=${#g_csv_array[@]}-1 ; r>=0 ; r-- ))
do
g_array "${g_csv_array[r]}" g_csv_line_array ,
i=0
# put headlines to vars with reverse numbers (last line 0)
for g_headline_item in "${g_csv_headline_array[@]}"
do
declare -g v_${l}_${g_headline_item}="${g_csv_line_array[i]}"
# last line to vars without number
[ "$l" = 0 ] && declare -g v_${g_headline_item}="${g_csv_line_array[i]}"
((i++))
done
((l++))
done
}