Проверить правильное количество полей в строке? - PullRequest
3 голосов
/ 06 ноября 2011

В Emacs я манипулирую некоторыми данными, разделенными конвейерами, и я хотел бы построить некоторые функции проверки.Первая функция, которую я хотел бы - убедиться, что у меня есть правильное количество полей.В этом примере у меня есть четыре столбца данных.На этом этапе я хочу получить предупреждение для второй и четвертой строк, потому что нет как минимум трех разделителей (|).

1|2|3|4
one|two|
four|five|6|7
abc||

1 Ответ

3 голосов
/ 06 ноября 2011

Чтобы подсчитать количество символов канала в текущей строке, попробуйте следующее:

(count-matches "|" (point-at-bol) (point-at-eol))

Чтобы проверить весь буфер, рассмотрите следующую функцию:

(require 'cl)
(defun invalid-points ()
  (save-excursion
    (goto-char (point-min))
    (loop while (re-search-forward ".$" nil t)
          unless (= 3 (count-matches "|" (point-at-bol) (point-at-eol)))
          collect (point))))

, которая возвращаетсписок позиций строк, которые содержат недопустимое количество полей (поэтому вернет nil только тогда, когда весь буфер был действителен).

Для интерактивного использования, возможно, самый простой способ - использовать font-lock-modeвыделите недопустимые строки (или наоборот):

(font-lock-add-keywords
 nil '(("^[^|\n]*\\(|[^|\n]*\\)\\{3\\}$" 0 highlight)))
...