Subject: 28.2; [csv-mode] Comma in quoted field mistaken as field delimiter

From: Joost <[email-masked]>
Date: Fri, 03 Mar 2023 12:01:28 +0100

It seems that csv-mode mistakes a comma in a quoted field for a field delimiter
in certain cases. Starting with `emacs -Q', then installing and loading
`csv-mode' from GNU ELPA, create a small csv file with two columns:

==================================================
one,1
two,2
"three,four",34
five,5
==================================================

Now, when I use TAB to move from one field to the next, point stops at the comma
between "three" and "four".

Also, hen sorting, the third line is sorted on "four", not on "34", both when sorting
numerically and alphabetically. This is the result when sorting numerically on
column 2 (C-c C-n):

==================================================
"three,four",34
one,1
two,2
five,5
==================================================

Line 3 ends up as line one, (I assume because "four" is not a number and sorts
as zero). When sorting alphabetically (C-c C-s), I get:

==================================================
one,1
two,2
five,5
"three,four",34
==================================================

Where the line <<"three,four",34>> is sorted on "four", not on "34".

`csv-separators` is set to the default value `("\"")'.

I've also occasionally experiences problems deleting a column (C-c C-k) if there
is a column with text before the column being deleted and some of the fields in
this column contain quoted commas. I haven't constructed a minimal example for
this, since I assume it's the same problem, but I could if desired.

Note that font lock does seem to understand that the comma in the field is not a
separator, because it doesn't have `csv-separator-face'.

Thanks,

Joost

In GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.36, cairo version 1.17.6)
 of 2023-01-03 built on 2
Windowing system distributor 'The X.Org Foundation', version 11.0.12101007
System Description: Arch Linux

Configured using:
 'configure --with-x-toolkit=gtk3 --with-native-compilation --sysconfdir=/etc
 --prefix=/usr --libexecdir=/usr/lib --localstatedir=/var --with-cairo
 --with-harfbuzz --with-libsystemd --with-modules 'CFLAGS=-march=x86-64
 -mtune=generic -O2 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=2 -Wformat
 -Werror=format-security -fstack-clash-protection -fcf-protection -g
 -ffile-prefix-map=/build/emacs/src=/usr/src/debug/emacs -flto=auto'
 'LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -flto=auto''
Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG JSON
LCMS2 LIBOTF LIBSYSTEMD LIBXML2 M17N_FLT MODULES NATIVE_COMP NOTIFY INOTIFY
PDUMPER PNG RSVG SECCOMP SOUND THREADS TIFF TOOLKIT_SCROLL_BARS X11 XDBE XIM XPM
GTK3 ZLIB
Important settings:
  value of $LANG: en_GB.UTF-8
  locale-coding-system: utf-8-unix

Major mode: CSV

Minor modes in effect:
  cursor-sensor-mode: t
  subword-mode: t
  magit-auto-revert-mode: t
  company-box-mode: t
  csv-align-mode: t
  csv-field-index-mode: t
  minions-mode: t
  doom-modeline-mode: t
  which-key-mode: t
  global-atomic-chrome-edit-mode: t
  marginalia-mode: t
  all-the-icons-completion-mode: t
  company-prescient-mode: t
  prescient-persist-mode: t
  vertico-multiform-mode: t
  vertico-mode: t
  projectile-mode: t
  global-diff-hl-mode: t
  diff-hl-mode: t
  global-git-commit-mode: t
  shell-dirtrack-mode: t
  hl-line-mode: t
  goggles-mode: t
  company-quickhelp-mode: t
  company-quickhelp-local-mode: t
  global-company-mode: t
  company-mode: t
  electric-pair-mode: t
  recentf-mode: t
  delete-selection-mode: t
  override-global-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  show-paren-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-save-visited-mode: t

Load-path shadows:
~/.emacs.d/lisp/custom hides /usr/share/emacs/28.2/lisp/custom
/home/joost/.emacs.d/elpa/transient-20230220.1425/transient hides /usr/share/emacs/28.2/lisp/transient

