bash parameter parsing is easy, fast, and lightweight.
for fp in /path/file1.conf /path/smth/file2.conf /path/smth/file3.conf; do
  p="${fp%/*}"   # %  strips the pattern from the end       (minimal,   non-greedy)
  f="${fp##*/}"  # ## strips the pattern from the beginning (max-match, greedy)
  f="${f%.*}"    # end-strip the already path-cleaned filename to remove extention
  echo "$p, $f"
done
/path, file1
/path/smth, file2
/path/smth, file3
To get what you apparently want as your formatting -
declare -A paths                     # associative array
while read -r fp; do
  p=${fp%/*} f=${fp##*/};            # preparse path and filename
  paths[$p]="${paths[$p]};${f%.*}";  # p as key, stacked/delimited val 
done < file
Then stack/delimit your datasets.
for p in "${!paths[@]}"; do printf "%s|" "$p${paths[$p]}"; done; echo
/path;file1|/path/smth;file2;file3|
For each key, print key/val and a delimiter. echo at end for a newline.
If you don't want the trailing pipe, assign it all to one var in the second loop instead of printing it out, and trim the trailing pipe at the end.
$: for p in "${!paths[@]}"; do out="$out$p${paths[$p]}|"; done; echo "${out%|}"
/path;file1|/path/smth;file2;file3
Some folk will tell you not to use bash for anything this complex. Be aware that it can lead to ugly maintenance, especially if the people maintaining it behind you aren't bash experts and can't be bothered to go RTFM.
If you actually needed that embedded space in your example then your rules are inconsistent and you'll have to explain them.