<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div><div>Here is a slightly more compact version, still not scsh syntax:&nbsp;</div><div><br></div><div>#! /bin/sh</div><div>#|</div><div>exec racket -tm "$0" ${1+"$@"}</div><div>|#</div><div>#lang racket</div><div><br></div><div>;; ---------------------------------------------------------------------------------------------------</div><div>;; this script replaces "," in "stem.csv" files with "." and places the result in "stem-ms.csv"&nbsp;</div><div>;; current directory only&nbsp;</div><div><br></div><div>(provide main)</div><div><br></div><div>(define (main)</div><div>&nbsp; ;; use (in-directory), if you would like recursion in file system&nbsp;</div><div>&nbsp; (for ((f (directory-list)) #:when (regexp-match? #rx"[^-ms]\\.csv" f))</div><div>&nbsp; &nbsp; (define in (open-input-file f))</div><div>&nbsp; &nbsp; (define ff (regexp-replace #rx"\\." (path-&gt;string f) "-ms."))</div><div>&nbsp; &nbsp; (define out (open-output-file ff #:exists 'replace #:mode 'text))</div><div>&nbsp; &nbsp; (parameterize ((current-input-port in) (current-output-port out))</div><div>&nbsp; &nbsp; &nbsp; (for ((l (in-lines)))</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>(printf "~a\n" (regexp-replace #rx"\\." l ","))))</div><div>&nbsp; &nbsp; ;; skip, if you don't expect too many files:&nbsp;</div><div>&nbsp; &nbsp; (close-input-port in)</div><div>&nbsp; &nbsp; (close-output-port out)))</div><div><br></div><div>;; a test run:&nbsp;</div><div><br></div><div><div>s% !!</div><div>rm -rf foo-ms.csv ; cat foo.csv ; ./replace.rkt ; cat foo-ms.csv</div><div>1, "hello . world", 10</div><div>1, "hello , world", 10</div></div><div><br></div><div>Does this help a bit? -- Matthias</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><div>On Jul 20, 2013, at 7:04 AM, Vlad Kozin wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi. I thought I'd use Racket to solve a silly little scripting problem.&nbsp;<div><br></div><div>Script doesn't take arguments, instead looks for .csv files in its directory, reads them line by line, does some trivial replacement and writes the result to a new .csv file adding "-ms" suffix to its name. You can see my solution&nbsp;<a href="http://pastebin.com/CPb5gxEu">http://pastebin.com/CPb5gxEu</a>&nbsp;and below. I suppose you bearded hackers would roll-out a quick awk + sh script in a minute - seems like exactly the task suited for awk. Unfortunately I find I'm allergic to sh - entirely too much of a challenge for me. Plus .csv files I'm dealing with are on the order of &gt;200Mb.&nbsp;<br><br>Writing it felt somewhat awkward or rather more so than I anticipated, hence this post. Can you see a better, more straightforward, canonical way of doing this sort of things? Feels like general-purpousness of the language shows and a dsl like scsh would allow more straightforward style. &nbsp;<div><br><div><div>#! /usr/bin/env racket</div><div>#lang racket</div><div><br></div><div>;; doesn't tell directories and files apart, can be dangerous</div><div>(define files</div><div>&nbsp; (filter</div><div>&nbsp; &nbsp;(lambda (e) (regexp-match? #rx"[^-ms]\\.csv" e))</div><div>&nbsp; &nbsp;(directory-list (current-directory))))</div><div><br></div><div>;; this really should be a straightforward pipe with processing in the middle</div><div>;; this wrapping of with--file procedures feels a little like writing cps by hand</div><div>;; (stdin stdout) now point to (in out)</div><div>(define (with-in-out-files proc in out)</div><div>&nbsp; (with-input-from-file in</div><div>&nbsp; &nbsp; (lambda ()</div><div>&nbsp; &nbsp; &nbsp; (with-output-to-file out proc &nbsp;#:mode 'text #:exists 'replace))))</div><div><br></div><div>(define (replace-dot-in-file in)</div><div>&nbsp; (define (dot-&gt;comma)</div><div>&nbsp; &nbsp; (for ([l (in-lines)])</div><div>&nbsp; &nbsp; &nbsp; (printf "~a\n" &nbsp; (regexp-replace #rx"\\." l ","))))</div><div>&nbsp; (define (out-filename file suffix)</div><div>&nbsp; &nbsp; (define file-ext &nbsp;(regexp-split #rx"\\." file))</div><div>&nbsp; &nbsp; (string-append (first file-ext) suffix "." (second file-ext)))</div><div>&nbsp; (with-in-out-files dot-&gt;comma in (out-filename in "-ms")))</div><div><br></div><div>;; good candidate to exploit that multi-core bazooka</div><div>;; should I be using futures / places / threads and&nbsp;</div><div>;; some kind of parallel map here?&nbsp;</div><div>(time (for-each replace-dot-in-file files))</div><div><br></div><div>Thanks</div><div><br></div><div><br></div><div><br></div></div></div></div></div>____________________<br> &nbsp;Racket Users list:<br> &nbsp;<a href="http://lists.racket-lang.org/users">http://lists.racket-lang.org/users</a><br></blockquote></div><br></body></html>