Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (ns createinserts
- (:import (java.io BufferedReader FileReader)))
- ; Die Spaltennamen in der CSV-Datei
- (def *cols* '(col1 col2 col3 col4 col5))
- ; Die Txt_oid Spalte
- (def *txt-oid* 'txt_oid)
- (def
- ^{:private true}
- *number-pattern* (re-pattern "\\d+"))
- (defn
- ^{:doc "Liefert :number wenn der String nur aus Zahlen besteht, :string sonst"
- :private true}
- is-string-a-number? [s]
- (if (re-matches *number-pattern* s)
- :number
- :string))
- (defrecord Column-Value [column value])
- (defmulti str-value
- (fn [column-value]
- (is-string-a-number? (:value column-value))))
- (defn str-column [column-value] (:column column-value))
- (defmethod
- ^{:doc "Setzt den String in Hochkomma und versieht enthaltene Hochkomma mit Escape-Charactern"}
- str-value :string [column-value]
- (str "'" (.replaceAll (:value column-value) "'" "'''" ) "'"))
- (defmethod str-value :number [column-value] (str (:value column-value)))
- (defn
- ^{:doc "Erzeugt eine Liste von Column-Value Records, für die aktuell zu verarbeiteten line-tokens"}
- columns-and-values
- ([line-tokens]
- (reverse (columns-and-values line-tokens *cols*)))
- ([line-tokens cols]
- (loop [result []
- my-tokens (seq line-tokens)
- my-cols (seq cols)]
- (if (and my-tokens my-cols)
- (if (> (.length (first my-tokens)) 0)
- (recur (cons (Column-Value. (first my-cols) (first my-tokens)) result) (next my-tokens) (next my-cols))
- (recur result (next my-tokens) (next my-cols)))
- result))))
- ; Hätte man auch einfach mit (join ", " list) realisieren können
- (defn
- ^{:doc "Liefert die Liste durch Komma separiert als String zurück."}
- comma-separated [list]
- (reduce #(str %1 ", " %2) list))
- (defn
- ^{:doc "Eigentliche Funktion die für jede Zeile der Input-Datei aufgerufen wird und ein entsprechendes Insert-Statement erzeugt.
- acc - Die aktuelle Zeilennummer"}
- process-line [acc line]
- (let [line-tokens (.split line ";")
- columns-and-values (cons (Column-Value. *txt-oid* (str acc)) (columns-and-values line-tokens))]
- (println (str "insert into someTable ("
- (comma-separated (map str-column columns-and-values))
- ") values ("
- (comma-separated (map str-value columns-and-values))
- ");"))
- )
- (+ acc 1))
- (defn
- ^{:doc "Verarbeitet eine Eingabedatei, und führt die übergebene Funktion darauf aus und schleift dabei acc durch"}
- process-file [file-name line-func line-acc]
- (with-open [rdr (BufferedReader. (FileReader. file-name))]
- (reduce line-func line-acc (line-seq rdr))))
- ; Eigentlicher Aufruf der Verarbeitung
- (process-file "src/abc.csv" process-line 1)
Add Comment
Please, Sign In to add comment