Guest User

Untitled

a guest
Jul 22nd, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.63 KB | None | 0 0
  1. (ns createinserts
  2. (:import (java.io BufferedReader FileReader)))
  3.  
  4. ; Die Spaltennamen in der CSV-Datei
  5. (def *cols* '(col1 col2 col3 col4 col5))
  6.  
  7. ; Die Txt_oid Spalte
  8. (def *txt-oid* 'txt_oid)
  9.  
  10. (def
  11. ^{:private true}
  12. *number-pattern* (re-pattern "\\d+"))
  13.  
  14. (defn
  15. ^{:doc "Liefert :number wenn der String nur aus Zahlen besteht, :string sonst"
  16. :private true}
  17. is-string-a-number? [s]
  18. (if (re-matches *number-pattern* s)
  19. :number
  20. :string))
  21.  
  22. (defrecord Column-Value [column value])
  23.  
  24. (defmulti str-value
  25. (fn [column-value]
  26. (is-string-a-number? (:value column-value))))
  27.  
  28. (defn str-column [column-value] (:column column-value))
  29.  
  30. (defmethod
  31. ^{:doc "Setzt den String in Hochkomma und versieht enthaltene Hochkomma mit Escape-Charactern"}
  32. str-value :string [column-value]
  33. (str "'" (.replaceAll (:value column-value) "'" "'''" ) "'"))
  34.  
  35. (defmethod str-value :number [column-value] (str (:value column-value)))
  36.  
  37. (defn
  38. ^{:doc "Erzeugt eine Liste von Column-Value Records, für die aktuell zu verarbeiteten line-tokens"}
  39. columns-and-values
  40. ([line-tokens]
  41. (reverse (columns-and-values line-tokens *cols*)))
  42. ([line-tokens cols]
  43. (loop [result []
  44. my-tokens (seq line-tokens)
  45. my-cols (seq cols)]
  46. (if (and my-tokens my-cols)
  47. (if (> (.length (first my-tokens)) 0)
  48. (recur (cons (Column-Value. (first my-cols) (first my-tokens)) result) (next my-tokens) (next my-cols))
  49. (recur result (next my-tokens) (next my-cols)))
  50. result))))
  51.  
  52. ; Hätte man auch einfach mit (join ", " list) realisieren können
  53. (defn
  54. ^{:doc "Liefert die Liste durch Komma separiert als String zurück."}
  55. comma-separated [list]
  56. (reduce #(str %1 ", " %2) list))
  57.  
  58. (defn
  59. ^{:doc "Eigentliche Funktion die für jede Zeile der Input-Datei aufgerufen wird und ein entsprechendes Insert-Statement erzeugt.
  60. acc - Die aktuelle Zeilennummer"}
  61. process-line [acc line]
  62. (let [line-tokens (.split line ";")
  63. columns-and-values (cons (Column-Value. *txt-oid* (str acc)) (columns-and-values line-tokens))]
  64.  
  65. (println (str "insert into someTable ("
  66. (comma-separated (map str-column columns-and-values))
  67. ") values ("
  68. (comma-separated (map str-value columns-and-values))
  69. ");"))
  70. )
  71. (+ acc 1))
  72.  
  73. (defn
  74. ^{:doc "Verarbeitet eine Eingabedatei, und führt die übergebene Funktion darauf aus und schleift dabei acc durch"}
  75. process-file [file-name line-func line-acc]
  76. (with-open [rdr (BufferedReader. (FileReader. file-name))]
  77. (reduce line-func line-acc (line-seq rdr))))
  78.  
  79. ; Eigentlicher Aufruf der Verarbeitung
  80. (process-file "src/abc.csv" process-line 1)
Add Comment
Please, Sign In to add comment