Как я могу генерировать вставки SQL из данных с разделителями? - PullRequest
0 голосов
/ 09 января 2011

Дан набор данных с разделителями в следующем формате:

1|Star Wars: Episode IV - A New Hope|1977|Action,Sci-Fi|George Lucas
2|Titanic|1997|Drama,History,Romance|James Cameron

В elisp , как я могу сгенерировать операторы вставки SQL в этом формате?

insert into table 
   values(1,"Star Wars: Episode IV - A New Hope",1977","Action,Sci-Fi","George Lucas",0);
insert into table 
   values(2,"Titanic",1997,"Drama,History,Romance","James Cameron",0);

Чтобы упростить проблему, давайте позволим параметру сказать, какой столбцы текстовые или числовые. (например, 0,1,0,1,1)

Вот как бы я это сделал в Perl.

my @ctypes=qw/0 1 0 1 1/;

while(<>) {
  chop;
  @F=split('\|', $_);
  print "insert into table values(";
  foreach my $col (@F) {
    my $type=shift(@ctypes);
    print ($type == 1 ? '"'.$col.'"' : $col);
    print ",";
  }

  print "0);\n";
}

Ответы [ 2 ]

0 голосов
/ 13 сентября 2011

Чтобы вставить данные в конец буфера:

(require 'cl)
(defun* insert-statements (rows ctypes &key (table-name "table") (delimiter "|"))
  (let* ((values-template 
          (mapconcat '(lambda (type) (if (= type 1) "\"%s\"" "%s")) ctypes ","))
         (template (format "insert into %s values(%s);\n" table-name values-template)))
    (mapcar '(lambda (row) (insert (apply 'format (cons template (split-string row delimiter)))))
            rows)))

(let ((data "1|Star Wars: Episode IV - A New Hope|1977|Action,Sci-Fi|George Lucas
2|Titanic|1997|Drama,History,Romance|James Cameron")
      (ctypes '(0 1 0 1 1)))
  (save-excursion
    (goto-char (point-max))
    (insert-statements (split-string data "\n") ctypes)))

Это решение может плохо масштабироваться по сравнению с решением Perl.

В качестве альтернативы мы можем вставить значения вбаза данных с использованием SqlMode:

(require 'cl)
(defun* insert-statements (rows ctypes &key (table-name "table") (delimiter "|"))
  (let* ((values-template 
            (mapconcat '(lambda (type) (if (= type 1) "\"%s\"" "%s")) ctypes ","))
         (template (format "insert into %s values(%s);" table-name values-template)))
    (mapcar '(lambda (row) (sql-send-string
                            (apply 'format (cons template (split-string row delimiter)))) )
            rows)))
(sql-sqlite)
(sql-send-string "create table test (id, title, yr, genre, director);")
(let ((data "1|Star Wars: Episode IV - A New Hope|1977|Action,Sci-Fi|George Lucas
2|Titanic|1997|Drama,History,Romance|James Cameron")
      (ctypes '(0 1 0 1 1)))
  (insert-statements (split-string data "\n") ctypes :table-name 'test))
(sql-send-string "select title from test;")
(sql-send-string "drop table test;")
0 голосов
/ 09 января 2011

вы можете написать простую программу, которая будет проходить через каждую строку и искать разделитель |и генерировать операторы вставки.если вы знакомы с использованием mysql, вы можете импортировать данные в таблицу mysql с помощью команды «загрузить данные».вам придется хранить данные в файле, хотя

...