proglog

主にプログラミングに関する断片的メモ

howmsplit:ファイル名、文字コード

だいたいの雛形。
sjiscygwin、そのcygwin上のgaucheutf-8のソースで処理対象ファイル名に日本語が含まれているケース。

指定されたディレクトリ以下のhowmの1日1ファイル形式のファイルを読み込んで、拡張子をテキストにして出力。
howmファイルはsjisで書かれている。

#!/usr/local/bin/gosh

(use file.util)

;(define rx-howm-file #/\/\d\d\d\d-\d\d-\d\d\.howm$/)
;(define rx-howm-file #/\d\d\d\d-\d\d-\d\d\.howm$/)
(define rx-howm-file #/^\d\d\d\d-\d\d-\d\d\.howm$/)

(define (howmsplit file-name)
  (format #t "~A~%"  file-name)
  (with-input-from-file file-name
    (lambda ()
      (with-output-to-file (string-append (path-sans-extension file-name) "." "txt")
	(lambda ()
	  (let loop ((line (read-line)))
	    (cond ((not (eof-object? line))
		   (format #t "~A~%" line)
		   (loop (read-line))))))))
    :encoding "*jp"))

(define (main args)
 (format #t "arts: ~A~%" args)
  (cond ((null? (cdr args))
	 (format #t "set howm directory.~%"))
	(else
	 (directory-fold (car (cdr args))   ;listerからは不完全文字列のファイル名も渡ってくる。
			 (lambda (file seed)
			   (when (and (string-incomplete->complete file) (rxmatch rx-howm-file (sys-basename file)))  ;不完全を含むファイルは捨てる。
;			   (when (rxmatch rx-howm-file file)
;			   (when (rxmatch rx-howm-file (sys-basename file))
			     (howmsplit file)))
			 '()))))

shift-jisというかms漢字のファイル名は内部で何か処理しようとすると、エラーになる(ここでは正規表現マッチ)。
不完全文字列というらしい。
ソースをsjisにしても同じだったから、どこかで変換するのかな。
今回は単純にスルー。

入力テキストの文字コードは、オプションで自動判定してくれるので、非常に楽。

出力は、何もしなければutf-8になる。
cygwinutf-8対応になったみたいだし、移行するか。

list->stringは文字の連結。

(list->string '(#\a #\s #\d #\f))
"asdf"

文字列の連結は、string->append

cygwin,bash上でのコマンドラインはこんな感じ。

gosh ./gauche/tmp/dir-fold.scm `cygpath -u "D:\home\someone\test\howm"`

windows上のファイラーからパス名をコピってきて渡したので。