Features:
(shadow mail-extr emacsbug mc-edit-lines magit-extras display-line-numbers
vc-mtn vc-hg vc-bzr vc-src vc-sccs vc-cvs vc-rcs bug-reference mixed-pitch
pandoc-mode pandoc-mode-utils consult-vertico consult ace-window avy misearch
multi-isearch cursor-sensor vc-git cal-move tabify cap-words superword subword
visual-fill-column org-autolist org-indent ol-eww eww mm-url ol-rmail ol-mhe
ol-irc ol-info ol-gnus nnselect gnus-search eieio-opt speedbar ezimage dframe
gnus-art mm-uu mml2015 mm-view mml-smime smime dig gnus-sum gnus-group gnus-undo
gnus-start gnus-dbus gnus-cloud nnimap nnmail mail-source utf7 netrc nnoo
gnus-spec gnus-int gnus-range gnus-win gnus nnheader ol-docview doc-view
jka-compr image-mode exif ol-bibtex ol-bbdb ol-w3m ol-doi org-link-doi
org-capture org-refile magit-bookmark magit-submodule magit-obsolete magit-blame
magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch
magit-clone magit-remote magit-commit magit-sequence magit-notes magit-worktree
magit-tag magit-merge magit-branch magit-reset magit-files magit-refs
magit-status magit magit-repos magit-apply magit-wip magit-log which-func
magit-diff smerge-mode diff magit-core magit-autorevert magit-margin
magit-transient magit-process magit-mode mm-archive mule-util gnutls url-cache
jk-input-methods quail company-box company-box-doc frame-local company-box-icons
company-amelia amelia parse-csv csv-mode sort hi-lock go-translate
gts-engine-youdao gts-engine-stardict gts-engine-deepl gts-engine-google-rpc
gts-engine-google gts-engine-bing gts-implements gts-faces gts-core wgrep-ag
wgrep deadgrep flycheck-ledger vterm bookmark term disp-table ehelp vterm-module
term/xterm xterm ielm minions doom-modeline doom-modeline-segments
doom-modeline-env doom-modeline-core shrink-path which-key atomic-chrome iimage
image+ image-file image-converter marginalia all-the-icons-completion
company-prescient prescient char-fold orderless vertico-multiform vertico
groovy-mode dockerfile-mode sh-script smie executable impatient-mode htmlize
tide tide-lv indium indium-list-sources indium-scratch indium-interaction
indium-chrome indium-nodejs indium-repl indium-debugger indium-debugger-litable
js2-refactor js2r-paredit js2r-conveniences js2r-conditionals js2r-wrapping
js2r-functions js2r-vars mc-hide-unmatched-lines-mode mc-mark-more
mc-cycle-cursors multiple-cursors-core rect js2r-iife js2r-formatting
js2r-helpers indium-debugger-locals indium-breakpoint indium-inspector
indium-render indium-faces indium-seq-fix indium-client indium-structs
json-process-client js2-mode js cc-mode cc-fonts cc-guess cc-menus cc-cmds
cc-styles cc-align cc-engine cc-vars cc-defs jupyter python-pytest lsp-pyright
dap-python paredit clojure-mode align dap-mode dap-tasks dap-launch lsp-docker
dap-overlays eldoc-box jsonrpc ert debug backtrace lsp-ui lsp-ui-flycheck
lsp-ui-doc goto-addr lsp-ui-imenu lsp-ui-peek lsp-ui-sideline flycheck-posframe
flycheck lsp-mode network-stream markdown-mode inline imenu f f-shortdoc
shortdoc lsp-ui-util face-remap lsp-protocol ht ag vc-svn find-dired s
projectile lisp-mnt grep compile ibuf-ext ibuffer ibuffer-loaddefs thingatpt
diff-hl log-view vc-dir ewoc vc vc-dispatcher diff-mode git-commit magit-git
magit-base magit-section crm with-editor transient log-edit message rfc822 mml
mml-sec epa epg rfc6068 epg-config gnus-util rmail rmail-loaddefs mm-decode
mm-bodies mm-encode mailabbrev gmm-utils mailheader pcvs-util add-log compat
compat-29 autorevert filenotify aggressive-indent sendmail mail-utils nswbuff
finder-inf yaml-mode yaml guess-language flyspell ispell reftex reftex-loaddefs
reftex-vars tab-jump-out yasnippet-snippets yasnippet company-org-block
org-settings org-clock ob-jupyter jupyter-tramp jupyter-server derived
jupyter-server-ioloop jupyter-ioloop-comm jupyter-ioloop zmq zmq-core
jupyter-rest-api url-http url-auth mail-parse rfc2231 rfc2047 rfc2045 mm-util
ietf-drums mail-prsvr url-gw nsm rmc jupyter-org-extensions jupyter-org-client
jupyter-repl jupyter-kernel-manager jupyter-channel jupyter-widget-client
websocket bindat simple-httpd jupyter-client jupyter-comm-layer jupyter-messages
hmac-def jupyter-mime shr kinsoku text-property-search puny svg
jupyter-kernelspec jupyter-env jupyter-base eieio-base ob-shell ob-scheme
ob-clojure ob-python python tramp-sh org-element avl-tree dom org ob ob-tangle
ob-ref ob-lob ob-table ob-exp org-macro org-footnote org-src ob-comint
org-pcomplete org-list org-faces org-entities noutline outline org-version
ob-emacs-lisp ob-core ob-eval org-table oc-basic ol org-keys oc org-compat
org-macs org-loaddefs find-func cal-menu calendar cal-loaddefs denote xdg dired
dired-loaddefs docker-tramp tramp-cache tramp tramp-loaddefs trampver
tramp-integration files-x tramp-compat shell pcomplete comint ansi-color
parse-time ls-lisp format-spec biblio biblio-download biblio-dissemin
biblio-ieee biblio-hal biblio-dblp biblio-crossref biblio-arxiv timezone
biblio-doi biblio-core let-alist url-queue ido hl-line bibtex iso8601 time-date
adaptive-wrap goggles comp comp-cstr warnings pulse posframe bm
company-quickhelp pos-tip all-the-icons all-the-icons-faces data-material
data-weathericons data-octicons data-fileicons data-faicons data-alltheicons
company-keywords company-etags etags fileloop generator xref project
company-gtags company-dabbrev-code company-dabbrev company-ipa company-files
company-clang company-cmake company-semantic company-template company-css
company-capf company solarized-light-theme solarized-theme solarized
solarized-faces color paradox paradox-menu paradox-commit-list hydra ring lv
cus-edit pp cus-load paradox-execute paradox-github paradox-core spinner
whitespace jk-functions advice dash eshell esh-cmd esh-ext esh-opt esh-proc
esh-io esh-arg esh-module esh-groups esh-util notifications dbus xml cl-extra
help-mode edmacro kmacro server elec-pair recentf tree-widget wid-edit delsel
use-package use-package-ensure use-package-delight use-package-diminish
use-package-bind-key bind-key use-package-core easy-mmode tex-site rx info
package browse-url url url-proxy url-privacy url-expand url-methods url-history
url-cookie url-domsuf url-util mailcap url-handlers url-parse auth-source cl-seq
eieio eieio-core cl-macs eieio-loaddefs password-cache json subr-x map url-vars
seq byte-opt gv bytecomp byte-compile cconv cl-loaddefs cl-lib pcase iso-transl
tooltip eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type
elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset
image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer
select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors
frame minibuffer cl-generic cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian
slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj
charscript charprop case-table epa-hook jka-cmpr-hook help simple abbrev obarray
cl-preloaded nadvice button loaddefs faces cus-face macroexp files window
text-properties overlay sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote threads dbusbind inotify lcms2
dynamic-setting system-font-setting font-render-setting cairo move-toolbar gtk
x-toolkit x multi-tty make-network-process native-compile emacs)

Memory information:
((conses 16 2772328 367045)
 (symbols 48 74856 49)
 (strings 32 422440 48171)
 (string-bytes 1 14715498)
 (vectors 16 153295)
 (vector-slots 8 3375385 310936)
 (floats 8 1991 2084)
 (intervals 56 273127 52213)
 (buffers 992 34))