• ベストアンサー

Common LISPでファイルの読込・書込を行う方法は、どのようにするのでしょうか?

Common LISPでファイルの読込・書込を行う方法は、どのようにするのでしょうか? 例えば、CSVファイルを読み込んで、それをLISPのS式に変換し、違うファイル名で書き出すことがしたいです。 CommonLISPおよびxyzzyで動作させたいです。 ●入力ファイル test.csv 1,中村,100 2,伊藤,80 3,駒田,70 ●出力ファイル test.lsp (setq dat '( (1 中村 100) (2 伊藤 80) (3 駒田 70) ))

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

(with-open-file (foo "no-such-file" :if-does-not-exist nil) (read foo)) ANSI and GNU Common Lisp Document - with-open-file http://www.cs.queensu.ca/software_docs/gnudev/gcl-ansi/gcl_1192.html M.Hiroi's Home Page / xyzzy Lisp Programming http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp07.html xyzzy - file I/O http://www.netlaputa.ne.jp/~henmi/lisp/xyzzy/common/fileio.html ANSI Common Lisp: 本: ポール グレアム,Paul Graham,久野 雅樹,須賀 哲夫 http://www.amazon.co.jp/exec/obidos/ASIN/4894714337/ いい加減参考書のひとつも買ったらどうですか?

関連するQ&A

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

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

  • ファイルのパスについて

    下記のような構成でプログラムを組んでいます。 ([d]=ディレクトリ、[f]=ファイル) test[d] ├ test_dir[d] │ └ index2.php[f] │ ├ test_dat[d] │ └ data.dat[f] │ ├ index.php[f] └ common.inc[f] common.incにはindex.php、index2.php双方で使う共通関数が入っており、data.datのデータを読み込みます。 その際に、common.incの中でdata.datへのパスを"./test_dir/data.dat"設定しておくと、index2.phpでは「No such file or directory」と言われます。 有用な情報かは分かりませんが、common.incの読み込みにはinclude_onceを使用しています。 index2.phpから見ると当然そのパスは存在しないので理屈は分かりますが、解決方法が思い浮かびません。 引数でdata.datへのパスを渡せば問題なく動くと思いますが、出来ればcommon.inc内で解決したいと考えています。 何か良いの解決策は無いでしょうか?すいませんがよろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイルの読み込みと出力

    ファイルの読み込みと出力 Perl初心者です。よろしくお願いします。 file.csvのようなファイルを読み込んで、 out.csvのように出力するプログラムを作成しているのですが 途中で変な改行が度々入っているためどうしてもうまくいきません。 (file.csvですが、実際は1500行以上あります。 また、最後に必ずendが入っています。 下記のcsvですがテキスト形式で表示した内容です。) 初歩的な質問で申し訳ありません。 調べる限り調べたのですが分かりませんでした。 どうかよろしくお願いします。 「file.csv」 "2010/1/1","C","こんにちは","田中","end", "2009/10/2","B","おはよう","斉藤","end", "2007/3/20","E","Good mor ning","佐藤","end", "1988/8/16","F","こんばんは","中 村","end", "1999/1/10","A","Hello","木村","end", "2005/9/17","D","おはようご ざいます","斎藤","end", 「out.csv」(このように出力したいです) C,こんにちは,田中,2010/1/1,end, B,おはよう,斉藤,2009/10/2,end, E,Good morning,佐藤,2007/3/20,end, F,こんばんは,中村,1988/8/16,end, A,Hello,木村,1999/1/10,end, D,おはようございます,斎藤,2005/9/17,end, 「今書いているプログラムです」 #!/usr/local/bin/perl use strict; use Fatal qw/ open /; my $csv_file = "file.csv"; my @csv = &readCsvFile($csv_file); open(OUT,">out.csv"); for(my $i=0; $i<=5; $i++){    print OUT $csv[$i][1],",";    print OUT $csv[$i][2],",";    print OUT $csv[$i][3],",";    print OUT $csv[$i][0],",";    print OUT $csv[$i][4],","; } close(OUT); sub readCsvFile {    open(DATA, $_[0]);    while(<DATA>) {      chomp;      push @csv, [ split(/",\"/) ];    }    close(DATA);    return @csv; }

    • ベストアンサー
    • Perl
  • 正規表現での置き換え

    正規表現置き換えについて -----入力 ----- a (b) B (C) test.csv file.dat -----出力 ----- b (a) C (B) file.csv test.dat --------------- としたくて以下のコードを書いたのですが 実際の出力が $2 ($1) $2 ($1) $2.csv $1.dat となってしまいます。 --以下ソース %Convert = ( '(.+) \\((.+)\\)', '$2 ($1)' ,'(.+)\\.csv (.+)\\.dat', '$2.csv $1.dat' ); while(<DATA>){ foreach $key ( keys %Convert ){ s/$key/$Convert{$key}/gi; } print; } __DATA__ a (b) B (C) test.csv file.dat

    • ベストアンサー
    • Perl
  • CSVファイルを開いている状態での書込処理について

    OS:windows2000pro VB:VB6.0sp5 ファイル:c:\work\test0411.csv (workフォルダはEveryone共有:端末Aのみ) 端末:ABともにファイル共有を除き同環境 端末Aにて、システム(VBにて作成:下記参照)にて 上記ファイル(test0411.csv)に一定周期で書込を行っています Private Sub output(ByVal ofile As String) On Error GoTo trap handle = FreeFile() Open ofile For Append As #handle (中略) Print #handle, _ Close #handle Exit Sub trap: 'MsgBox Err.number & "," & Err.Description, vbInformation, "output" End Sub 端末Bにて、エクスプローラから上記ファイル(test0411.csv)を 開いて閲覧しています 上記ファイル(test0411.csv)を閲覧している間に (1)一定周期でデータの書込ができません 一旦ファイルを閉じ、再度開いた折、 閲覧していた間のデータが追加更新するように したいのですが、どのようにすれば良いのでしょうか? よろしくお願いいたします

  • .datファイルの保護

    .htaccessで 「AddType application/x-httpd-php .dat」 として.datファイルが丸見えになることを防ぐことができました。 しかしネットトランスポートでダウンロードしてみると.datファイルがそのまま保存されてしまいました。 完全に.datファイルを保護することはできないんでしょうか? .datファイルでなくても、PHPで書込・読込ができるものであれば仕様の変更も可能です。

    • ベストアンサー
    • PHP
  • datファイルの読み込み

    初歩的な質問ですみません。 今、819200行のファイルをfscanfで読み込んで配列に格納しているのですが、実行してみるとBus errorが出力されてしまい、うまく格納できません。どなたか至急教えてもらえませんか? ***************************ソース************************************************************ #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #define pi 3.1415926535 //円周率 #define FILE_SIZE 819200 #define FILE_NAME "test.dat" struct Data{ int time; double voltage; double velocity; double pressure; double trigger; }; int main() { int k,n,N,i=0,j; struct Data dat[FILE_SIZE]; FILE *fp1; FILE *fp2; if ((fp1 = fopen(FILE_NAME,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } //データの読み込み while((fscanf(fp1, "%d %lf %lf %lf %lf",dat[i].time,dat[i].voltage,dat[i].velocity,dat[i].pressure,dat[i].trigger)) !=EOF ){ i++; } fclose(fp1); return 0; } ***************************************************************************************** ********************test.datファイル********************************************** -2.64316 2.329595 0.697657 0.001373 -4.861982 -2.64314 2.325628 0.671961 0.001984 -4.744793 -2.64312 2.320745 0.640333 0.001678 -4.659953 -2.64310 2.319829 0.634400 0.002289 -4.707866 -2.64308 2.319219 0.630449 0.002289 -4.699321 -2.64306 2.317082 0.616607 0.002594 -4.532387 . . . . . *********************************************************************************** 環境はmac osです。 よろしくおねがい致します。

  • Fortranの出力の改行について

    Fortran超初心者です。 test1.csvのファイルには、x,yの変数がずっと続いています。 test2.datのファイルには、a,bの変数がずっと続いています。 この2つのファイルの変数を元に、d,eの値を求め、それをtest3.csvというファイルに出力したいのです。 test1.csvとtest2.datの計算はできていたのですが、test3.csvの出力は最後の計算結果のみしか出力されていません。 多分毎回出力はしているのですが、計算を繰り返すと上書きされ消えてしまうという仕組みになっているのだと思います。 どうやったら上書きされずに、csvファイルの次の行に次のデータを入力できますか? 以下私が考えたFortran90のプログラムです。 open (10, file='test1.csv', status='old')  do   read (10, *, iostat=ios) x, y   open (11, file='test2.dat', status='old')   do    read (11, *, iostat=jos) a, b    d = x +a    e = y + b    if (jos .lt. 0) exit   enddo   open (12, file='test3.csv', status='replace')   write (12, *) x, y, a, b, d, e   close (12)   close (11)   if (ios .lt. 0) exit  enddo close (10) 本当に始めたばかりで、いまいち意味の分かっていない部分もあるのですが、問題点を指摘してくれたら助かります。 わかりにくいので、具体的に少し書くと、 test1.csvには 1,2 9,3 6,4 とデータが続くとします。 test2.datには 80,50 10,20 90,60 とデータが続くとします。 test3.datには 1,2,80,50,81,52 1,2,10,20,11,22 1,2,90,60,91,62 9,3,80,50,89,53 9,3,10,20,19,23 9,3,90,20,99,23 6,4,80,60,86,64 6,4,10,20,16,24 6,4,90,20,96,24 と出力されるようにしたいのです。 実際のデータや変数名も違いますが、プログラムの構造は同じです。 よろしくおねがいします。

  • バッチファイルについて

    ファイルの中身を抽出するバッチを作成しました。 そのバッチファイルを実行し、test.csvというファイル名をつけて出力できたんですが、出力パスも指定することは可能なんでしょうか? find.bat > test.csv

  • awkで検索し、特定のフィールドを抽出する方法

    UNIX初心者です。 以下のようなデータファイル(AA.dat)から、条件を満たすデータの特定フィールドを別のファイル(BB.dat)に出力したいのです。 どのようにしたら良いのでしょうか? AA.dat(CSV形式) aaa,22,33,44,55,66,77,88,1,1,0,0,1001 bbb,22,33,44,55,66,77,88,1,1,0,0,1002 ccc,22,33,44,55,66,77,88,1,0,0,0,1001 ddd,22,33,44,55,66,77,88,1,1,0,0,1002 抽出条件(フィールド=$1~$13) $9==1 かつ $10==1 かつ $11==0 かつ $12==0 かつ $13==1002 出力するフィールド $1,$2,$4,$7,$8 出力結果 BB.dat(CSV形式) bbb,22,44,77,88 ddd,22,44,77,88

専門家に質問してみよう