Лисп скрипт для разбора csv и генерации HTML таблицы? - PullRequest
1 голос
/ 09 октября 2009

Я пытаюсь написать небольшой сценарий Emacs Lisp, который читает файл csv из стандартного ввода, превращает все строки в таблицу, а затем печатает его в стандартный формат (Unix). Я написал базовую версию, которая принимает строку CSV и выводит таблицу в буфер. Однако я хотел бы превратить это в служебный скрипт Unix.

<b>#!/usr/bin/emacs --script</b>

(defun gen-row (lst)
  (dolist (elm lst)
    (insert "<tr>")
    (insert (concat "<td>" elm "</td>"))
    (insert "</tr>")
    )
)
(defun parse-csv-line (txt)
  (setq lst (progn
          (insert "\n<table>\n")
          (setq str txt)
          (gen-row (split-string str ","))
          (insert "\n</table>\n")
          ))
  )

(parse-csv-line "this,is,a test")

Вывод в текущий буфер при запуске из Emacs:

<table>
<tr><td>this</td></tr><tr><td>is</td></tr><tr><td>a test</td></tr>
</table>

Использование скрипта:

./csv2html < foo.csv > bar.html; # emacs --script instead of perl -ane '...' 

1 Ответ

2 голосов
/ 09 октября 2009

Вот как бы я обернул ваши рутины, чтобы получить то, что вы ищете.

Примечание: Я изменил подпрограммы просто на princ строки, а не вставил их в буфер.

#!/usr/local/bin/emacs --script

(require 'cl)
(defun gen-row (lst)
  (mapcar (lambda (elm)
            (princ (concat "<tr><td>" elm "</td></tr>")))
          lst))

(defun parse-csv-line (txt)
  (princ "\n<table>\n")
  (gen-row (split-string txt ","))
  (princ "\n</table>\n"))

; (parse-csv-line "this,is,a test")

(defun run-it (&optional argv)
  (with-temp-buffer
    (if argv
        (find-file (car argv))
      (condition-case nil
          (let ((line (read-from-minibuffer "")))
            (while line
              (insert line)
              (insert "\n")
              (setq line (read-from-minibuffer ""))))
        (error nil)))

    ;; the current buffer has the file contents (or stdin contents)
    ;; now process each line
    (goto-char (point-min))
    (while (< (point) (point-max))
      (parse-csv-line (buffer-substring (point) (progn (end-of-line) (point))))
      (forward-line 1)
      (beginning-of-line 1))))

(run-it argv)

Если вы собираетесь выполнять более сложную обработку таблиц, может быть проще манипулировать вводом в виде списков, чтобы получить то, что вы хотите, а затем использовать пакет xmlgen для генерации всех HTML-теги.

...