LispユーザーがLispのパーサーを利用できるという事実を利用することができます。このデータの問題は、一部の値にコロンが含まれていることです。CommonLispではパッケージ名の区切り文字が使用されています。私はあなたの質問を解決するためにいくつかの実用的なCommonLispコードを作成しましたが、適切なパッケージを定義することによって上記の問題を回避する必要がありました。
これがコードです。もちろん、質問の例で省略したすべてのコードを拡張する必要があります(すでに使用されているのと同じパターンに従います)。
(defpackage #:thous
(:export #:5-10 #:20+))
(defpackage #:private
(:export #:roman-catholic))
(defstruct (college (:conc-name nil))
(name "")
(state "")
(location "")
(control "")
(no-of-students ""))
(defun data->college (name data)
(let ((college (make-college :name (write-to-string name :case :capitalize))))
(loop for (key value) in data
for string = (remove #\| (write-to-string value :case :downcase))
do (case key
(state (setf (state college) string))
(location (setf (location college) string))
(control (setf (control college) string))
(no-of-students (setf (no-of-students college) string))))
college))
(defun read-data (stream)
(loop for (def-instance name . data) = (read stream nil nil)
while def-instance
collect (data->college name data)))
(defun print-college-as-csv (college stream)
(format stream
"~a~{,~a~}~%"
(name college)
(list (state college)
(location college)
(control college)
(no-of-students college))))
(defun data->csv (in out)
(let ((header (make-college :name "College"
:state "state"
:location "location"
:control "control"
:no-of-students "no-of-students")))
(print-college-as-csv header out)
(dolist (college (read-data in))
(print-college-as-csv college out))))
(defun data-file-to-csv (input-file output-file)
(with-open-file (in input-file)
(with-open-file (out output-file
:direction :output
:if-does-not-exist :create
:if-exists :supersede)
(data->csv in out))))
主な関数はdata-file-to-csvであり、(data-file-to-csv "path-to-input-file" "path-to-output-file")
このコードをロードした後、CommonLispREPLで呼び出すことができます。
編集:いくつかの追加の考え
実際には、コロンを含むすべての値のパッケージ定義を追加する代わりに、正規表現検索を実行し、データを置き換えてすべての値の周りにquotes( ")を追加する方が簡単です。これにより、Lispはそれらを文字列としてすぐに解析します。その場合、その行for string = (remove #\| (write-to-string value :case :downcase))
を削除して、ステートメントのすべての行でstring
置き換えることができます。value
case
データの規則性が高いため、Lisp定義を正しく解析する必要はまったくありません。代わりに、正規表現を使用してデータを抽出することができます。AWKやPerlのように、テキストファイルの正規表現ベースの変換に特に適した言語は、そのジョブに適しているはずです。