2011-01-09 14 views
0

eine Reihe von begrenzten Daten in folgendem Format:Wie kann ich sql-Inserts aus pipe-separierten Daten erzeugen?

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

In elisp, wie kann ich SQL-Insert-Anweisungen in diesem Format erzeugen?

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); 

das Problem zu vereinfachen, lassen Sie uns für einen Parameter erlauben die Spalten Text oder numerisch zu erzählen. (z. B. 0,1,1,1,1)

So würde ich es in Perl machen.

Antwort

0

Um die Daten am Ende eines Puffers einfügen:

(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))) 

Diese Lösung nicht gut mit der Perl-Lösung im Vergleich skala kann.

Alternativ könnten wir die Werte in eine Datenbank mit SQLMODE einfügen:

(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

Dies fügt in das Nachrichtenfenster ein, das nicht sehr zugänglich ist. Wie kann ich am Ende des Puffers einfügen? –

+0

Ich habe jetzt die Lösung überarbeitet, um Text am Ende des Puffers einzufügen und einen Ansatz mit SqlMode enthalten, um die Werte in eine Datenbank einzufügen. – mclements

0

Sie können ein einfaches Programm schreiben, um durch jede Zeile zu gehen und nach Trennzeichen | und generiere Einfügeanweisungen. Wenn Sie mit mysql vertraut sind, können Sie die Daten mit dem Befehl "load data" in die mysql-Tabelle importieren. Sie werden die Daten in der Datei haben, haben allerdings

+0

Ich möchte eine Antwort in elisp. –

Verwandte Themen