• 締切済み

[common lisp]データ読み込みについて

txtファイルからデータを読み込み、dataに付置したいです。 (setq data (with-open-file (in "/test.dat" :direction :input))) って可能でしょうか? また、テキストデータの中のデータの書式はどのようにすればいいですか?(テキストエディット使用) データが文章なのですが、 ("hi how are you" "hi how are you")こんな感じで大丈夫ですか?

みんなの回答

回答No.1

うーん、こう言うのは質問投げるより自分で実際動かして確かめてみた方が良いんですけどね。 CL-USER> (with-open-file (out "~/test.dat" :direction :output)       (let ((str "hi how are you"))        (format out "~A~%~A~%" str str))) NIL CL-USER> さて、作成されたtest.datファイルを開いてみます。 hi how are you hi how are you 中身はこうなってなかったでしょうか?普通のテキストファイルに書かれたようになってますね。 つまり、2番目の質問に対しての答えは「どーでも良い」です(笑)。 実際、データをテキストとして保存する場合、書式は「あなたが決めるもの」です。これはCommon Lispに限らず、どんな言語でも同じで、つまりそれは「目的によって」パーズしやすいデータ形式を「あなたが」決めれば良い、って事ですね。 今回の場合はformat関数で「整形出力しろ」ってんでこーゆーカタチになったわけですが、もちろんリストにして保存してもO.K.です。全ては貴方が決める事です。色々試してみてください。 (ただ、一般に言って、リストの形式にしておけばreadで読み込みやすい、と言う特典はアリ) ところで。 with-open-fileの書式は次のようになっています。 (with-open-file (変数 ファイル名 オプション) 本体) ここで「変数」ですが、これはinだろうとoutだろうとsでもmでも大丈夫です。文字は何でも良いんですが、要するに、ファイルを開いたストリームの情報はここに束縛されるんですが、問題はこれは局所変数扱いでwith-open-fileの外側からは見えません。 上のコードでもそうですが、ストリーム情報を束縛したoutはwith-open-fileの「本体内」(上のコードではformat関数の第一引数)からは参照出来ますが、外側からは参照出来ないのです。 ちょっと実験してみましょうか。 CL-USER> (defparameter data nil) DATA CL-USER> (setf data (with-open-file (in "~/test.dat" :direction :input))) ;Compiler warnings : ; In an anonymous lambda form: Unused lexical variable IN 多分こんなカンジで、エラーを返してくるか、あるいは無限ループに突入すると思います。 何故なら、with-open-fileと言うマクロは、「ファイルを開いて」それから最後に「ファイルを閉じて」くれるわけですが、マクロ内で特に何かしろ、って本体で処理を書き込まない以上、ファイルを開けっ放しで「待ち」の状態に入ります。そうしてCommon Lisp処理系は(処理系からのエラー通達が無い限り)待機状態で止まってしまうのです。 つまり、やるなら、ストリーム情報を保持したいなら、最低でも次のように書くべきです。 CL-USER> (defparameter data nil) DATA CL-USER> (with-open-file (in "~/test.dat" :direction :input)      (setf data in)) #<BASIC-FILE-CHARACTER-INPUT-STREAM ("C:/Users/cametan/test.dat"/:closed #x2100C932AD> CL-USER> これなら大域変数dataにinに束縛されたデータを束縛する事が出来ます。変数dataを見てみますか。 CL-USER> data #<BASIC-FILE-CHARACTER-INPUT-STREAM ("C:/Users/cametan/test.dat"/:closed #x2100C932AD> CL-USER> 何か分からんけどデータが束縛されてる模様です。 ところが、 CL-USER> (read-line data) ; Evaluation aborted on #<SIMPLE-ERROR #x2100B67C2D>. CL-USER> (read data) ; Evaluation aborted on #<SIMPLE-ERROR #x2100B1051D>. CL-USER> (read-char data) ; Evaluation aborted on #<SIMPLE-ERROR #x2100B63A3D>. CL-USER> 何のデータが記述されてるのか読み出そうにもエラーを返してきますね。 これはこう言う事です。 with-open-fileと言うマクロはストリーム情報を返してきますが、with-open-file本体内に記述した作業を終えるとストリームを閉じるわけです。dataに束縛したストリームは既に閉じた情報なんで、これから何か読み出そうと言うのはあまり現実的ではありません。 つまり、やるなら「ストリームを閉じる前に」人間が認識出来るカタチでデータを読みだしてdataに束縛しなければならない、って事です。 要するに、質問者さんが恐らくやりたいのは次のようなコードでしょう。 CL-USER> (defparameter data nil) DATA CL-USER> (with-open-file (in "~/test.dat" :direction :input)       (setf data          (loop for line = (read-line in nil :eof)            until (eq line :eof)            collect line))) ("hi how are you" "hi how are you") こう言う事じゃないですかね。大域変数dataの中身を見てみます。 CL-USER> data ("hi how are you" "hi how are you") CL-USER> キチンと「僕らに分かる形式で」束縛されてるのが分かりますね。 要するにまとめると 1. 「どんなカタチでファイルにデータをテキスト形式で保存するか」はデータ設計者に委ねられる。 2. Common Lispでもどんなテキスト形式でもデータが保存出来る(でも得手不得手から言うとリストが得意ではある)。 3. 故にパーズしやすい設計を自分で考えて決めてしまう。どんなカタチでもCommon Lispは一応対応出来る。 4. with-open-fileはファイルを開いてそのストリーム情報を第一引数内の第一引数(ややこしい・苦笑)に束縛するが、これはローカル変数扱いなので、with-open-fileの本体からしか参照出来ない。 5. ストリームから「目に見えて分かりやすい」データに変形するにはread、read-line、read-char等を使ってみる。 ですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • lispでの文字読み込み

    lispでの文字読み込み 以下のようなテキストをcommon lispで読み込んでいます。 --a.txt-- あああ いいい ううう ええええ --------- このような感じで。 (let (in str) (with-open-file (in "a.txt" :direction :input) (setf str (read-as-string in nil)) ) ) このときに、いいいの下の空行を読み込むにはどうしたらよいでしょうか? 読み込むというか、空行があることが検出できればいいんですが。

  • エクセルでテキストデータを読み込むときに、カンマの扱い

    エクセルVBAで、 open "**.txt" for input as #1 で読み込ませています。1行のデータとして、セルに入力したいのですが、カンマが入っているとそこで区切られてしまいます。これをしないようにしたいのですが、テキストファイルのデータに全角のカンマ,を使っても同じようになってしまいます。何か方法はありませんでしょうか?

  • テキストデータの読み込みについて

    C言語のテキストデータの読み込みについてです。 C言語のプログラムについてです。 2444,1114,2807, 1984,2845,2086, 658.1,-1564.0,1239.7, -102.0,958.4,123.1, 12.7,6.0,82.7 2439,1110,2802, 1973,2865,2108, 658.8,-1563.7,1239.6, -102.0,957.1,121.9, 12.8,6.0,82.7 2441,1106,2806, 1967,2888,2124, 659.4,-1563.5,1239.5, -102.2,956.4,121.0, 12.8,6.1,82.8 2440,1109,2808, 1964,2896,2127, 660.0,-1563.3,1239.4, -102.7,956.2,120.7, 12.8,6.1,82.8 2441,1112,2807, 1981,2894,2120, 660.6,-1563.0,1239.4, -103.3,956.2,120.1, 12.8,6.1,82.8                                       ↑ 上の様なカンマとスペースで15個に区切られているtxtファイルがあるのですが、このtxtデータの10コ目と11コ目をを計算で使いたく、取り出したいと考えているのですがscanfを使いどのように取り出すことが出来るのか、また取り出したデータから数値を引くことを教えて頂きたいです。 つまり -102.0   958.4 -102.0   957.1 -102.2 と 956.4 -102.7   956.2 -103.3   956.2,             を取り出して計算に使いたいです。 そして1番上の数値だと、 -102.0と958.4 を読み込み、例えばそれぞれ100を引いた値を配列に入れたいです。 -102.0と958.4 → -202.0 と 858.4 のように取り出したいです。 教えて頂きたいです。お願いします。

  • テキストエディット等で書いた文章を、txtデータにするにはどうすればよ

    テキストエディット等で書いた文章を、txtデータにするにはどうすればよいのでしょうか。 「文章をtxtデータでメールして」と言われましたがやり方が分かりませんでした。 分かりやすくご回答頂ければ大変助かります。 OSはMacの10.6.3です。 どうぞよろしくお願いします。 

    • ベストアンサー
    • Mac
  • テキストファイルの読み込み

    http://www.ajaxtower.jp/ini/html/index1.htmlにあるサンプルで xmlHttp.open("GET", "http://www.ajaxtower.jp/sample/readfile.txt", true); の、ファイルの場所を変えたいのですが、とりあえず、同じフォルダ内のテキストファイルtest.txtにアクセスしようと、"./test.txt"に変えて、クリックしても何も表示されませんでした。 apacheを起動してhtdocsにtest.txtを入れて"files://localhost/test.txt"に入れてもダメでした。 xmlHttp.openが読めるtextファイルは、どういう状態である必要があるのでしょうか?

  • 定型書式のテキストファイルをExcelに取り込むマクロについて

    以下のような定型書式のテキストファイル(ファイル名はdata(連番).txt。Shift-JIS。改行コードLF)から、 ・<h2>~</h2>で囲まれたテキストのうち、改行やコメントを取り除いたもの(あああああああ) ・<!--コメント2-->直後の、最初の「DAT」に続く文字列(いいい) を、ExcelのC列、D列に取り込みたいのですが、抽出方法がよくわかりません。 なお、テキストファイルの体裁は一切変更できません。 ------------------------- data1.txt …… <h2> <!--コメント1--> あああ ああああ <!--コメント終了--> </h2> <!--コメント2--> DATいいいDATDうううDDATえええ …… -------------------------

  • MLionのテキストエディット.appの設定変更?

    mountain lion (os x 10.8)のテキストエディットに関して 2点教えていただけませんでしょうか? ご存知の方、どうかよろしくお願いいたします。 1. 起動時に表示される、 「テキストエディット で iCloud」 のウィンドウを表示させないようにする設定 2. 新規ファイルの書式を、 リッチテキスト(.rtf)から標準テキスト(.txt)に 変更する設定

    • ベストアンサー
    • Mac
  • ファイルの読み込みについて

    いつもお世話になっています。 早速質問なのですが、VBのファイル処理において固定長データのテキストファイル読み込みの処理で、 固定長データの改行コードがChr(10)になっているデータがあります。 下記のどのOpenステートメントを使用しても、1行読み込みではなく全行読み込まれてしまうのです。 ↓ファイルモード (1)Open strInFile For Input As #intInFile (2)Open strInFile For Random As #intInFile Len=文字数 (3)Open strInFile For Binary As #intInFile ちなみに読み込みのモードは ・Line Input ステートメント ・Get ステートメント の2つを使用してみました。 改行コードの種類に依存せずにデータを1行読み込む方法を教えていただきたいです。

  • BCB  読み込み。

    OpenDialogでバイナリファイルを読み込むのですが、、 同じフォルダに同じファイルネームで形式が違うものを同時に読み込みたかったので。(A.txt A.dat B.txt B.dat....) ///// FILE *fp; if(OpenDialog1->Execute()) {          A1 = ExtractFilePath(OpenDialog1->FileName); A2 = ExtractFileName(OpenDialog1->FileName); A3 = ChangeFileExt(A2,"");        FN1 = A1 + A3 +".dat"; FN2 = A1 + A3 +".txt"; fp = fopen("FN1", "rb" ); fread(Data,2,3000,fp); } ///// FN1とFN2をメモ確認してみたところFN2の方はそのままのファイルの中身が表示されましたが、FN1はそのdatファイルの絶対パスが表示されたので上のようにやってみたのですがうまく読み込めませんでした。 ご指導の方お願いします。

  • C++ ドラッグ&ドロップによるテキストデータ読込

    C++初心者です。 aaa.txtのデータ(数値がたくさん並んでいるもの)を読み込んである列の平均値を出すなど計算したいと思っています。 しかしaaa.txt以外にも計算したいテキストデータがたくさんあり、そのたびいちいちソースを弄ってテキストの名前を変えるのはおっくうです。 今は、次のようにファイルを読み込んでいます。 ifstream ifs("aaa.txt"); そこでexeファイルにドラッグ&ドロップしてそのテキストファイルの数値を勝手に読み込んでくれるように改変できるでしょうか?